packages feed

rzk (empty) → 0.1.0

raw patch · 21 files changed

+7033/−0 lines, 21 filesdep +arraydep +basedep +bifunctorssetup-changed

Dependencies added: array, base, bifunctors, mtl, rzk, template-haskell

Files

+ ChangeLog.md view
@@ -0,0 +1,78 @@+# Changelog for `rzk`++All notable changes to this project will be documented in this file.++The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),+and this project adheres to the+[Haskell Package Versioning Policy](https://pvp.haskell.org/).++## Unreleased++This version was a complete rewrite of the proof assistant, using a new parser, a new internal representation, and a rewrite of the typechecking logic. This is still a prototype, but, arguably, more stable and manageable than version 0.1.0.++### Changes in syntax++Syntax is almost entirely backwards compatible with version 0.1.0.++The only known breaking changes are:++1. Terms like `second x y` which previous have been parsed as `second (x y)`+  now are properly parsed as `(second x) y`.+2. It is now necessary to have at least a minimal indentation in the definition of a term after a newline.+3. Unicode syntax is temporarily disabled, except for dependent sums and arrows in function types.++Otherwise, syntax is now made more flexible:++1. Function parameters can be unnamed: `A -> B` is the same as `(_ : A) -> B`.+2. Angle brackets are now optional: `{t : I | psi t} -> A t [ phi t |-> a t ]`+3. Nullary extension types are possible: `A t [ phi t |-> a t ]`+4. Lambda abstractions can introduce multiple arguments:++```rzk+#def hom : (A : U) -> A -> A -> U+  := \A x y ->+    (t : Δ¹) -> A [ ∂Δ¹ t |-> recOR(t === 0_2, t === 1_2, x, y) ]+```++5. There are now 3 syntactic versions of `refl` with different amount of explicit annotations:+  `refl`, `refl_{x}` and `refl_{x : A}`++6. There are now 2 syntactic versions of identity types (`=`): `x = y` and `x =_{A} y`.++7. `recOR` now supports alternative syntax with an arbitrary number of subshapes:+  `recOR( tope1 |-> term1, tope2 |-> term2, ..., topeN |-> termN )`++8. Now it is possible to have type ascriptions: `t as T`. This can help with ensuring types of subexpressions in parts of formalisations.++9. ++### Simple shape coercions++In some places, shapes (cube indexed tope families) can be used directly:++1. In function parameters: `(Λ -> A) -> (Δ² -> A)` is the same as `({(t, s) : 2 * 2 | Λ (t, s)} -> A) -> ({(t, s) : 2 * 2 | Δ²} -> A)`++2. In parameter types of lambda abstractions: `\((t, s) : Δ²) -> ...` is the same as `\{(t, s) : 2 * 2 | Δ² (t, s)} -> ...`++### Better type inference++1. It is now not required to annotate point variables with tope restrictions, the typechecker is finally smart enough to figure them out from the context.++2. It is now possible to simply write `refl` in most situations.++3. It is now possible to omit the index type in an identity type: `x = y`++### Better output and error message++The output and error messages have been slightly improved, but not in a major way.++### Better internal representation++A new internal representation (a version of second-order abstract syntax)+allows to stop worrying about name captures in substitutions,+so the implementation is much more trustworthy.+The new representation will also allow to bring in higher-order unification in the future, for better type inference, matching, etc.++New representation also allowed annotating each (sub)term with its type to avoid recomputations and some other minor speedups. There are still some performance issues, which need to be debugged, but overall it is much faster than version 0.1.0 already.++## 0.1.0 - YYYY-MM-DD
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Nikolai Kudasov (c) 2023++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Nikolai Kudasov nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,1 @@+# rzk
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ app/Main.hs view
@@ -0,0 +1,6 @@+module Main (main) where++import qualified Rzk.Main++main :: IO ()+main = Rzk.Main.main
+ rzk.cabal view
@@ -0,0 +1,86 @@+cabal-version: 1.12++-- This file has been generated from package.yaml by hpack version 0.35.1.+--+-- see: https://github.com/sol/hpack++name:           rzk+version:        0.1.0+synopsis:       An experimental proof assistant for synthetic ∞-categories+description:    Please see the README on GitHub at <https://github.com/fizruk/rzk#readme>+category:       Dependent Types+homepage:       https://github.com/fizruk/rzk#readme+bug-reports:    https://github.com/fizruk/rzk/issues+author:         Nikolai Kudasov+maintainer:     nickolay.kudasov@gmail.com+copyright:      2023 Nikolai Kudasov+license:        BSD3+license-file:   LICENSE+build-type:     Simple+extra-source-files:+    README.md+    ChangeLog.md++source-repository head+  type: git+  location: https://github.com/fizruk/rzk++library+  exposed-modules:+      Free.Scoped+      Free.Scoped.TH+      Language.Rzk.Free.Syntax+      Language.Rzk.Syntax+      Language.Rzk.Syntax.Abs+      Language.Rzk.Syntax.Layout+      Language.Rzk.Syntax.Lex+      Language.Rzk.Syntax.Par+      Language.Rzk.Syntax.Print+      Rzk+      Rzk.Main+      Rzk.TypeCheck+  other-modules:+      Paths_rzk+  hs-source-dirs:+      src+  ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints+  build-depends:+      array+    , base >=4.7 && <5+    , bifunctors+    , mtl+    , template-haskell+  default-language: Haskell2010++executable rzk+  main-is: Main.hs+  other-modules:+      Paths_rzk+  hs-source-dirs:+      app+  ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N+  build-depends:+      array+    , base >=4.7 && <5+    , bifunctors+    , mtl+    , rzk+    , template-haskell+  default-language: Haskell2010++test-suite rzk-test+  type: exitcode-stdio-1.0+  main-is: Spec.hs+  other-modules:+      Paths_rzk+  hs-source-dirs:+      test+  ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N+  build-depends:+      array+    , base >=4.7 && <5+    , bifunctors+    , mtl+    , rzk+    , template-haskell+  default-language: Haskell2010
+ src/Free/Scoped.hs view
@@ -0,0 +1,117 @@+{-# LANGUAGE DeriveFoldable    #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE QuantifiedConstraints    #-}+{-# LANGUAGE UndecidableInstances    #-}+{-# LANGUAGE DeriveFunctor     #-}+{-# LANGUAGE DeriveGeneric     #-}+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE LambdaCase        #-}+{-# LANGUAGE PatternSynonyms   #-}+{-# LANGUAGE RankNTypes        #-}+{-# LANGUAGE TemplateHaskell   #-}+{-# LANGUAGE TypeOperators     #-}+module Free.Scoped where++import           Control.Monad      (ap)+import           Data.Function      (on)+import           Data.Bifoldable+import           Data.Bifunctor+import           Data.Bifunctor.TH+import           Data.Bitraversable+import qualified GHC.Generics       as GHC++data Inc var = Z | S var+  deriving (Eq, Show, Functor, Foldable, Traversable)++type Scope term var = term (Inc var)++instantiate :: Monad f => f a -> f (Inc a) -> f a+instantiate e f = f >>= g+  where+    g Z     = e+    g (S x) = return x++data FS t a+  = Pure a+  | Free (t (Scope (FS t) a) (FS t a))++deriving instance (Eq a, forall x y. (Eq x, Eq y) => Eq (t x y)) => Eq (FS t a)++instance Bifunctor t => Functor (FS t) where+  fmap f (Pure x) = Pure (f x)+  fmap f (Free t) = Free+    (bimap (fmap (fmap f)) (fmap f) t)++instance Bifoldable t => Foldable (FS t) where+  foldMap f (Pure x) = f x+  foldMap f (Free t) = bifoldMap (foldMap (foldMap f)) (foldMap f) t++instance Bitraversable t => Traversable (FS t) where+  traverse f (Pure x) = Pure <$> f x+  traverse f (Free t) = Free <$>+    bitraverse (traverse (traverse f)) (traverse f) t++instance Bifunctor t => Applicative (FS t) where+  pure = Pure+  (<*>) = ap++instance Bifunctor t => Monad (FS t) where+  return = pure+  Pure x >>= f = f x+  Free t >>= f = Free+    (bimap ((>>= traverse f)) (>>= f) t)++data Sum f g scope term+  = InL (f scope term)+  | InR (g scope term)+  deriving (Functor, Foldable, Traversable, GHC.Generic)+deriveBifunctor ''Sum+deriveBifoldable ''Sum+deriveBitraversable ''Sum++type (:+:) = Sum++data Empty scope term+  deriving (Functor, Foldable, Traversable)+deriveBifunctor ''Empty+deriveBifoldable ''Empty+deriveBitraversable ''Empty++data AnnF ann term scope typedTerm = AnnF+  { annF :: ann typedTerm+  , termF :: term scope typedTerm+  } deriving (Show, Functor)++-- | Important: does not compare the `annF` component!+instance Eq (term scope typedTerm) => Eq (AnnF ann term scope typedTerm) where+  (==) = (==) `on` termF++instance (Functor ann, Bifunctor term) => Bifunctor (AnnF ann term) where+  bimap f g (AnnF t x) = AnnF (fmap g t) (bimap f g x)++-- | Important: does not fold over the 'annF' component!+instance Bifoldable term => Bifoldable (AnnF ann term) where+  bifoldMap f g (AnnF _ty x) = {- g ty <> -} bifoldMap f g x++instance (Traversable ann, Bitraversable term) => Bitraversable (AnnF ann term) where+  bitraverse f g (AnnF t x) = AnnF <$> traverse g t <*> bitraverse f g x++transFS+  :: (Bifunctor term)+  => (forall s t. term s t -> term' s t)+  -> FS term a -> FS term' a+transFS phi = \case+  Pure x -> Pure x+  Free t -> Free (phi (bimap (transFS phi) (transFS phi) t))++untyped :: (Functor ann, Bifunctor term) => FS (AnnF ann term) a -> FS term a+untyped = transFS termF++pattern ExtE :: ext (Scope (FS (t :+: ext)) a) (FS (t :+: ext) a) -> FS (t :+: ext) a+pattern ExtE t = Free (InR t)++substitute :: Bifunctor t => FS t a -> Scope (FS t) a -> FS t a+substitute t = (>>= f)+  where+    f Z = t+    f (S y) = Pure y
+ src/Free/Scoped/TH.hs view
@@ -0,0 +1,120 @@+{-# LANGUAGE CPP      #-}+{-# LANGUAGE LambdaCase      #-}+{-# LANGUAGE TemplateHaskell #-}+module Free.Scoped.TH where++import           Control.Monad         (replicateM)+import           Language.Haskell.TH+import           Free.Scoped++mkConP :: Name -> [Pat] -> Pat+#if __GLASGOW_HASKELL__ >= 902+mkConP name pats = ConP name [] pats+#else+mkConP name pats = ConP name pats+#endif++makePatternsAll :: Name -> Q [Dec]+makePatternsAll ty = do+  TyConI tyCon <- reify ty+  case tyCon of+    DataD _ _ _ _ cs _ -> concat <$> do+      xs <- mapM makePatternFor cs+      xs' <- makeCompletePragma cs+      ys <- mapM makePatternEFor cs+      ys' <- makeCompletePragmaE cs+      zs <- mapM makePatternTFor cs+      zs' <- makeCompletePragmaT cs+      ws <- mapM makePatternTEFor cs+      ws' <- makeCompletePragmaTE cs+      return (xs ++ [xs'] ++ ys ++ [ys'] ++ zs ++ [zs'] ++ ws ++ [ws'])++    _                  -> fail "Can only make patterns for data types."+++makeCompletePragma :: [Con] -> Q [Dec]+makeCompletePragma cs = do+  DataConI varName _ _ <- reify 'Pure+  let names = [mkName (removeF (nameBase name)) | NormalC name _ <- cs]+  return [PragmaD (CompleteP (varName : names) Nothing)]+  where+    removeF s = take (length s - 1) s++makeCompletePragmaE :: [Con] -> Q [Dec]+makeCompletePragmaE cs = do+  DataConI varName _ _ <- reify 'Pure+  PatSynI extName _ <- reify 'ExtE+  let names = [mkName (removeF (nameBase name)) | NormalC name _ <- cs]+  return [PragmaD (CompleteP (varName : extName : names) Nothing)]+  where+    removeF s = take (length s - 1) s <> "E"++makeCompletePragmaT :: [Con] -> Q [Dec]+makeCompletePragmaT cs = do+  DataConI varName _ _ <- reify 'Pure+  let names = [mkName (removeF (nameBase name)) | NormalC name _ <- cs]+  return [PragmaD (CompleteP (varName : names) Nothing)]+  where+    removeF s = take (length s - 1) s <> "T"++makeCompletePragmaTE :: [Con] -> Q [Dec]+makeCompletePragmaTE cs = do+  DataConI varName _ _ <- reify 'Pure+  let names = [mkName (removeF (nameBase name)) | NormalC name _ <- cs]+  return [PragmaD (CompleteP (varName : names) Nothing)]+  where+    removeF s = take (length s - 1) s <> "TE"++makePatternFor :: Con -> Q [Dec]+makePatternFor = \case+  NormalC name xs -> do+    args <- replicateM (length xs) (newName "x")+    let patName = mkName (removeF (nameBase name))+        patArgs = PrefixPatSyn args+        dir = ImplBidir+    pat <- [p| Free $(pure (mkConP name (VarP <$> args))) |]+    return [PatSynD patName patArgs dir pat]+  _ -> fail "Can only make patterns for NormalC constructors"+  where+    removeF s = take (length s - 1) s++makePatternEFor :: Con -> Q [Dec]+makePatternEFor = \case+  NormalC name xs -> do+    args <- replicateM (length xs) (newName "x")+    let patName = mkName (removeF (nameBase name))+        patArgs = PrefixPatSyn args+        dir = ImplBidir+    pat <- [p| Free (InL $(pure (mkConP name (VarP <$> args)))) |]+    return [PatSynD patName patArgs dir pat]+  _ -> fail "Can only make patterns for NormalC constructors"+  where+    removeF s = take (length s - 1) s <> "E"++makePatternTFor :: Con -> Q [Dec]+makePatternTFor = \case+  NormalC name xs -> do+    t <- newName "type_"+    args <- replicateM (length xs) (newName "x")+    let patName = mkName (removeF (nameBase name))+        patArgs = PrefixPatSyn (t : args)+        dir = ImplBidir+    pat <- [p| Free (AnnF $(pure (VarP t)) $(pure (mkConP name (VarP <$> args)))) |]+    return [PatSynD patName patArgs dir pat]+  _ -> fail "Can only make patterns for NormalC constructors"+  where+    removeF s = take (length s - 1) s <> "T"++makePatternTEFor :: Con -> Q [Dec]+makePatternTEFor = \case+  NormalC name xs -> do+    t <- newName "type_"+    args <- replicateM (length xs) (newName "x")+    let patName = mkName (removeF (nameBase name))+        patArgs = PrefixPatSyn (t : args)+        dir = ImplBidir+    pat <- [p| Free (InL (AnnF $(pure (VarP t)) $(pure (mkConP name (VarP <$> args))))) |]+    return [PatSynD patName patArgs dir pat]+  _ -> fail "Can only make patterns for NormalC constructors"+  where+    removeF s = take (length s - 1) s <> "TE"
+ src/Language/Rzk/Free/Syntax.hs view
@@ -0,0 +1,300 @@+{-# OPTIONS_GHC -fno-warn-missing-pattern-synonym-signatures -fno-warn-missing-signatures -fno-warn-type-defaults #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE DeriveFoldable #-}+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE TypeSynonymInstances    #-}+{-# LANGUAGE FlexibleInstances    #-}+module Language.Rzk.Free.Syntax where++import Data.String+import Data.Char (chr, ord)+import Data.Coerce+import Data.List ((\\))+import Data.Bifunctor.TH++import Free.Scoped+import Free.Scoped.TH++import qualified Language.Rzk.Syntax as Rzk++data TermF scope term+    = UniverseF+    | UniverseCubeF+    | UniverseTopeF+    | CubeUnitF+    | CubeUnitStarF+    | Cube2F+    | Cube2_0F+    | Cube2_1F+    | CubeProductF term term+    | TopeTopF+    | TopeBottomF+    | TopeEQF term term+    | TopeLEQF term term+    | TopeAndF term term+    | TopeOrF term term+    | RecBottomF+    | RecOrF [(term, term)]+    | TypeFunF (Maybe Rzk.VarIdent) term (Maybe scope) scope+    | TypeSigmaF (Maybe Rzk.VarIdent) term scope+    | TypeIdF term (Maybe term) term+    | AppF term term+    | LambdaF (Maybe Rzk.VarIdent) (Maybe (term, Maybe scope)) scope+    | PairF term term+    | FirstF term+    | SecondF term+    | ReflF (Maybe (term, Maybe term))+    | IdJF term term term term term term+    | TypeAscF term term+    | TypeRestrictedF term [(term, term)]+    deriving (Eq)+deriveBifunctor ''TermF+deriveBifoldable ''TermF+deriveBitraversable ''TermF+makePatternsAll ''TermF   -- declare all patterns using Template Haskell++newtype Type term = Type { getType :: term }+  deriving (Eq, Functor, Foldable, Traversable)++data TypeInfo term = TypeInfo+  { infoType :: term+  , infoWHNF :: Maybe term+  , infoNF   :: Maybe term+  } deriving (Eq, Functor, Foldable, Traversable)++type Term = FS TermF+type TermT = FS (AnnF TypeInfo TermF)++termIsWHNF :: TermT var -> TermT var+termIsWHNF t@Pure{} = t+termIsWHNF (Free (AnnF info f)) = t'+  where+    t' = Free (AnnF info { infoWHNF = Just t' } f)++termIsNF :: TermT var -> TermT var+termIsNF t@Pure{} = t+termIsNF (Free (AnnF info f)) = t'+  where+    t' = Free (AnnF info { infoWHNF = Just t', infoNF = Just t' } f)++invalidateWHNF :: TermT var -> TermT var+invalidateWHNF = transFS $ \(AnnF info f) ->+  AnnF info { infoWHNF = Nothing, infoNF = Nothing } f++substituteT :: TermT var -> Scope TermT var -> TermT var+substituteT x = substitute x . invalidateWHNF++type Term' = Term Rzk.VarIdent+type TermT' = TermT Rzk.VarIdent++freeVars :: Term a -> [a]+freeVars = foldMap pure++toTerm' :: Rzk.Term -> Term'+toTerm' = toTerm Pure++toScope :: Rzk.VarIdent -> (Rzk.VarIdent -> Term a) -> Rzk.Term -> Scope Term a+toScope x bvars = toTerm $ \z -> if x == z then Pure Z else S <$> bvars z++toScopePattern :: Rzk.Pattern -> (Rzk.VarIdent -> Term a) -> Rzk.Term -> Scope Term a+toScopePattern pat bvars = toTerm $ \z ->+  case lookup z (bindings pat (Pure Z)) of+    Just t -> t+    Nothing -> S <$> bvars z+  where+    bindings (Rzk.PatternWildcard _loc)   _ = []+    bindings (Rzk.PatternVar _loc x)    t = [(x, t)]+    bindings (Rzk.PatternPair _loc l r) t = bindings l (First t) <> bindings r (Second t)++toTerm :: (Rzk.VarIdent -> Term a) -> Rzk.Term -> Term a+toTerm bvars = go+  where+    go = \case+      Rzk.Var _loc x -> bvars x+      Rzk.Universe _loc -> Universe++      Rzk.UniverseCube _loc -> UniverseCube+      Rzk.UniverseTope _loc -> UniverseTope+      Rzk.CubeUnit _loc -> CubeUnit+      Rzk.CubeUnitStar _loc -> CubeUnitStar+      Rzk.Cube2 _loc -> Cube2+      Rzk.Cube2_0 _loc -> Cube2_0+      Rzk.Cube2_1 _loc -> Cube2_1+      Rzk.CubeProduct _loc l r -> CubeProduct (go l) (go r)+      Rzk.TopeTop _loc -> TopeTop+      Rzk.TopeBottom _loc -> TopeBottom+      Rzk.TopeEQ _loc l r -> TopeEQ (go l) (go r)+      Rzk.TopeLEQ _loc l r -> TopeLEQ (go l) (go r)+      Rzk.TopeAnd _loc l r -> TopeAnd (go l) (go r)+      Rzk.TopeOr _loc l r -> TopeOr (go l) (go r)+      Rzk.RecBottom _loc -> RecBottom+      Rzk.RecOr _loc rs -> RecOr [ (go tope, go term) | Rzk.Restriction _loc tope term <- rs ]+      Rzk.TypeId _loc x tA y -> TypeId (go x) (Just (go tA)) (go y)+      Rzk.TypeIdSimple _loc x y -> TypeId (go x) Nothing (go y)+      Rzk.App _loc f x -> App (go f) (go x)+      Rzk.Pair _loc l r -> Pair (go l) (go r)+      Rzk.First _loc term -> First (go term)+      Rzk.Second _loc term -> Second (go term)+      Rzk.Refl _loc -> Refl Nothing+      Rzk.ReflTerm _loc term -> Refl (Just (go term, Nothing))+      Rzk.ReflTermType _loc x tA -> Refl (Just (go x, Just (go tA)))+      Rzk.IdJ _loc a b c d e f -> IdJ (go a) (go b) (go c) (go d) (go e) (go f)+      Rzk.TypeAsc _loc x t -> TypeAsc (go x) (go t)++      Rzk.TypeFun _loc (Rzk.ParamVarType _ pat arg) ret ->+        TypeFun (patternVar pat) (go arg) Nothing (toScopePattern pat bvars ret)+      Rzk.TypeFun _loc (Rzk.ParamVarShape _ pat cube tope) ret ->+        TypeFun (patternVar pat) (go cube) (Just (toScopePattern pat bvars tope)) (toScopePattern pat bvars ret)+      Rzk.TypeFun _loc (Rzk.ParamWildcardType _ arg) ret ->+        TypeFun Nothing (go arg) Nothing (toTerm (fmap S <$> bvars) ret)+      Rzk.TypeFun _loc (Rzk.ParamType _ arg) ret ->+        TypeFun Nothing (go arg) Nothing (toTerm (fmap S <$> bvars) ret)++      Rzk.TypeSigma _loc pat tA tB ->+        TypeSigma (patternVar pat) (go tA) (toScopePattern pat bvars tB)++      Rzk.Lambda _loc [] body -> go body+      Rzk.Lambda _loc (Rzk.ParamPattern _ pat : params) body ->+        Lambda (patternVar pat) Nothing (toScopePattern pat bvars (Rzk.Lambda _loc params body))+      Rzk.Lambda _loc (Rzk.ParamPatternType _ [] _ty : params) body ->+        go (Rzk.Lambda _loc params body)+      Rzk.Lambda _loc (Rzk.ParamPatternType _ (pat:pats) ty : params) body ->+        Lambda (patternVar pat) (Just (go ty, Nothing))+          (toScopePattern pat bvars (Rzk.Lambda _loc (Rzk.ParamPatternType _loc pats ty : params) body))+      Rzk.Lambda _loc (Rzk.ParamPatternShape _ pat cube tope : params) body ->+        Lambda (patternVar pat) (Just (go cube, Just (toScopePattern pat bvars tope)))+          (toScopePattern pat bvars (Rzk.Lambda _loc params body))++      Rzk.TypeRestricted _loc ty rs ->+        TypeRestricted (go ty) (map (\(Rzk.Restriction _loc tope term) -> (go tope, go term)) rs)++      Rzk.Hole _loc _ident -> error "holes are not supported"+++    patternVar (Rzk.PatternVar _loc x) = Just x+    patternVar _ = Nothing++fromTerm' :: Term' -> Rzk.Term+fromTerm' t = fromTermWith' vars (defaultVarIdents \\ vars) t+  where vars = freeVars t++fromScope' :: Rzk.VarIdent -> [Rzk.VarIdent] -> [Rzk.VarIdent] -> Scope Term Rzk.VarIdent -> Rzk.Term+fromScope' x used xs = fromTermWith' (x : used) xs . (>>= f)+  where+    f Z = Pure x+    f (S z) = Pure z++fromTermWith' :: [Rzk.VarIdent] -> [Rzk.VarIdent] -> Term' -> Rzk.Term+fromTermWith' used vars = go+  where+    withFresh Nothing f =+      case vars of+        x:xs -> f (x, xs)+        _ -> error "not enough fresh variables!"+    withFresh (Just z) f = f (z', filter (/= z') vars)    -- FIXME: very inefficient filter+      where+        z' = refreshVar used z++    loc = Nothing+    go = \case+      Pure z -> Rzk.Var loc z++      Universe -> Rzk.Universe loc+      UniverseCube -> Rzk.UniverseCube loc+      UniverseTope -> Rzk.UniverseTope loc+      CubeUnit -> Rzk.CubeUnit loc+      CubeUnitStar -> Rzk.CubeUnitStar loc+      Cube2 -> Rzk.Cube2 loc+      Cube2_0 -> Rzk.Cube2_0 loc+      Cube2_1 -> Rzk.Cube2_1 loc+      CubeProduct l r -> Rzk.CubeProduct loc (go l) (go r)+      TopeTop -> Rzk.TopeTop loc+      TopeBottom -> Rzk.TopeBottom loc+      TopeEQ l r -> Rzk.TopeEQ loc (go l) (go r)+      TopeLEQ l r -> Rzk.TopeLEQ loc (go l) (go r)+      TopeAnd l r -> Rzk.TopeAnd loc (go l) (go r)+      TopeOr l r -> Rzk.TopeOr loc (go l) (go r)+      RecBottom -> Rzk.RecBottom loc+      RecOr rs -> Rzk.RecOr loc [ Rzk.Restriction loc (go tope) (go term) | (tope, term) <- rs ]++      TypeFun z arg Nothing ret -> withFresh z $ \(x, xs) ->+        Rzk.TypeFun loc (Rzk.ParamVarType loc (Rzk.PatternVar loc x) (go arg)) (fromScope' x used xs ret)+      TypeFun z arg (Just tope) ret -> withFresh z $ \(x, xs) ->+        Rzk.TypeFun loc (Rzk.ParamVarShape loc (Rzk.PatternVar loc x) (go arg) (fromScope' x used xs tope)) (fromScope' x used xs ret)++      TypeSigma z a b -> withFresh z $ \(x, xs) ->+        Rzk.TypeSigma loc (Rzk.PatternVar loc x) (go a) (fromScope' x used xs b)+      TypeId l (Just tA) r -> Rzk.TypeId loc (go l) (go tA) (go r)+      TypeId l Nothing r -> Rzk.TypeIdSimple loc (go l) (go r)+      App l r -> Rzk.App loc (go l) (go r)++      Lambda z Nothing scope -> withFresh z $ \(x, xs) ->+        Rzk.Lambda loc [Rzk.ParamPattern loc (Rzk.PatternVar loc x)] (fromScope' x used xs scope)+      Lambda z (Just (ty, Nothing)) scope -> withFresh z $ \(x, xs) ->+        Rzk.Lambda loc [Rzk.ParamPatternType loc [Rzk.PatternVar loc x] (go ty)] (fromScope' x used xs scope)+      Lambda z (Just (cube, Just tope)) scope -> withFresh z $ \(x, xs) ->+        Rzk.Lambda loc [Rzk.ParamPatternShape loc (Rzk.PatternVar loc x) (go cube) (fromScope' x used xs tope)] (fromScope' x used xs scope)+      -- Lambda (Maybe (term, Maybe scope)) scope -> Rzk.Lambda loc (Maybe (term, Maybe scope)) scope++      Pair l r -> Rzk.Pair loc (go l) (go r)+      First term -> Rzk.First loc (go term)+      Second term -> Rzk.Second loc (go term)+      Refl Nothing -> Rzk.Refl loc+      Refl (Just (t, Nothing)) -> Rzk.ReflTerm loc (go t)+      Refl (Just (t, Just ty)) -> Rzk.ReflTermType loc (go t) (go ty)+      IdJ a b c d e f -> Rzk.IdJ loc (go a) (go b) (go c) (go d) (go e) (go f)+      TypeAsc l r -> Rzk.TypeAsc loc (go l) (go r)+      TypeRestricted ty rs ->+        Rzk.TypeRestricted loc (go ty) (map (\(tope, term) -> (Rzk.Restriction loc (go tope) (go term))) rs)++defaultVarIdents :: [Rzk.VarIdent]+defaultVarIdents = coerce [ "x" <> map digitToSub (show n) | n <- [1..] ]+  where+    digitToSub c = chr ((ord c - ord '0') + ord '₀')++-- | Given a list of used variable names in the current context,+-- generate a unique fresh name based on a given one.+--+-- >>> refreshVar ["x", "y", "x₁", "z"] "x"+-- x₂+refreshVar :: [Rzk.VarIdent] -> Rzk.VarIdent -> Rzk.VarIdent+refreshVar vars x+  | x `elem` vars = refreshVar vars (coerce incIndex x)+  | otherwise     = x++-- | Increment the subscript number at the end of the indentifier.+--+-- >>> incIndex "x"+-- x₁+-- >>> incIndex "x₁₉"+-- x₂₀+incIndex :: String -> String+incIndex s = name <> newIndex+  where+    digitsSub = "₀₁₂₃₄₅₆₇₈₉" :: String+    isDigitSub = (`elem` digitsSub)+    digitFromSub c = chr ((ord c - ord '₀') + ord '0')+    digitToSub c = chr ((ord c - ord '0') + ord '₀')+    (name, index) = break isDigitSub s+    oldIndexN = read ('0' : map digitFromSub index) -- FIXME: read+    newIndex = map digitToSub (show (oldIndexN + 1))++instance Show Term' where+  show = Rzk.printTree . fromTerm'++instance IsString Term' where+  fromString = toTerm' . fromRight . Rzk.parseTerm+    where+      fromRight (Left err) = error ("Parse error: " <> err)+      fromRight (Right t) = t++instance Show TermT' where+  show var@Pure{} = Rzk.printTree (fromTerm' (untyped var))+  show term@(Free (AnnF TypeInfo{..} _)) = termStr <> " : " <> typeStr+    where+      termStr = Rzk.printTree (fromTerm' (untyped term))+      typeStr = Rzk.printTree (fromTerm' (untyped infoType))
+ src/Language/Rzk/Syntax.hs view
@@ -0,0 +1,60 @@+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE OverloadedStrings #-}+module Language.Rzk.Syntax (+  module Language.Rzk.Syntax.Abs,++  parseModule,+  parseModuleRzk,+  parseModuleFile,+  parseTerm,+  printTree,+  tryExtractMarkdownCodeBlocks,+  extractMarkdownCodeBlocks,+) where++import qualified Data.List as List+import Data.Char (isSpace)++import Language.Rzk.Syntax.Abs+import Language.Rzk.Syntax.Print (printTree)++import Language.Rzk.Syntax.Lex (tokens)+import Language.Rzk.Syntax.Par (pModule, pTerm)+import Language.Rzk.Syntax.Layout (resolveLayout)++parseModule :: String -> Either String Module+parseModule = pModule . resolveLayout True . tokens . tryExtractMarkdownCodeBlocks "rzk"++parseModuleRzk :: String -> Either String Module+parseModuleRzk = pModule . resolveLayout True . tokens++parseModuleFile :: FilePath -> IO (Either String Module)+parseModuleFile path = do+  parseModule <$> readFile path++parseTerm :: String -> Either String Term+parseTerm = pTerm . tokens++tryExtractMarkdownCodeBlocks :: String -> String -> String+tryExtractMarkdownCodeBlocks alias input+  | ("```" <> alias <> "\n") `List.isInfixOf` input = extractMarkdownCodeBlocks alias input+  | otherwise = input++-- | Extract rzk code from a Markdown file+--+-- >>> putStrLn $ detectMarkdownCodeBlocks "\n```rzk\n#lang rzk-1\n```\nasd asd\n```rzk\n#def x : U\n  := U\n``` asda"+-- #lang rzk-1+-- #def x : U+--   := U+extractMarkdownCodeBlocks :: String -> String -> String+extractMarkdownCodeBlocks alias = unlines . blankNonCode True . map trim . lines+  where+    blankNonCode _toBlank [] = []+    blankNonCode True (line : lines_)+      | line == "```" <> alias  = "" : blankNonCode False lines_+      | otherwise               = "" : blankNonCode True  lines_+    blankNonCode False (line : lines_)+      | line == "```"           = "" : blankNonCode True lines_+      | otherwise               = line : blankNonCode False lines_++    trim = List.dropWhileEnd isSpace
+ src/Language/Rzk/Syntax/Abs.hs view
@@ -0,0 +1,251 @@+-- File generated by the BNF Converter (bnfc 2.9.4.1).++{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE PatternSynonyms #-}++-- | The abstract syntax of language Syntax.++module Language.Rzk.Syntax.Abs where++import Prelude (String)+import qualified Prelude as C+  ( Eq, Ord, Show, Read+  , Functor, Foldable, Traversable+  , Int, Maybe(..)+  )+import qualified Data.String++import qualified Data.Data    as C (Data, Typeable)+import qualified GHC.Generics as C (Generic)++type Module = Module' BNFC'Position+data Module' a = Module a (LanguageDecl' a) [Command' a]+  deriving (C.Eq, C.Ord, C.Show, C.Read, C.Functor, C.Foldable, C.Traversable, C.Data, C.Typeable, C.Generic)++type LanguageDecl = LanguageDecl' BNFC'Position+data LanguageDecl' a = LanguageDecl a (Language' a)+  deriving (C.Eq, C.Ord, C.Show, C.Read, C.Functor, C.Foldable, C.Traversable, C.Data, C.Typeable, C.Generic)++type Language = Language' BNFC'Position+data Language' a = Rzk1 a | Rzk2 a+  deriving (C.Eq, C.Ord, C.Show, C.Read, C.Functor, C.Foldable, C.Traversable, C.Data, C.Typeable, C.Generic)++type Command = Command' BNFC'Position+data Command' a+    = CommandSetOption a String String+    | CommandUnsetOption a String+    | CommandCheck a (Term' a) (Term' a)+    | CommandCompute a (Term' a)+    | CommandComputeWHNF a (Term' a)+    | CommandComputeNF a (Term' a)+    | CommandPostulate a VarIdent [Param' a] (Term' a)+    | CommandDefine a VarIdent [Param' a] (Term' a) (Term' a)+  deriving (C.Eq, C.Ord, C.Show, C.Read, C.Functor, C.Foldable, C.Traversable, C.Data, C.Typeable, C.Generic)++type Pattern = Pattern' BNFC'Position+data Pattern' a+    = PatternWildcard a+    | PatternVar a VarIdent+    | PatternPair a (Pattern' a) (Pattern' a)+  deriving (C.Eq, C.Ord, C.Show, C.Read, C.Functor, C.Foldable, C.Traversable, C.Data, C.Typeable, C.Generic)++type Param = Param' BNFC'Position+data Param' a+    = ParamPattern a (Pattern' a)+    | ParamPatternType a [Pattern' a] (Term' a)+    | ParamPatternShape a (Pattern' a) (Term' a) (Term' a)+  deriving (C.Eq, C.Ord, C.Show, C.Read, C.Functor, C.Foldable, C.Traversable, C.Data, C.Typeable, C.Generic)++type ParamDecl = ParamDecl' BNFC'Position+data ParamDecl' a+    = ParamType a (Term' a)+    | ParamWildcardType a (Term' a)+    | ParamVarType a (Pattern' a) (Term' a)+    | ParamVarShape a (Pattern' a) (Term' a) (Term' a)+  deriving (C.Eq, C.Ord, C.Show, C.Read, C.Functor, C.Foldable, C.Traversable, C.Data, C.Typeable, C.Generic)++type Restriction = Restriction' BNFC'Position+data Restriction' a = Restriction a (Term' a) (Term' a)+  deriving (C.Eq, C.Ord, C.Show, C.Read, C.Functor, C.Foldable, C.Traversable, C.Data, C.Typeable, C.Generic)++type Term = Term' BNFC'Position+data Term' a+    = Universe a+    | UniverseCube a+    | UniverseTope a+    | CubeUnit a+    | CubeUnitStar a+    | Cube2 a+    | Cube2_0 a+    | Cube2_1 a+    | CubeProduct a (Term' a) (Term' a)+    | TopeTop a+    | TopeBottom a+    | TopeEQ a (Term' a) (Term' a)+    | TopeLEQ a (Term' a) (Term' a)+    | TopeAnd a (Term' a) (Term' a)+    | TopeOr a (Term' a) (Term' a)+    | RecBottom a+    | RecOr a [Restriction' a]+    | TypeFun a (ParamDecl' a) (Term' a)+    | TypeSigma a (Pattern' a) (Term' a) (Term' a)+    | TypeId a (Term' a) (Term' a) (Term' a)+    | TypeIdSimple a (Term' a) (Term' a)+    | TypeRestricted a (Term' a) [Restriction' a]+    | App a (Term' a) (Term' a)+    | Lambda a [Param' a] (Term' a)+    | Pair a (Term' a) (Term' a)+    | First a (Term' a)+    | Second a (Term' a)+    | Refl a+    | ReflTerm a (Term' a)+    | ReflTermType a (Term' a) (Term' a)+    | IdJ a (Term' a) (Term' a) (Term' a) (Term' a) (Term' a) (Term' a)+    | Hole a HoleIdent+    | Var a VarIdent+    | TypeAsc a (Term' a) (Term' a)+  deriving (C.Eq, C.Ord, C.Show, C.Read, C.Functor, C.Foldable, C.Traversable, C.Data, C.Typeable, C.Generic)++commandPostulateNoParams :: a -> VarIdent -> Term' a -> Command' a+commandPostulateNoParams = \ _a x ty -> CommandPostulate _a x [] ty++commandDefineNoParams :: a -> VarIdent -> Term' a -> Term' a -> Command' a+commandDefineNoParams = \ _a x ty term -> CommandDefine _a x [] ty term++commandDef :: a -> VarIdent -> [Param' a] -> Term' a -> Term' a -> Command' a+commandDef = \ _a x params ty term -> CommandDefine _a x params ty term++commandDefNoParams :: a -> VarIdent -> Term' a -> Term' a -> Command' a+commandDefNoParams = \ _a x ty term -> CommandDefine _a x [] ty term++paramVarType :: a -> VarIdent -> Term' a -> ParamDecl' a+paramVarType = \ _a var cube -> ParamVarType _a (PatternVar _a var) cube++paramVarShape :: a -> Pattern' a -> Term' a -> Term' a -> ParamDecl' a+paramVarShape = \ _a pat cube tope -> ParamVarShape _a pat cube tope++recOr :: a -> Term' a -> Term' a -> Term' a -> Term' a -> Term' a+recOr = \ _a psi phi a b -> RecOr _a [Restriction _a psi a, Restriction _a phi b]++typeExtension :: a -> ParamDecl' a -> Term' a -> Term' a+typeExtension = \ _a param ret -> TypeFun _a param ret++unicode_TypeFun :: a -> ParamDecl' a -> Term' a -> Term' a+unicode_TypeFun = \ _a arg ret -> TypeFun _a arg ret++unicode_TypeSigma :: a -> Pattern' a -> Term' a -> Term' a -> Term' a+unicode_TypeSigma = \ _a pat fst snd -> TypeSigma _a pat fst snd++unicode_TypeSigmaAlt :: a -> Pattern' a -> Term' a -> Term' a -> Term' a+unicode_TypeSigmaAlt = \ _a pat fst snd -> TypeSigma _a pat fst snd++newtype VarIdent = VarIdent String+  deriving (C.Eq, C.Ord, C.Show, C.Read, C.Data, C.Typeable, C.Generic, Data.String.IsString)++newtype HoleIdent = HoleIdent String+  deriving (C.Eq, C.Ord, C.Show, C.Read, C.Data, C.Typeable, C.Generic, Data.String.IsString)++-- | Start position (line, column) of something.++type BNFC'Position = C.Maybe (C.Int, C.Int)++pattern BNFC'NoPosition :: BNFC'Position+pattern BNFC'NoPosition = C.Nothing++pattern BNFC'Position :: C.Int -> C.Int -> BNFC'Position+pattern BNFC'Position line col = C.Just (line, col)++-- | Get the start position of something.++class HasPosition a where+  hasPosition :: a -> BNFC'Position++instance HasPosition Module where+  hasPosition = \case+    Module p _ _ -> p++instance HasPosition LanguageDecl where+  hasPosition = \case+    LanguageDecl p _ -> p++instance HasPosition Language where+  hasPosition = \case+    Rzk1 p -> p+    Rzk2 p -> p++instance HasPosition Command where+  hasPosition = \case+    CommandSetOption p _ _ -> p+    CommandUnsetOption p _ -> p+    CommandCheck p _ _ -> p+    CommandCompute p _ -> p+    CommandComputeWHNF p _ -> p+    CommandComputeNF p _ -> p+    CommandPostulate p _ _ _ -> p+    CommandDefine p _ _ _ _ -> p++instance HasPosition Pattern where+  hasPosition = \case+    PatternWildcard p -> p+    PatternVar p _ -> p+    PatternPair p _ _ -> p++instance HasPosition Param where+  hasPosition = \case+    ParamPattern p _ -> p+    ParamPatternType p _ _ -> p+    ParamPatternShape p _ _ _ -> p++instance HasPosition ParamDecl where+  hasPosition = \case+    ParamType p _ -> p+    ParamWildcardType p _ -> p+    ParamVarType p _ _ -> p+    ParamVarShape p _ _ _ -> p++instance HasPosition Restriction where+  hasPosition = \case+    Restriction p _ _ -> p++instance HasPosition Term where+  hasPosition = \case+    Universe p -> p+    UniverseCube p -> p+    UniverseTope p -> p+    CubeUnit p -> p+    CubeUnitStar p -> p+    Cube2 p -> p+    Cube2_0 p -> p+    Cube2_1 p -> p+    CubeProduct p _ _ -> p+    TopeTop p -> p+    TopeBottom p -> p+    TopeEQ p _ _ -> p+    TopeLEQ p _ _ -> p+    TopeAnd p _ _ -> p+    TopeOr p _ _ -> p+    RecBottom p -> p+    RecOr p _ -> p+    TypeFun p _ _ -> p+    TypeSigma p _ _ _ -> p+    TypeId p _ _ _ -> p+    TypeIdSimple p _ _ -> p+    TypeRestricted p _ _ -> p+    App p _ _ -> p+    Lambda p _ _ -> p+    Pair p _ _ -> p+    First p _ -> p+    Second p _ -> p+    Refl p -> p+    ReflTerm p _ -> p+    ReflTermType p _ _ -> p+    IdJ p _ _ _ _ _ _ -> p+    Hole p _ -> p+    Var p _ -> p+    TypeAsc p _ _ -> p+
+ src/Language/Rzk/Syntax/Layout.hs view
@@ -0,0 +1,335 @@+-- File generated by the BNF Converter (bnfc 2.9.4.1).++{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}++{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE OverloadedStrings #-}++module Language.Rzk.Syntax.Layout where++import Prelude+import Data.Maybe ( fromMaybe, listToMaybe, mapMaybe )+import qualified Data.List as List++import Language.Rzk.Syntax.Lex+  ( Posn(..), Tok(..), Token(..), TokSymbol(..)+  , prToken, tokenLineCol, tokenPos, tokenPosn+  )++-- local parameters++data LayoutDelimiters+  = LayoutDelimiters+    { delimSep   :: TokSymbol+    , delimOpen  :: Maybe TokSymbol  -- ^ Nothing for toplevel layout.+    , delimClose :: Maybe TokSymbol  -- ^ Nothing for toplevel layout.+    }++layoutWords :: [(TokSymbol, LayoutDelimiters)]+layoutWords = []++layoutStopWords :: [TokSymbol]+layoutStopWords = []++-- layout separators++layoutOpen, layoutClose, layoutSep :: [TokSymbol]+layoutOpen  = List.nub $ mapMaybe (delimOpen  . snd) layoutWords+layoutClose = List.nub $ mapMaybe (delimClose . snd) layoutWords+layoutSep   = List.nub $ TokSymbol ";" 24 : map (delimSep . snd) layoutWords++parenOpen, parenClose :: [TokSymbol]+parenOpen  =+  [ TokSymbol "(" 11+  , TokSymbol "[" 37+  ]+parenClose =+  [ TokSymbol ")" 12+  , TokSymbol "]" 40+  ]++-- | Report an error during layout resolution.+layoutError+   :: [Token]  -- ^ Remaining tokens.+   -> String   -- ^ Error message.+   -> a+layoutError ts msg+  | null ts   = error $ concat [ "Layout error: ", msg, "." ]+  | otherwise = error $ unlines+      [ concat [ "Layout error at ", tokenPos ts, ": ", msg, "." ]+      , unwords $ concat+         [ [ "Remaining tokens:" ]+         , map prToken $ take 10 ts+         , [ "..." | not $ null $ drop 10 ts ]+         ]+      ]++-- | Replace layout syntax with explicit layout tokens.+resolveLayout+  :: Bool      -- ^ Whether to use top-level layout.+  -> [Token]   -- ^ Token stream before layout resolution.+  -> [Token]   -- ^ Token stream after layout resolution.+resolveLayout topLayout =+  res Nothing [if topLayout then Implicit topDelim Definitive 1 else Explicit]+  where+  topDelim :: LayoutDelimiters+  topDelim = LayoutDelimiters (TokSymbol ";" 24) Nothing Nothing++  res :: Maybe Token -- ^ The previous token, if any.+      -> [Block]     -- ^ A stack of layout blocks.+      -> [Token] -> [Token]++  -- The stack should never be empty.+  res _ [] ts = layoutError ts "layout stack empty"++  -- Handling explicit blocks:+  res _ st (t0 : ts)+    -- We found an open brace in the input,+    -- put an explicit layout block on the stack.+    -- This is done even if there was no layout word,+    -- to keep opening and closing braces.+    | isLayoutOpen t0 || isParenOpen t0+      = t0 : res (Just t0) (Explicit : st) ts++    -- If we encounter a closing brace, exit the first explicit layout block.+    | isLayoutClose t0 || isParenClose t0+      , let (imps, rest) = span isImplicit st+      , let st' = drop 1 rest+      = if null st'+        then layoutError ts $ unwords+          [ "found", prToken t0, "at" , tokenPos [t0]+          , "without an explicit layout block"+          ]+        else map (closingToken ts (tokenPosn t0)) imps ++ t0 : res (Just t0) st' ts++  -- Ending or confirming implicit layout blocks:+  res pt (b@(Implicit delim status col) : bs) (t0 : ts)++      -- Do not end top-level layout block by layout stop word.+    | isStop t0,  col <= 1+      = t0 : res (Just t0) (b : bs) ts++      -- End of implicit block by a layout stop word.+    | isStop t0+           -- Exit the current block and all implicit blocks+           -- more indented than the current token.+      , let (ebs, st') = span ((column t0 <) . indentation) bs+           -- Insert block-closers after the previous token.+      = map (closingToken ts (afterPrev pt)) (b : ebs) ++ t0 : res (Just t0) st' ts++    -- End of an implicit layout block by dedentation.+    | newLine pt t0+      , column t0 < col+           -- Insert a block closer after the previous token.+           -- Repeat, with the current block removed from the stack.+      , let c = closingToken ts (afterPrev pt) b+      = c : res (Just c) bs (t0 : ts)++    -- If we are on a newline, confirm the last tentative blocks.+    | newLine pt t0, Tentative{} <- status+      = res pt (Implicit delim Definitive col : confirm col bs) (t0 : ts)++  -- Starting and processing implicit layout blocks:+  res pt st (t0 : ts)+    -- Start a new layout block if the first token is a layout word.+    | Just delim@(LayoutDelimiters _ mopen _) <- isLayout t0+      = maybeInsertSeparator pt t0 st $+        case ts of+          -- Explicit layout, just move on. The next step+          -- will push an explicit layout block.+          t1 : _ | isLayoutOpen t1 ->+            t0 : res (Just t0) st ts+          -- Otherwise, insert an open brace after the layout word+          _ ->+            t0 : b : res (Just b) (addImplicit delim (tokenPosn t0) pos st) ts+            where+            b   = sToken (nextPos t0) $ fromMaybe undefined mopen+            -- At the end of the file, the start column does not matter.+            -- So if there is no token t1 after t0, just use the position of t0.+            pos = tokenPosn $ fromMaybe t0 $ listToMaybe ts++    -- Insert separator if necessary.+    | otherwise+      = maybeInsertSeparator pt t0 st $+        t0 : res (Just t0) st ts++  -- At EOF: skip explicit blocks.+  res (Just _) [Explicit]      [] = []+  res (Just t) (Explicit : bs) [] = res (Just t) bs []++  -- If we are using top-level layout, insert a semicolon after+  -- the last token, if there isn't one already+  res (Just t) [Implicit (LayoutDelimiters sep _ _) _ _] []+    | isLayoutSep t = []+    | otherwise     = [sToken (nextPos t) sep]++  -- At EOF in an implicit, non-top-level block: close the block+  res (Just t) (Implicit (LayoutDelimiters _ _ (Just close)) _ _ : bs) []+      = b : res (Just b) bs []+        where b = sToken (nextPos t) close++  -- This should only happen if the input is empty.+  res Nothing _st []+      = []++  -- | Insert a 'layoutSep' if we are on a new line on the current+  --   implicit layout column.+  maybeInsertSeparator+    :: Maybe Token  -- ^ The previous token.+    -> Token        -- ^ The current token.+    -> [Block]      -- ^ The layout stack.+    -> [Token]      -- ^ The result token stream.+    -> [Token]      -- ^ Maybe prepended with a 'layoutSep'.+  maybeInsertSeparator pt t0 = \case+    Implicit (LayoutDelimiters sep _ _) _ n : _+      | newLine pt t0+      , column t0 == n+      , maybe False (not . isTokenIn (layoutSep ++ layoutOpen)) pt+       -- Insert a semicolon after the previous token+       -- unless we are the beginning of the file,+       -- or the previous token is a semicolon or open brace.+      -> (sToken (afterPrev pt) sep :)+    _ -> id++  closingToken :: [Token] -> Position -> Block -> Token+  closingToken ts pos = sToken pos . \case+    Implicit (LayoutDelimiters _ _ (Just sy)) _ _ -> sy+    _ -> layoutError ts "trying to close a top level block"++type Position = Posn+type Line     = Int+type Column   = Int++-- | Entry of the layout stack.+data Block+   = Implicit LayoutDelimiters Status Column+       -- ^ An implicit layout block with its start column.+   | Explicit++-- | Get current indentation.  0 if we are in an explicit block.+indentation :: Block -> Column+indentation = \case+  Implicit _ _ n -> n+  Explicit -> 0++-- | Check if s block is implicit.+isImplicit :: Block -> Bool+isImplicit = \case+  Implicit{} -> True+  Explicit{} -> False++data Status+  = Tentative   -- ^ A layout column that has not been confirmed by a line break+  | Definitive  -- ^ A layout column that has been confirmed by a line break.++-- | Add a new implicit layout block.+addImplicit+  :: LayoutDelimiters -- ^ Delimiters of the new block.+  -> Position         -- ^ Position of the layout keyword.+  -> Position         -- ^ Position of the token following the layout keword.+  -> [Block]+  -> [Block]+addImplicit delim (Pn _ l0 _) (Pn _ l1 c1) st+    -- Case: layout keyword was at the end of the line:+    -- New implicit block is definitive.+    | l1 > l0   = Implicit delim Definitive (col st') : st'+    -- Case: staying on the same line:+    -- New implicit block is tentative.+    | otherwise = Implicit delim Tentative (col st) : st+  where+  st' = confirm c1 st+  col bs = max c1 $ 1 + definiteIndentation bs+    -- The column of the next token determines the starting column+    -- of the implicit layout block.+    -- However, the next block needs to be strictly more indented+    -- than the previous block.++  -- | Get the current confirmed indentation level.+  definiteIndentation :: [Block] -> Int+  definiteIndentation bs =+    case dropWhile isTentative bs of+      Implicit _ Definitive n : _ -> n+      _ -> 0  -- 0 enables a first unindented block, see 194_layout/good05.in++  isTentative :: Block -> Bool+  isTentative = \case+    Implicit _ Tentative _ -> True+    _ -> False++-- | Confirm tentative blocks that are not more indented than @col@.+confirm :: Column -> [Block] -> [Block]+confirm c0 = loop+  where+  loop = \case+    Implicit delim Tentative c : bs+      | c <= c0 -> Implicit delim Definitive c : loop bs+    bs -> bs++-- | Get the position immediately to the right of the given token.+--   If no token is given, gets the first position in the file.+afterPrev :: Maybe Token -> Position+afterPrev = maybe (Pn 0 1 1) nextPos++-- | Get the position immediately to the right of the given token.+nextPos :: Token -> Position+nextPos t = Pn (g + s) l (c + s + 1)+  where+  Pn g l c = tokenPosn t+  s        = tokenLength t++-- | Get the number of characters in the token.+tokenLength :: Token -> Int+tokenLength = length . prToken++-- | Create a position symbol token.+sToken :: Position -> TokSymbol -> Token+sToken p t = PT p $ TK t++-- | Get the line number of a token.+line :: Token -> Line+line = fst . tokenLineCol++-- | Get the column number of a token.+column :: Token -> Column+column = snd . tokenLineCol++-- | Is the following token on a new line?+newLine :: Maybe Token -> Token -> Bool+newLine pt t0 = maybe True ((line t0 >) . line) pt++-- | Check if a word is a layout start token.+isLayout :: Token -> Maybe LayoutDelimiters+isLayout = \case+  PT _ (TK t) -> lookup t layoutWords+  _ -> Nothing++-- | Check if a token is one of the given symbols.+isTokenIn :: [TokSymbol] -> Token -> Bool+isTokenIn ts = \case+  PT _ (TK t) -> t `elem` ts+  _ -> False++-- | Check if a token is a layout stop token.+isStop :: Token -> Bool+isStop = isTokenIn layoutStopWords++-- | Check if a token is the layout open token.+isLayoutOpen :: Token -> Bool+isLayoutOpen = isTokenIn layoutOpen++-- | Check if a token is the layout separator token.+isLayoutSep :: Token -> Bool+isLayoutSep = isTokenIn layoutSep++-- | Check if a token is the layout close token.+isLayoutClose :: Token -> Bool+isLayoutClose = isTokenIn layoutClose++-- | Check if a token is an opening parenthesis.+isParenOpen :: Token -> Bool+isParenOpen = isTokenIn parenOpen++-- | Check if a token is a closing parenthesis.+isParenClose :: Token -> Bool+isParenClose = isTokenIn parenClose
+ src/Language/Rzk/Syntax/Lex.hs view
@@ -0,0 +1,671 @@+{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE MagicHash #-}+{-# LINE 4 "Language/Rzk/Syntax/Lex.x" #-}+{-# OPTIONS -fno-warn-incomplete-patterns #-}+{-# OPTIONS_GHC -w #-}++{-# LANGUAGE PatternSynonyms #-}++module Language.Rzk.Syntax.Lex where++import Prelude++import qualified Data.Bits+import Data.Char     (ord)+import Data.Function (on)+import Data.Word     (Word8)+#if __GLASGOW_HASKELL__ >= 603+#include "ghcconfig.h"+#elif defined(__GLASGOW_HASKELL__)+#include "config.h"+#endif+#if __GLASGOW_HASKELL__ >= 503+import Data.Array+#else+import Array+#endif+#if __GLASGOW_HASKELL__ >= 503+import Data.Array.Base (unsafeAt)+import GHC.Exts+#else+import GlaExts+#endif+alex_tab_size :: Int+alex_tab_size = 8+alex_base :: AlexAddr+alex_base = AlexA#+  "\xf8\xff\xff\xff\xd7\xff\xff\xff\xef\x00\x00\x00\x98\xff\xff\xff\x95\xff\xff\xff\x96\xff\xff\xff\x94\xff\xff\xff\x9f\xff\xff\xff\xab\xff\xff\xff\x99\xff\xff\xff\xe6\x01\x00\x00\xdd\x02\x00\x00\xd1\xff\xff\xff\xa5\xff\xff\xff\xa7\xff\xff\xff\xac\xff\xff\xff\xaa\xff\xff\xff\xcc\xff\xff\xff\xae\xff\xff\xff\xad\xff\xff\xff\xb1\xff\xff\xff\xb3\xff\xff\xff\xd4\x03\x00\x00\xcb\x04\x00\x00\xc2\x05\x00\x00\xb9\x06\x00\x00\x00\x00\x00\x00\x84\xff\xff\xff\x74\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x07\x00\x00\x6b\x07\x00\x00\xab\x07\x00\x00\xa6\xff\xff\xff\x8d\xff\xff\xff\xa2\x08\x00\x00\x99\x09\x00\x00\x19\x0a\x00\x00\x99\x0a\x00\x00\x99\x0b\x00\x00\x10\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x0c\x00\x00\xc2\x0c\x00\x00\x02\x0d\x00\x00\xdb\x00\x00\x00\x82\x0d\x00\x00\x02\x0e\x00\x00\x02\x0f\x00\x00\x78\x0f\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\xb6\xff\xff\xff\x6e\x10\x00\x00\x6e\x11\x00\x00\x6f\x11\x00\x00\xef\x11\x00\x00\xb9\x0f\x00\x00\x30\x12\x00\x00\xa1\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x13\x00\x00\x47\x14\x00\x00\x47\x15\x00\x00\x48\x15\x00\x00\xc8\x15\x00\x00\xe2\x12\x00\x00\xb6\x13\x00\x00\x39\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x17\x00\x00\x27\x18\x00\x00\x1e\x19\x00\x00\x15\x1a\x00\x00\x0c\x1b\x00\x00\x03\x1c\x00\x00\xfa\x1c\x00\x00\x3a\x00\x00\x00\xfe\xff\xff\xff\xf1\x1d\x00\x00\xe8\x1e\x00\x00\xbf\xff\xff\xff\xca\xff\xff\xff\xd2\xff\xff\xff\xc6\xff\xff\xff\xcd\xff\xff\xff\xcf\xff\xff\xff\x13\x00\x00\x00\xd4\xff\xff\xff\xe4\xff\xff\xff\xd8\xff\xff\xff\xdc\xff\xff\xff\x1f\x00\x00\x00\xdf\xff\xff\xff\xe7\xff\xff\xff\xe1\xff\xff\xff\xef\xff\xff\xff\xec\xff\xff\xff\xe8\xff\xff\xff\xe9\xff\xff\xff\xf2\xff\xff\xff\xf4\xff\xff\xff\xea\xff\xff\xff\xe6\xff\xff\xff\xed\xff\xff\xff\xdf\x1f\x00\x00\x1e\x00\x00\x00\x32\x00\x00\x00"#++alex_table :: AlexAddr+alex_table = AlexA#+  "\x00\x00\x57\x00\x57\x00\x56\x00\x56\x00\x57\x00\x1a\x00\x04\x00\x05\x00\x07\x00\x06\x00\x08\x00\x09\x00\x6b\x00\x1a\x00\x65\x00\x1a\x00\x6e\x00\x14\x00\x10\x00\x15\x00\x02\x00\x13\x00\x02\x00\x57\x00\xff\xff\x36\x00\x11\x00\x0e\x00\x39\x00\x1a\x00\x02\x00\x1a\x00\x1a\x00\x0a\x00\x72\x00\x1a\x00\x38\x00\xff\xff\x73\x00\x25\x00\x5a\x00\x02\x00\x46\x00\x24\x00\x1a\x00\x1b\x00\x12\x00\x0f\x00\x3a\x00\x59\x00\x1a\x00\x0c\x00\x0b\x00\x1a\x00\x2b\x00\x6a\x00\x5b\x00\x5d\x00\x5c\x00\x03\x00\x5e\x00\x5f\x00\x63\x00\x60\x00\x67\x00\x1a\x00\x57\x00\x57\x00\x57\x00\x57\x00\x57\x00\x61\x00\x62\x00\x10\x00\x63\x00\x0d\x00\x64\x00\x1a\x00\x68\x00\x69\x00\x1a\x00\x6c\x00\x1a\x00\x01\x00\x1a\x00\x6b\x00\x02\x00\x6d\x00\x66\x00\x57\x00\x70\x00\x1a\x00\x71\x00\x6f\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x75\x00\x1a\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1c\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x23\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\xff\xff\xff\xff\xff\xff\x36\x00\x00\x00\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x50\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x34\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x35\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x31\x00\x34\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x30\x00\x33\x00\x2c\x00\x2c\x00\x2c\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x3e\x00\x3c\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x3f\x00\x3d\x00\x43\x00\x43\x00\x43\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x3b\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x3c\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x47\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4a\x00\x48\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4b\x00\x49\x00\x4f\x00\x4f\x00\x4f\x00\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x47\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4a\x00\x48\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4b\x00\x49\x00\x4f\x00\x4f\x00\x4f\x00\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x47\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x4d\x00\x48\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x02\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x57\x00\x57\x00\x56\x00\x56\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x02\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x1a\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x22\x00\x28\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x21\x00\x27\x00\x1d\x00\x1d\x00\x1d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_check :: AlexAddr+alex_check = AlexA#+  "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2f\x00\x6f\x00\x73\x00\x75\x00\x74\x00\x6c\x00\x61\x00\x74\x00\x3d\x00\x68\x00\x66\x00\x65\x00\x65\x00\x6e\x00\x63\x00\x91\x00\x68\x00\xa3\x00\x20\x00\x21\x00\x22\x00\x23\x00\x77\x00\x6f\x00\x6b\x00\x92\x00\x28\x00\x29\x00\x2a\x00\x6d\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x2d\x00\x86\x00\x6e\x00\x88\x00\x63\x00\x64\x00\x2d\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x6c\x00\x6f\x00\x74\x00\x69\x00\x70\x00\x70\x00\x6f\x00\x73\x00\x2d\x00\x75\x00\x3e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x74\x00\x65\x00\x6e\x00\x73\x00\x2d\x00\x6e\x00\x67\x00\x6e\x00\x61\x00\x65\x00\x69\x00\x5b\x00\x5c\x00\x5d\x00\x6e\x00\x5f\x00\x66\x00\x65\x00\x20\x00\x75\x00\x3e\x00\x70\x00\x74\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\x5b\x00\x5c\x00\x5d\x00\x72\x00\xff\xff\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2d\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2d\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7a\x00\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00"#++alex_deflt :: AlexAddr+alex_deflt = AlexA#+  "\x2a\x00\xff\xff\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2a\x00\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xff\xff\x2a\x00\x2a\x00\x1e\x00\x1f\x00\x2a\x00\x1e\x00\x1f\x00\x2a\x00\x1f\x00\x2a\x00\x2a\x00\x2a\x00\xff\xff\xff\xff\x2a\x00\x2a\x00\xff\xff\x2d\x00\x2e\x00\x36\x00\x2d\x00\x2e\x00\x36\x00\xff\xff\xff\xff\xff\xff\x36\x00\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\x3a\x00\xff\xff\xff\xff\x3a\x00\x41\x00\x42\x00\x3a\x00\x41\x00\x42\x00\xff\xff\x46\x00\x46\x00\x46\x00\xff\xff\xff\xff\x46\x00\x4d\x00\x4e\x00\x46\x00\x4d\x00\x4e\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xff\xff\xff\xff\x2a\x00\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2a\x00\xff\xff\xff\xff"#++alex_accept = listArray (0 :: Int, 117)+  [ AlexAccNone+  , AlexAcc 27+  , AlexAcc 26+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAcc 25+  , AlexAcc 24+  , AlexAcc 23+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAcc 22+  , AlexAcc 21+  , AlexAcc 20+  , AlexAcc 19+  , AlexAcc 18+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAcc 17+  , AlexAcc 16+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAcc 15+  , AlexAcc 14+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAcc 13+  , AlexAccNone+  , AlexAccNone+  , AlexAccSkip+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccSkip+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAcc 12+  , AlexAcc 11+  , AlexAcc 10+  , AlexAcc 9+  , AlexAcc 8+  , AlexAcc 7+  , AlexAccSkip+  , AlexAccSkip+  , AlexAcc 6+  , AlexAcc 5+  , AlexAcc 4+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAcc 3+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAcc 2+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAcc 1+  , AlexAccNone+  , AlexAcc 0+  ]++alex_actions = array (0 :: Int, 28)+  [ (27,alex_action_3)+  , (26,alex_action_3)+  , (25,alex_action_3)+  , (24,alex_action_3)+  , (23,alex_action_3)+  , (22,alex_action_4)+  , (21,alex_action_4)+  , (20,alex_action_4)+  , (19,alex_action_4)+  , (18,alex_action_3)+  , (17,alex_action_4)+  , (16,alex_action_4)+  , (15,alex_action_4)+  , (14,alex_action_5)+  , (13,alex_action_7)+  , (12,alex_action_4)+  , (11,alex_action_4)+  , (10,alex_action_4)+  , (9,alex_action_4)+  , (8,alex_action_4)+  , (7,alex_action_4)+  , (6,alex_action_3)+  , (5,alex_action_3)+  , (4,alex_action_3)+  , (3,alex_action_3)+  , (2,alex_action_3)+  , (1,alex_action_4)+  , (0,alex_action_3)+  ]++{-# LINE 64 "Language/Rzk/Syntax/Lex.x" #-}+-- | Create a token with position.+tok :: (String -> Tok) -> (Posn -> String -> Token)+tok f p = PT p . f++-- | Token without position.+data Tok+  = TK {-# UNPACK #-} !TokSymbol  -- ^ Reserved word or symbol.+  | TL !String                    -- ^ String literal.+  | TI !String                    -- ^ Integer literal.+  | TV !String                    -- ^ Identifier.+  | TD !String                    -- ^ Float literal.+  | TC !String                    -- ^ Character literal.+  | T_VarIdent !String+  | T_HoleIdent !String+  deriving (Eq, Show, Ord)++-- | Smart constructor for 'Tok' for the sake of backwards compatibility.+pattern TS :: String -> Int -> Tok+pattern TS t i = TK (TokSymbol t i)++-- | Keyword or symbol tokens have a unique ID.+data TokSymbol = TokSymbol+  { tsText :: String+      -- ^ Keyword or symbol text.+  , tsID   :: !Int+      -- ^ Unique ID.+  } deriving (Show)++-- | Keyword/symbol equality is determined by the unique ID.+instance Eq  TokSymbol where (==)    = (==)    `on` tsID++-- | Keyword/symbol ordering is determined by the unique ID.+instance Ord TokSymbol where compare = compare `on` tsID++-- | Token with position.+data Token+  = PT  Posn Tok+  | Err Posn+  deriving (Eq, Show, Ord)++-- | Pretty print a position.+printPosn :: Posn -> String+printPosn (Pn _ l c) = "line " ++ show l ++ ", column " ++ show c++-- | Pretty print the position of the first token in the list.+tokenPos :: [Token] -> String+tokenPos (t:_) = printPosn (tokenPosn t)+tokenPos []    = "end of file"++-- | Get the position of a token.+tokenPosn :: Token -> Posn+tokenPosn (PT p _) = p+tokenPosn (Err p)  = p++-- | Get line and column of a token.+tokenLineCol :: Token -> (Int, Int)+tokenLineCol = posLineCol . tokenPosn++-- | Get line and column of a position.+posLineCol :: Posn -> (Int, Int)+posLineCol (Pn _ l c) = (l,c)++-- | Convert a token into "position token" form.+mkPosToken :: Token -> ((Int, Int), String)+mkPosToken t = (tokenLineCol t, tokenText t)++-- | Convert a token to its text.+tokenText :: Token -> String+tokenText t = case t of+  PT _ (TS s _) -> s+  PT _ (TL s)   -> show s+  PT _ (TI s)   -> s+  PT _ (TV s)   -> s+  PT _ (TD s)   -> s+  PT _ (TC s)   -> s+  Err _         -> "#error"+  PT _ (T_VarIdent s) -> s+  PT _ (T_HoleIdent s) -> s++-- | Convert a token to a string.+prToken :: Token -> String+prToken t = tokenText t++-- | Finite map from text to token organized as binary search tree.+data BTree+  = N -- ^ Nil (leaf).+  | B String Tok BTree BTree+      -- ^ Binary node.+  deriving (Show)++-- | Convert potential keyword into token or use fallback conversion.+eitherResIdent :: (String -> Tok) -> String -> Tok+eitherResIdent tv s = treeFind resWords+  where+  treeFind N = tv s+  treeFind (B a t left right) =+    case compare s a of+      LT -> treeFind left+      GT -> treeFind right+      EQ -> t++-- | The keywords and symbols of the language organized as binary search tree.+resWords :: BTree+resWords =+  b ">" 30+    (b "," 15+       (b "#postulate" 8+          (b "#compute-whnf" 4+             (b "#compute" 2 (b "#check" 1 N N) (b "#compute-nf" 3 N N))+             (b "#define" 6 (b "#def" 5 N N) (b "#lang" 7 N N)))+          (b ")" 12+             (b "#unset-option" 10 (b "#set-option" 9 N N) (b "(" 11 N N))+             (b "*_1" 14 (b "*" 13 N N) N)))+       (b ":=" 23+          (b "1" 19+             (b "/\\" 17 (b "->" 16 N N) (b "0_2" 18 N N))+             (b "2" 21 (b "1_2" 20 N N) (b ":" 22 N N)))+          (b "=" 27+             (b "<" 25 (b ";" 24 N N) (b "<=" 26 N N))+             (b "=_{" 29 (b "===" 28 N N) N))))+    (b "recBOT" 45+       (b "\\" 38+          (b "TOP" 34+             (b "CUBE" 32 (b "BOT" 31 N N) (b "Sigma" 33 N N))+             (b "U" 36 (b "TOPE" 35 N N) (b "[" 37 N N)))+          (b "as" 42+             (b "]" 40 (b "\\/" 39 N N) (b "_" 41 N N))+             (b "idJ" 44 (b "first" 43 N N) N)))+       (b "{" 52+          (b "rzk-1" 49+             (b "refl" 47 (b "recOR" 46 N N) (b "refl_{" 48 N N))+             (b "second" 51 (b "rzk-2" 50 N N) N))+          (b "\931" 56+             (b "|->" 54 (b "|" 53 N N) (b "}" 55 N N))+             (b "\8721" 58 (b "\8594" 57 N N) N))))+  where+  b s n = B bs (TS bs n)+    where+    bs = s++-- | Unquote string literal.+unescapeInitTail :: String -> String+unescapeInitTail = id . unesc . tail . id+  where+  unesc s = case s of+    '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs+    '\\':'n':cs  -> '\n' : unesc cs+    '\\':'t':cs  -> '\t' : unesc cs+    '\\':'r':cs  -> '\r' : unesc cs+    '\\':'f':cs  -> '\f' : unesc cs+    '"':[]       -> []+    c:cs         -> c : unesc cs+    _            -> []++-------------------------------------------------------------------+-- Alex wrapper code.+-- A modified "posn" wrapper.+-------------------------------------------------------------------++data Posn = Pn !Int !Int !Int+  deriving (Eq, Show, Ord)++alexStartPos :: Posn+alexStartPos = Pn 0 1 1++alexMove :: Posn -> Char -> Posn+alexMove (Pn a l c) '\t' = Pn (a+1)  l     (((c+7) `div` 8)*8+1)+alexMove (Pn a l c) '\n' = Pn (a+1) (l+1)   1+alexMove (Pn a l c) _    = Pn (a+1)  l     (c+1)++type Byte = Word8++type AlexInput = (Posn,     -- current position,+                  Char,     -- previous char+                  [Byte],   -- pending bytes on the current char+                  String)   -- current input string++tokens :: String -> [Token]+tokens str = go (alexStartPos, '\n', [], str)+    where+      go :: AlexInput -> [Token]+      go inp@(pos, _, _, str) =+               case alexScan inp 0 of+                AlexEOF                   -> []+                AlexError (pos, _, _, _)  -> [Err pos]+                AlexSkip  inp' len        -> go inp'+                AlexToken inp' len act    -> act pos (take len str) : (go inp')++alexGetByte :: AlexInput -> Maybe (Byte,AlexInput)+alexGetByte (p, c, (b:bs), s) = Just (b, (p, c, bs, s))+alexGetByte (p, _, [], s) =+  case s of+    []  -> Nothing+    (c:s) ->+             let p'     = alexMove p c+                 (b:bs) = utf8Encode c+              in p' `seq` Just (b, (p', c, bs, s))++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar (p, c, bs, s) = c++-- | Encode a Haskell String to a list of Word8 values, in UTF8 format.+utf8Encode :: Char -> [Word8]+utf8Encode = map fromIntegral . go . ord+  where+  go oc+   | oc <= 0x7f       = [oc]++   | oc <= 0x7ff      = [ 0xc0 + (oc `Data.Bits.shiftR` 6)+                        , 0x80 + oc Data.Bits..&. 0x3f+                        ]++   | oc <= 0xffff     = [ 0xe0 + (oc `Data.Bits.shiftR` 12)+                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)+                        , 0x80 + oc Data.Bits..&. 0x3f+                        ]+   | otherwise        = [ 0xf0 + (oc `Data.Bits.shiftR` 18)+                        , 0x80 + ((oc `Data.Bits.shiftR` 12) Data.Bits..&. 0x3f)+                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)+                        , 0x80 + oc Data.Bits..&. 0x3f+                        ]+alex_action_3 = tok (eitherResIdent TV)+alex_action_4 = tok (eitherResIdent T_VarIdent)+alex_action_5 = tok (eitherResIdent T_HoleIdent)+alex_action_6 = tok (eitherResIdent TV)+alex_action_7 = tok (TL . unescapeInitTail)++#define ALEX_GHC 1+#define ALEX_NOPRED 1+-- -----------------------------------------------------------------------------+-- ALEX TEMPLATE+--+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use+-- it for any purpose whatsoever.++-- -----------------------------------------------------------------------------+-- INTERNALS and main scanner engine++#ifdef ALEX_GHC+#  define ILIT(n) n#+#  define IBOX(n) (I# (n))+#  define FAST_INT Int#+-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#  if __GLASGOW_HASKELL__ > 706+#    define GTE(n,m) (tagToEnum# (n >=# m))+#    define EQ(n,m) (tagToEnum# (n ==# m))+#  else+#    define GTE(n,m) (n >=# m)+#    define EQ(n,m) (n ==# m)+#  endif+#  define PLUS(n,m) (n +# m)+#  define MINUS(n,m) (n -# m)+#  define TIMES(n,m) (n *# m)+#  define NEGATE(n) (negateInt# (n))+#  define IF_GHC(x) (x)+#else+#  define ILIT(n) (n)+#  define IBOX(n) (n)+#  define FAST_INT Int+#  define GTE(n,m) (n >= m)+#  define EQ(n,m) (n == m)+#  define PLUS(n,m) (n + m)+#  define MINUS(n,m) (n - m)+#  define TIMES(n,m) (n * m)+#  define NEGATE(n) (negate (n))+#  define IF_GHC(x)+#endif++#ifdef ALEX_GHC+data AlexAddr = AlexA# Addr#+-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ < 503+uncheckedShiftL# = shiftL#+#endif++{-# INLINE alexIndexInt16OffAddr #-}+alexIndexInt16OffAddr :: AlexAddr -> Int# -> Int#+alexIndexInt16OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+  narrow16Int# i+  where+        i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)+        high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+        low  = int2Word# (ord# (indexCharOffAddr# arr off'))+        off' = off *# 2#+#else+#if __GLASGOW_HASKELL__ >= 901+  int16ToInt#+#endif+    (indexInt16OffAddr# arr off)+#endif+#else+alexIndexInt16OffAddr arr off = arr ! off+#endif++#ifdef ALEX_GHC+{-# INLINE alexIndexInt32OffAddr #-}+alexIndexInt32OffAddr :: AlexAddr -> Int# -> Int#+alexIndexInt32OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+  narrow32Int# i+  where+   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`+                     (b2 `uncheckedShiftL#` 16#) `or#`+                     (b1 `uncheckedShiftL#` 8#) `or#` b0)+   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))+   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))+   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))+   off' = off *# 4#+#else+#if __GLASGOW_HASKELL__ >= 901+  int32ToInt#+#endif+    (indexInt32OffAddr# arr off)+#endif+#else+alexIndexInt32OffAddr arr off = arr ! off+#endif++#ifdef ALEX_GHC++#if __GLASGOW_HASKELL__ < 503+quickIndex arr i = arr ! i+#else+-- GHC >= 503, unsafeAt is available from Data.Array.Base.+quickIndex = unsafeAt+#endif+#else+quickIndex arr i = arr ! i+#endif++-- -----------------------------------------------------------------------------+-- Main lexing routines++data AlexReturn a+  = AlexEOF+  | AlexError  !AlexInput+  | AlexSkip   !AlexInput !Int+  | AlexToken  !AlexInput !Int a++-- alexScan :: AlexInput -> StartCode -> AlexReturn a+alexScan input__ IBOX(sc)+  = alexScanUser undefined input__ IBOX(sc)++alexScanUser user__ input__ IBOX(sc)+  = case alex_scan_tkn user__ input__ ILIT(0) input__ sc AlexNone of+  (AlexNone, input__') ->+    case alexGetByte input__ of+      Nothing ->+#ifdef ALEX_DEBUG+                                   trace ("End of input.") $+#endif+                                   AlexEOF+      Just _ ->+#ifdef ALEX_DEBUG+                                   trace ("Error.") $+#endif+                                   AlexError input__'++  (AlexLastSkip input__'' len, _) ->+#ifdef ALEX_DEBUG+    trace ("Skipping.") $+#endif+    AlexSkip input__'' len++  (AlexLastAcc k input__''' len, _) ->+#ifdef ALEX_DEBUG+    trace ("Accept.") $+#endif+    AlexToken input__''' len (alex_actions ! k)+++-- Push the input through the DFA, remembering the most recent accepting+-- state it encountered.++alex_scan_tkn user__ orig_input len input__ s last_acc =+  input__ `seq` -- strict in the input+  let+  new_acc = (check_accs (alex_accept `quickIndex` IBOX(s)))+  in+  new_acc `seq`+  case alexGetByte input__ of+     Nothing -> (new_acc, input__)+     Just (c, new_input) ->+#ifdef ALEX_DEBUG+      trace ("State: " ++ show IBOX(s) ++ ", char: " ++ show c) $+#endif+      case fromIntegral c of { IBOX(ord_c) ->+        let+                base   = alexIndexInt32OffAddr alex_base s+                offset = PLUS(base,ord_c)+                check  = alexIndexInt16OffAddr alex_check offset++                new_s = if GTE(offset,ILIT(0)) && EQ(check,ord_c)+                          then alexIndexInt16OffAddr alex_table offset+                          else alexIndexInt16OffAddr alex_deflt s+        in+        case new_s of+            ILIT(-1) -> (new_acc, input__)+                -- on an error, we want to keep the input *before* the+                -- character that failed, not after.+            _ -> alex_scan_tkn user__ orig_input+#ifdef ALEX_LATIN1+                   PLUS(len,ILIT(1))+                   -- issue 119: in the latin1 encoding, *each* byte is one character+#else+                   (if c < 0x80 || c >= 0xC0 then PLUS(len,ILIT(1)) else len)+                   -- note that the length is increased ONLY if this is the 1st byte in a char encoding)+#endif+                   new_input new_s new_acc+      }+  where+        check_accs (AlexAccNone) = last_acc+        check_accs (AlexAcc a  ) = AlexLastAcc a input__ IBOX(len)+        check_accs (AlexAccSkip) = AlexLastSkip  input__ IBOX(len)+#ifndef ALEX_NOPRED+        check_accs (AlexAccPred a predx rest)+           | predx user__ orig_input IBOX(len) input__+           = AlexLastAcc a input__ IBOX(len)+           | otherwise+           = check_accs rest+        check_accs (AlexAccSkipPred predx rest)+           | predx user__ orig_input IBOX(len) input__+           = AlexLastSkip input__ IBOX(len)+           | otherwise+           = check_accs rest+#endif++data AlexLastAcc+  = AlexNone+  | AlexLastAcc !Int !AlexInput !Int+  | AlexLastSkip     !AlexInput !Int++data AlexAcc user+  = AlexAccNone+  | AlexAcc Int+  | AlexAccSkip+#ifndef ALEX_NOPRED+  | AlexAccPred Int (AlexAccPred user) (AlexAcc user)+  | AlexAccSkipPred (AlexAccPred user) (AlexAcc user)++type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool++-- -----------------------------------------------------------------------------+-- Predicates on a rule++alexAndPred p1 p2 user__ in1 len in2+  = p1 user__ in1 len in2 && p2 user__ in1 len in2++--alexPrevCharIsPred :: Char -> AlexAccPred _+alexPrevCharIs c _ input__ _ _ = c == alexInputPrevChar input__++alexPrevCharMatches f _ input__ _ _ = f (alexInputPrevChar input__)++--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _+alexPrevCharIsOneOf arr _ input__ _ _ = arr ! alexInputPrevChar input__++--alexRightContext :: Int -> AlexAccPred _+alexRightContext IBOX(sc) user__ _ _ input__ =+     case alex_scan_tkn user__ input__ ILIT(0) input__ sc AlexNone of+          (AlexNone, _) -> False+          _ -> True+        -- TODO: there's no need to find the longest+        -- match when checking the right context, just+        -- the first match will do.+#endif
+ src/Language/Rzk/Syntax/Lex.x view
@@ -0,0 +1,286 @@+-- -*- haskell -*- File generated by the BNF Converter (bnfc 2.9.4.1).++-- Lexer definition for use with Alex 3+{+{-# OPTIONS -fno-warn-incomplete-patterns #-}+{-# OPTIONS_GHC -w #-}++{-# LANGUAGE PatternSynonyms #-}++module Language.Rzk.Syntax.Lex where++import Prelude++import qualified Data.Bits+import Data.Char     (ord)+import Data.Function (on)+import Data.Word     (Word8)+}++-- Predefined character classes++$c = [A-Z\192-\221] # [\215]  -- capital isolatin1 letter (215 = \times) FIXME+$s = [a-z\222-\255] # [\247]  -- small   isolatin1 letter (247 = \div  ) FIXME+$l = [$c $s]         -- letter+$d = [0-9]           -- digit+$i = [$l $d _ ']     -- identifier character+$u = [. \n]          -- universal: any character++-- Symbols and non-identifier-like reserved words++@rsyms = \Σ | \# "lang" | \; | "rzk" \- "1" | "rzk" \- "2" | \# "set" \- "option" | \= | \# "unset" \- "option" | \# "check" | \: | \# "compute" | \# "compute" \- "whnf" | \# "compute" \- "nf" | \# "postulate" | \# "define" | \: \= | \# "def" | \_ | \( | \, | \) | \{ | \| | \} | \| \- \> | "1" | \* \_ "1" | "2" | "0" \_ "2" | "1" \_ "2" | \* | \= \= \= | \< \= | \/ \\ | \\ \/ | \- \> | \= \_ \{ | \[ | \] | \< | \> | \\ | "refl" \_ \{ | \→ | \∑++:-++-- Line comment "--"+"--" [.]* ;++-- Block comment "{-" "-}"+\{ \- [$u # \-]* \- ([$u # [\- \}]] [$u # \-]* \- | \-)* \} ;++-- Whitespace (skipped)+$white+ ;++-- Symbols+@rsyms+    { tok (eitherResIdent TV) }++-- token VarIdent+[$u # [\t \n \r \  \! \" \# \( \) \, \- \. \; \< \> \? \[ \\ \] \{ \| \}]] [$u # [\t \n \r \  \" \# \( \) \, \; \< \> \[ \\ \] \{ \| \}]] *+    { tok (eitherResIdent T_VarIdent) }++-- token HoleIdent+\?+    { tok (eitherResIdent T_HoleIdent) }++-- Keywords and Ident+$l $i*+    { tok (eitherResIdent TV) }++-- String+\" ([$u # [\" \\ \n]] | (\\ (\" | \\ | \' | n | t | r | f)))* \"+    { tok (TL . unescapeInitTail) }++{+-- | Create a token with position.+tok :: (String -> Tok) -> (Posn -> String -> Token)+tok f p = PT p . f++-- | Token without position.+data Tok+  = TK {-# UNPACK #-} !TokSymbol  -- ^ Reserved word or symbol.+  | TL !String                    -- ^ String literal.+  | TI !String                    -- ^ Integer literal.+  | TV !String                    -- ^ Identifier.+  | TD !String                    -- ^ Float literal.+  | TC !String                    -- ^ Character literal.+  | T_VarIdent !String+  | T_HoleIdent !String+  deriving (Eq, Show, Ord)++-- | Smart constructor for 'Tok' for the sake of backwards compatibility.+pattern TS :: String -> Int -> Tok+pattern TS t i = TK (TokSymbol t i)++-- | Keyword or symbol tokens have a unique ID.+data TokSymbol = TokSymbol+  { tsText :: String+      -- ^ Keyword or symbol text.+  , tsID   :: !Int+      -- ^ Unique ID.+  } deriving (Show)++-- | Keyword/symbol equality is determined by the unique ID.+instance Eq  TokSymbol where (==)    = (==)    `on` tsID++-- | Keyword/symbol ordering is determined by the unique ID.+instance Ord TokSymbol where compare = compare `on` tsID++-- | Token with position.+data Token+  = PT  Posn Tok+  | Err Posn+  deriving (Eq, Show, Ord)++-- | Pretty print a position.+printPosn :: Posn -> String+printPosn (Pn _ l c) = "line " ++ show l ++ ", column " ++ show c++-- | Pretty print the position of the first token in the list.+tokenPos :: [Token] -> String+tokenPos (t:_) = printPosn (tokenPosn t)+tokenPos []    = "end of file"++-- | Get the position of a token.+tokenPosn :: Token -> Posn+tokenPosn (PT p _) = p+tokenPosn (Err p)  = p++-- | Get line and column of a token.+tokenLineCol :: Token -> (Int, Int)+tokenLineCol = posLineCol . tokenPosn++-- | Get line and column of a position.+posLineCol :: Posn -> (Int, Int)+posLineCol (Pn _ l c) = (l,c)++-- | Convert a token into "position token" form.+mkPosToken :: Token -> ((Int, Int), String)+mkPosToken t = (tokenLineCol t, tokenText t)++-- | Convert a token to its text.+tokenText :: Token -> String+tokenText t = case t of+  PT _ (TS s _) -> s+  PT _ (TL s)   -> show s+  PT _ (TI s)   -> s+  PT _ (TV s)   -> s+  PT _ (TD s)   -> s+  PT _ (TC s)   -> s+  Err _         -> "#error"+  PT _ (T_VarIdent s) -> s+  PT _ (T_HoleIdent s) -> s++-- | Convert a token to a string.+prToken :: Token -> String+prToken t = tokenText t++-- | Finite map from text to token organized as binary search tree.+data BTree+  = N -- ^ Nil (leaf).+  | B String Tok BTree BTree+      -- ^ Binary node.+  deriving (Show)++-- | Convert potential keyword into token or use fallback conversion.+eitherResIdent :: (String -> Tok) -> String -> Tok+eitherResIdent tv s = treeFind resWords+  where+  treeFind N = tv s+  treeFind (B a t left right) =+    case compare s a of+      LT -> treeFind left+      GT -> treeFind right+      EQ -> t++-- | The keywords and symbols of the language organized as binary search tree.+resWords :: BTree+resWords =+  b ">" 30+    (b "," 15+       (b "#postulate" 8+          (b "#compute-whnf" 4+             (b "#compute" 2 (b "#check" 1 N N) (b "#compute-nf" 3 N N))+             (b "#define" 6 (b "#def" 5 N N) (b "#lang" 7 N N)))+          (b ")" 12+             (b "#unset-option" 10 (b "#set-option" 9 N N) (b "(" 11 N N))+             (b "*_1" 14 (b "*" 13 N N) N)))+       (b ":=" 23+          (b "1" 19+             (b "/\\" 17 (b "->" 16 N N) (b "0_2" 18 N N))+             (b "2" 21 (b "1_2" 20 N N) (b ":" 22 N N)))+          (b "=" 27+             (b "<" 25 (b ";" 24 N N) (b "<=" 26 N N))+             (b "=_{" 29 (b "===" 28 N N) N))))+    (b "recBOT" 45+       (b "\\" 38+          (b "TOP" 34+             (b "CUBE" 32 (b "BOT" 31 N N) (b "Sigma" 33 N N))+             (b "U" 36 (b "TOPE" 35 N N) (b "[" 37 N N)))+          (b "as" 42+             (b "]" 40 (b "\\/" 39 N N) (b "_" 41 N N))+             (b "idJ" 44 (b "first" 43 N N) N)))+       (b "{" 52+          (b "rzk-1" 49+             (b "refl" 47 (b "recOR" 46 N N) (b "refl_{" 48 N N))+             (b "second" 51 (b "rzk-2" 50 N N) N))+          (b "\931" 56+             (b "|->" 54 (b "|" 53 N N) (b "}" 55 N N))+             (b "\8721" 58 (b "\8594" 57 N N) N))))+  where+  b s n = B bs (TS bs n)+    where+    bs = s++-- | Unquote string literal.+unescapeInitTail :: String -> String+unescapeInitTail = id . unesc . tail . id+  where+  unesc s = case s of+    '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs+    '\\':'n':cs  -> '\n' : unesc cs+    '\\':'t':cs  -> '\t' : unesc cs+    '\\':'r':cs  -> '\r' : unesc cs+    '\\':'f':cs  -> '\f' : unesc cs+    '"':[]       -> []+    c:cs         -> c : unesc cs+    _            -> []++-------------------------------------------------------------------+-- Alex wrapper code.+-- A modified "posn" wrapper.+-------------------------------------------------------------------++data Posn = Pn !Int !Int !Int+  deriving (Eq, Show, Ord)++alexStartPos :: Posn+alexStartPos = Pn 0 1 1++alexMove :: Posn -> Char -> Posn+alexMove (Pn a l c) '\t' = Pn (a+1)  l     (((c+7) `div` 8)*8+1)+alexMove (Pn a l c) '\n' = Pn (a+1) (l+1)   1+alexMove (Pn a l c) _    = Pn (a+1)  l     (c+1)++type Byte = Word8++type AlexInput = (Posn,     -- current position,+                  Char,     -- previous char+                  [Byte],   -- pending bytes on the current char+                  String)   -- current input string++tokens :: String -> [Token]+tokens str = go (alexStartPos, '\n', [], str)+    where+      go :: AlexInput -> [Token]+      go inp@(pos, _, _, str) =+               case alexScan inp 0 of+                AlexEOF                   -> []+                AlexError (pos, _, _, _)  -> [Err pos]+                AlexSkip  inp' len        -> go inp'+                AlexToken inp' len act    -> act pos (take len str) : (go inp')++alexGetByte :: AlexInput -> Maybe (Byte,AlexInput)+alexGetByte (p, c, (b:bs), s) = Just (b, (p, c, bs, s))+alexGetByte (p, _, [], s) =+  case s of+    []  -> Nothing+    (c:s) ->+             let p'     = alexMove p c+                 (b:bs) = utf8Encode c+              in p' `seq` Just (b, (p', c, bs, s))++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar (p, c, bs, s) = c++-- | Encode a Haskell String to a list of Word8 values, in UTF8 format.+utf8Encode :: Char -> [Word8]+utf8Encode = map fromIntegral . go . ord+  where+  go oc+   | oc <= 0x7f       = [oc]++   | oc <= 0x7ff      = [ 0xc0 + (oc `Data.Bits.shiftR` 6)+                        , 0x80 + oc Data.Bits..&. 0x3f+                        ]++   | oc <= 0xffff     = [ 0xe0 + (oc `Data.Bits.shiftR` 12)+                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)+                        , 0x80 + oc Data.Bits..&. 0x3f+                        ]+   | otherwise        = [ 0xf0 + (oc `Data.Bits.shiftR` 18)+                        , 0x80 + ((oc `Data.Bits.shiftR` 12) Data.Bits..&. 0x3f)+                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)+                        , 0x80 + oc Data.Bits..&. 0x3f+                        ]+}
+ src/Language/Rzk/Syntax/Par.hs view
@@ -0,0 +1,1864 @@+{-# OPTIONS_GHC -w #-}+{-# OPTIONS -XMagicHash -XBangPatterns -XTypeSynonymInstances -XFlexibleInstances -cpp #-}+#if __GLASGOW_HASKELL__ >= 710+{-# OPTIONS_GHC -XPartialTypeSignatures #-}+#endif+{-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}+{-# LANGUAGE PatternSynonyms #-}++module Language.Rzk.Syntax.Par+  ( happyError+  , myLexer+  , pModule+  , pLanguageDecl+  , pLanguage+  , pCommand+  , pListCommand+  , pPattern+  , pListPattern+  , pParam+  , pListParam+  , pParamDecl+  , pRestriction+  , pListRestriction+  , pTerm7+  , pTerm5+  , pTerm4+  , pTerm3+  , pTerm2+  , pTerm1+  , pTerm6+  , pTerm+  , pListTerm+  ) where++import Prelude++import qualified Language.Rzk.Syntax.Abs+import Language.Rzk.Syntax.Lex+import qualified Data.Array as Happy_Data_Array+import qualified Data.Bits as Bits+import qualified GHC.Exts as Happy_GHC_Exts+import Control.Applicative(Applicative(..))+import Control.Monad (ap)++-- parser produced by Happy Version 1.20.1.1++newtype HappyAbsSyn  = HappyAbsSyn HappyAny+#if __GLASGOW_HASKELL__ >= 607+type HappyAny = Happy_GHC_Exts.Any+#else+type HappyAny = forall a . a+#endif+newtype HappyWrap24 = HappyWrap24 ((Language.Rzk.Syntax.Abs.BNFC'Position, String))+happyIn24 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, String)) -> (HappyAbsSyn )+happyIn24 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap24 x)+{-# INLINE happyIn24 #-}+happyOut24 :: (HappyAbsSyn ) -> HappyWrap24+happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut24 #-}+newtype HappyWrap25 = HappyWrap25 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.VarIdent))+happyIn25 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.VarIdent)) -> (HappyAbsSyn )+happyIn25 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap25 x)+{-# INLINE happyIn25 #-}+happyOut25 :: (HappyAbsSyn ) -> HappyWrap25+happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut25 #-}+newtype HappyWrap26 = HappyWrap26 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.HoleIdent))+happyIn26 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.HoleIdent)) -> (HappyAbsSyn )+happyIn26 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap26 x)+{-# INLINE happyIn26 #-}+happyOut26 :: (HappyAbsSyn ) -> HappyWrap26+happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut26 #-}+newtype HappyWrap27 = HappyWrap27 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Module))+happyIn27 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Module)) -> (HappyAbsSyn )+happyIn27 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap27 x)+{-# INLINE happyIn27 #-}+happyOut27 :: (HappyAbsSyn ) -> HappyWrap27+happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut27 #-}+newtype HappyWrap28 = HappyWrap28 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.LanguageDecl))+happyIn28 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.LanguageDecl)) -> (HappyAbsSyn )+happyIn28 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap28 x)+{-# INLINE happyIn28 #-}+happyOut28 :: (HappyAbsSyn ) -> HappyWrap28+happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut28 #-}+newtype HappyWrap29 = HappyWrap29 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Language))+happyIn29 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Language)) -> (HappyAbsSyn )+happyIn29 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap29 x)+{-# INLINE happyIn29 #-}+happyOut29 :: (HappyAbsSyn ) -> HappyWrap29+happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut29 #-}+newtype HappyWrap30 = HappyWrap30 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Command))+happyIn30 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Command)) -> (HappyAbsSyn )+happyIn30 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap30 x)+{-# INLINE happyIn30 #-}+happyOut30 :: (HappyAbsSyn ) -> HappyWrap30+happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut30 #-}+newtype HappyWrap31 = HappyWrap31 ((Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Command]))+happyIn31 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Command])) -> (HappyAbsSyn )+happyIn31 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap31 x)+{-# INLINE happyIn31 #-}+happyOut31 :: (HappyAbsSyn ) -> HappyWrap31+happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut31 #-}+newtype HappyWrap32 = HappyWrap32 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Pattern))+happyIn32 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Pattern)) -> (HappyAbsSyn )+happyIn32 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap32 x)+{-# INLINE happyIn32 #-}+happyOut32 :: (HappyAbsSyn ) -> HappyWrap32+happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut32 #-}+newtype HappyWrap33 = HappyWrap33 ((Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Pattern]))+happyIn33 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Pattern])) -> (HappyAbsSyn )+happyIn33 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap33 x)+{-# INLINE happyIn33 #-}+happyOut33 :: (HappyAbsSyn ) -> HappyWrap33+happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut33 #-}+newtype HappyWrap34 = HappyWrap34 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Param))+happyIn34 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Param)) -> (HappyAbsSyn )+happyIn34 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap34 x)+{-# INLINE happyIn34 #-}+happyOut34 :: (HappyAbsSyn ) -> HappyWrap34+happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut34 #-}+newtype HappyWrap35 = HappyWrap35 ((Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Param]))+happyIn35 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Param])) -> (HappyAbsSyn )+happyIn35 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap35 x)+{-# INLINE happyIn35 #-}+happyOut35 :: (HappyAbsSyn ) -> HappyWrap35+happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut35 #-}+newtype HappyWrap36 = HappyWrap36 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.ParamDecl))+happyIn36 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.ParamDecl)) -> (HappyAbsSyn )+happyIn36 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap36 x)+{-# INLINE happyIn36 #-}+happyOut36 :: (HappyAbsSyn ) -> HappyWrap36+happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut36 #-}+newtype HappyWrap37 = HappyWrap37 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Restriction))+happyIn37 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Restriction)) -> (HappyAbsSyn )+happyIn37 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap37 x)+{-# INLINE happyIn37 #-}+happyOut37 :: (HappyAbsSyn ) -> HappyWrap37+happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut37 #-}+newtype HappyWrap38 = HappyWrap38 ((Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Restriction]))+happyIn38 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Restriction])) -> (HappyAbsSyn )+happyIn38 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap38 x)+{-# INLINE happyIn38 #-}+happyOut38 :: (HappyAbsSyn ) -> HappyWrap38+happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut38 #-}+newtype HappyWrap39 = HappyWrap39 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term))+happyIn39 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term)) -> (HappyAbsSyn )+happyIn39 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap39 x)+{-# INLINE happyIn39 #-}+happyOut39 :: (HappyAbsSyn ) -> HappyWrap39+happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut39 #-}+newtype HappyWrap40 = HappyWrap40 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term))+happyIn40 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term)) -> (HappyAbsSyn )+happyIn40 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap40 x)+{-# INLINE happyIn40 #-}+happyOut40 :: (HappyAbsSyn ) -> HappyWrap40+happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut40 #-}+newtype HappyWrap41 = HappyWrap41 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term))+happyIn41 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term)) -> (HappyAbsSyn )+happyIn41 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap41 x)+{-# INLINE happyIn41 #-}+happyOut41 :: (HappyAbsSyn ) -> HappyWrap41+happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut41 #-}+newtype HappyWrap42 = HappyWrap42 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term))+happyIn42 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term)) -> (HappyAbsSyn )+happyIn42 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap42 x)+{-# INLINE happyIn42 #-}+happyOut42 :: (HappyAbsSyn ) -> HappyWrap42+happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut42 #-}+newtype HappyWrap43 = HappyWrap43 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term))+happyIn43 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term)) -> (HappyAbsSyn )+happyIn43 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap43 x)+{-# INLINE happyIn43 #-}+happyOut43 :: (HappyAbsSyn ) -> HappyWrap43+happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut43 #-}+newtype HappyWrap44 = HappyWrap44 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term))+happyIn44 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term)) -> (HappyAbsSyn )+happyIn44 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap44 x)+{-# INLINE happyIn44 #-}+happyOut44 :: (HappyAbsSyn ) -> HappyWrap44+happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut44 #-}+newtype HappyWrap45 = HappyWrap45 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term))+happyIn45 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term)) -> (HappyAbsSyn )+happyIn45 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap45 x)+{-# INLINE happyIn45 #-}+happyOut45 :: (HappyAbsSyn ) -> HappyWrap45+happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut45 #-}+newtype HappyWrap46 = HappyWrap46 ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term))+happyIn46 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term)) -> (HappyAbsSyn )+happyIn46 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap46 x)+{-# INLINE happyIn46 #-}+happyOut46 :: (HappyAbsSyn ) -> HappyWrap46+happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut46 #-}+newtype HappyWrap47 = HappyWrap47 ((Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Term]))+happyIn47 :: ((Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Term])) -> (HappyAbsSyn )+happyIn47 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap47 x)+{-# INLINE happyIn47 #-}+happyOut47 :: (HappyAbsSyn ) -> HappyWrap47+happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut47 #-}+happyInTok :: (Token) -> (HappyAbsSyn )+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyInTok #-}+happyOutTok :: (HappyAbsSyn ) -> (Token)+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOutTok #-}+++happyExpList :: HappyAddr+happyExpList = HappyA# "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\xc0\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x01\x00\x08\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x20\x00\x00\x01\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x04\x20\x20\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x80\x00\x04\x04\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xec\xc0\xcf\x80\x01\x00\x00\x00\x00\x00\x00\x48\x3c\x82\x5f\xf8\x19\x35\x00\x00\x00\x00\x00\x00\x00\x89\x47\xf0\x0b\x3f\xa3\x06\x00\x00\x00\x00\x00\x00\x20\xf1\x08\x76\xc0\x07\xc0\x00\x00\x00\x00\x00\x00\x00\x24\x1e\xc1\x0e\xfc\x04\x18\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xd8\x81\x9f\x00\x03\x00\x00\x00\x00\x00\x00\x90\x78\x04\x3b\xf0\x13\x60\x00\x00\x00\x00\x00\x00\x00\x12\x8f\x60\x07\x7e\x02\x0c\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xfc\xc2\xcf\xa8\x01\x00\x00\x00\x00\x00\x00\x48\x3c\x82\x1d\xf8\x09\x30\x00\x00\x00\x00\x00\x00\x00\x89\x47\xf0\x0b\x3f\xa3\x06\x00\x00\x00\x00\x00\x00\x20\xf1\x08\x7e\xe1\x67\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x80\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x8f\x60\x0f\x7c\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x47\xf0\x4b\x3f\xa3\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xec\xc0\xcf\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x80\x00\x04\x04\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xec\x80\x0f\x80\x01\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xf8\x85\x9f\x51\x03\x00\x00\x00\x00\x00\x00\x90\x78\x04\x3b\xe0\x03\x60\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x80\x00\x00\x04\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xd8\x03\x1f\x00\x03\x00\x00\x00\x00\x00\x00\x90\x78\x04\xbf\xf0\x33\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x47\xb0\x07\x3e\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x1e\xc1\x1e\xf8\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x80\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x02\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x08\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x20\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x80\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf1\x08\x7e\xe1\x67\xd4\x00\x00\x00\x00\x00\x00\x00\x24\x1e\xc1\x2f\xfc\x8c\x1a\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xf8\x85\x9f\x51\x03\x00\x00\x00\x00\x00\x00\x90\x78\x04\xbf\xf0\x33\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x02\x00\x10\x80\x80\x00\x00\x00\x00\x00\x00\x00\x08\x40\x00\x00\x02\x10\x10\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x40\x00\x02\x02\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x02\x00\x00\x08\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x8f\xe0\x17\x7e\x46\x0d\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xfc\xc2\xcf\xa8\x01\x00\x00\x00\x00\x00\x00\x48\x3c\x82\x5f\xf8\x19\x35\x00\x00\x00\x00\x00\x00\x00\x89\x47\xb0\x03\x3f\x01\x06\x00\x00\x00\x00\x00\x00\x20\xf1\x08\x76\xe0\x27\xc0\x00\x00\x00\x00\x00\x00\x00\x24\x1e\xc1\x2f\xfc\x8c\x1a\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x04\x00\x20\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x80\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x02\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x24\x1e\xc1\x2f\xfc\x8c\x1a\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xf8\x85\x9f\x51\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x10\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x1e\xc1\x2f\xfc\x8c\x1a\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xf8\x85\x9f\x51\x03\x00\x00\x00\x00\x00\x00\x90\x78\x04\x3b\xf0\x13\x60\x00\x00\x00\x00\x00\x00\x00\x12\x8f\x60\x07\x7e\x02\x0c\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xec\xc0\x4f\x80\x01\x00\x00\x00\x00\x00\x00\x48\x3c\x82\x1d\xf8\x09\x30\x00\x00\x00\x00\x00\x00\x00\x89\x47\xf0\x0b\x3f\xa3\x06\x00\x00\x00\x00\x00\x00\x20\xf1\x08\x7e\xe1\x67\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x1e\xc1\x2f\xfc\x8c\x1a\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xf8\x85\x9f\x51\x03\x00\x00\x00\x00\x00\x00\x90\x78\x04\xbf\xf0\x33\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xfc\xc2\xcf\xa8\x01\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x24\x1e\xc1\x2f\xfc\x8c\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x8f\xe0\x17\x7e\x46\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf1\x08\x7e\xe1\x67\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x78\x04\x7b\xe0\x03\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x47\xf0\x0b\x3f\xa3\x06\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x08\x00\x40\x00\x00\x00\x00\x00\x00\x00\x24\x1e\xc1\x2f\xfc\x8c\x1a\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xf8\x85\x9f\x51\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x47\xf0\x0b\x3f\xa3\x06\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x1e\xc1\x2f\xfc\x8c\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x78\x04\xbf\xf0\x33\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x1e\xc1\x2f\xfc\x8c\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x78\x04\xbf\xf0\x33\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xfc\xc2\xcf\xa8\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x78\x04\x3b\xf0\x13\x60\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xfc\xc2\xcf\xa8\x01\x00\x00\x00\x00\x00\x00\x48\x3c\x82\x5f\xf8\x19\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x20\xf1\x08\x7e\xe1\x67\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xf8\x85\x9f\x51\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x8f\xe0\x17\x7e\x46\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x3c\x82\x5f\xf8\x19\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xf8\x85\x9f\x51\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xf8\x85\x9f\x51\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xfc\xc2\xcf\xa8\x01\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x47\xf0\x0b\x3f\xa3\x06\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xfc\xc2\xcf\xa8\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x47\xf0\x0b\x3f\xa3\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xfc\xc2\xcf\xa8\x01\x00\x00\x00\x00\x00\x00\x48\x3c\x82\x5f\xf8\x19\x35\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf1\x08\x7e\xe1\x67\xd4\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x78\x04\xbf\xf0\x33\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xe2\x11\xfc\xc2\xcf\xa8\x01\x00\x00\x00\x00\x00\x00\x48\x3c\x82\x5f\xf8\x19\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x24\x1e\xc1\x2f\xfc\x8c\x1a\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xf8\x85\x9f\x51\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf1\x08\x7e\xe1\x67\xd4\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xc4\x23\xf8\x85\x9f\x51\x03\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++{-# NOINLINE happyExpListPerState #-}+happyExpListPerState st =+    token_strs_expected+  where token_strs = ["error","%dummy","%start_pModule_internal","%start_pLanguageDecl_internal","%start_pLanguage_internal","%start_pCommand_internal","%start_pListCommand_internal","%start_pPattern_internal","%start_pListPattern_internal","%start_pParam_internal","%start_pListParam_internal","%start_pParamDecl_internal","%start_pRestriction_internal","%start_pListRestriction_internal","%start_pTerm7_internal","%start_pTerm5_internal","%start_pTerm4_internal","%start_pTerm3_internal","%start_pTerm2_internal","%start_pTerm1_internal","%start_pTerm6_internal","%start_pTerm_internal","%start_pListTerm_internal","String","VarIdent","HoleIdent","Module","LanguageDecl","Language","Command","ListCommand","Pattern","ListPattern","Param","ListParam","ParamDecl","Restriction","ListRestriction","Term7","Term5","Term4","Term3","Term2","Term1","Term6","Term","ListTerm","'#check'","'#compute'","'#compute-nf'","'#compute-whnf'","'#def'","'#define'","'#lang'","'#postulate'","'#set-option'","'#unset-option'","'('","')'","'*'","'*_1'","','","'->'","'/\\\\'","'0_2'","'1'","'1_2'","'2'","':'","':='","';'","'<'","'<='","'='","'==='","'=_{'","'>'","'BOT'","'CUBE'","'Sigma'","'TOP'","'TOPE'","'U'","'['","'\\\\'","'\\\\/'","']'","'_'","'as'","'first'","'idJ'","'recBOT'","'recOR'","'refl'","'refl_{'","'rzk-1'","'rzk-2'","'second'","'{'","'|'","'|->'","'}'","'\931'","'\8594'","'\8721'","L_quoted","L_VarIdent","L_HoleIdent","%eof"]+        bit_start = st Prelude.* 109+        bit_end = (st Prelude.+ 1) Prelude.* 109+        read_bit = readArrayBit happyExpList+        bits = Prelude.map read_bit [bit_start..bit_end Prelude.- 1]+        bits_indexed = Prelude.zip bits [0..108]+        token_strs_expected = Prelude.concatMap f bits_indexed+        f (Prelude.False, _) = []+        f (Prelude.True, nr) = [token_strs Prelude.!! nr]++happyActOffsets :: HappyAddr+happyActOffsets = HappyA# "\xfc\xff\xfc\xff\xdb\xff\xfb\x04\xfb\x04\x2c\x00\x2c\x00\x58\x00\x58\x00\x7c\x00\x4c\x00\x4c\x00\x50\x01\x04\x01\x04\x01\x04\x01\x04\x01\x4c\x00\x04\x01\x4c\x00\x4c\x00\xd7\xff\x00\x00\x00\x00\x00\x00\xf2\xff\x00\x00\x03\x00\x18\x00\x05\x00\x40\x00\x00\x00\xac\x00\x3f\x00\x15\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x51\x00\x00\x00\x00\x00\x00\x00\x58\x00\x50\x01\x5e\x00\x00\x00\x66\x00\x00\x00\x4c\x00\x50\x01\x39\x00\x77\x00\x78\x00\x00\x00\x00\x00\x4f\x00\xf6\xff\x4c\x00\x26\x00\x4f\x00\x4f\x00\x2a\x01\x4f\x00\x4f\x00\xf8\xff\x4f\x00\x8e\x00\x5b\x00\x6c\x00\x7d\x00\x7d\x00\x2a\x01\x00\x00\x00\x00\x58\x00\x7d\x00\x5c\x00\x00\x00\x5c\x00\x7d\x00\x5c\x00\x7d\x00\x5c\x00\x7d\x00\xfb\x04\x7d\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x8b\x00\x8b\x00\x8b\x00\x97\x00\x97\x00\x98\x00\x98\x00\x00\x00\x00\x00\x98\x00\xdb\xff\x98\x00\xfb\x04\x00\x00\xbb\x00\xbd\x00\xc3\x00\x52\x01\x5f\x01\x60\x01\xc7\x00\xca\x00\xcc\x00\xd1\x00\x00\x00\xe1\x00\x00\x00\xdd\x00\x11\x00\xeb\x00\x00\x00\x00\x00\x4c\x00\x4c\x00\x4c\x00\x04\x01\x04\x01\x4c\x00\x02\x00\x5c\x00\x5c\x00\xf8\x00\x5c\x00\x00\x00\xf1\xff\x4c\x00\x4c\x00\x00\x00\xe5\x00\x5c\x00\x0b\x01\x06\x01\x09\x01\x4c\x00\x4c\x00\x04\x01\x04\x01\x04\x01\x04\x01\x4c\x00\x4c\x00\x00\x00\x00\x00\x13\x01\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x4c\x00\x4c\x00\x14\x01\x4c\x00\x16\x01\x22\x01\xf7\xff\x4c\x00\x00\x00\x08\x00\x4c\x00\x17\x01\x20\x01\x00\x00\x4c\x00\x02\x01\x00\x00\x2a\x01\x00\x00\x00\x00\x12\x01\x4c\x00\x5c\x00\x4c\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x30\x01\x4c\x00\x31\x01\x4c\x00\x32\x01\x4c\x00\x15\x01\x00\x00\x00\x00\x39\x01\x3b\x01\x4c\x00\x45\x01\x4c\x00\x48\x01\x4c\x00\x49\x01\x2b\x01\x61\x01\x62\x01\x00\x00\x04\x01\x65\x01\x4c\x00\x4c\x00\x2f\x00\x4c\x00\x35\x01\x4c\x00\x00\x00\x4c\x00\x00\x00\x4c\x00\x5b\x01\x7b\x01\x7e\x01\x00\x00\x00\x00\x00\x00\x89\x01\x73\x01\x87\x01\x00\x00\x8c\x01\x4c\x00\x00\x00\x8d\x01\x9e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x94\x01\x4c\x00\x95\x01\x4c\x00\x96\x01\x00\x00\x00\x00\x00\x00\xb3\x01\x4c\x00\xb4\x01\x4c\x00\x97\x01\xbe\x01\xc0\x01\x99\x01\x78\x01\x4c\x00\x4c\x00\xc3\x01\x4c\x00\xd1\x01\xd2\x01\x4c\x00\x00\x00\x4c\x00\x4c\x00\x00\x00\xca\x01\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x01\x4c\x00\x4c\x00\x00\x00\xd6\x01\xda\x01\x00\x00\x00\x00\x4c\x00\xd8\x01\x4c\x00\xdc\x01\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\x4e\x00\xf2\x01\xf4\x01\xf1\x01\x6d\x00\xb5\x00\x75\x00\x99\x00\x21\x01\xc8\x00\x09\x02\xb1\x01\x12\x00\xdf\x00\xb3\x00\xc2\x04\x98\x04\x3b\x04\x76\x01\x1f\x02\x8e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x00\x00\x00\x00\x00\x2b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x01\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x02\xa4\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x43\x02\x00\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x4a\x01\x00\x00\x8a\x00\x00\x00\xf1\x00\x00\x00\xf5\x00\x00\x00\x01\x01\x00\x00\xa7\x00\x00\x00\x4f\x02\x5b\x02\x67\x02\x73\x02\xf7\x01\xf9\x01\xfa\x01\xfc\x01\xfd\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x02\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x04\xec\x04\xf0\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x00\x00\x00\x00\xc7\x01\x7f\x02\xdd\x01\xd9\x04\xa4\x04\x8b\x02\x00\x00\x19\x01\x79\x01\x00\x00\xa7\x01\x00\x00\x00\x00\xf3\x01\x97\x02\x00\x00\x00\x00\xa8\x01\x00\x00\x00\x00\x00\x00\xa5\x01\x47\x04\xad\x04\xce\x04\x82\x01\xd7\x04\x53\x04\x5f\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x02\xaf\x02\xbb\x02\x00\x00\x6b\x04\x00\x00\x00\x00\x00\x00\xc7\x02\x00\x00\x00\x00\xd3\x02\x00\x00\x00\x00\x00\x00\xdf\x02\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x00\x00\xeb\x02\xc9\x01\xf7\x02\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x03\x00\x00\x1b\x03\x00\x00\x27\x03\xfe\x01\x00\x00\x00\x00\x00\x00\x00\x00\x33\x03\x00\x00\x3f\x03\x00\x00\x4b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x04\x00\x00\x57\x03\x63\x03\x00\x00\x6f\x03\x00\x00\x7b\x03\x00\x00\x87\x03\x00\x00\x93\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x03\x00\x00\x00\x00\xb7\x03\x00\x00\xc3\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x03\x00\x00\xdb\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x03\xf3\x03\x00\x00\x77\x04\x00\x00\x00\x00\xff\x03\x00\x00\x83\x04\x8f\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x04\x17\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x04\x00\x00\x2f\x04\x00\x00\x00\x00\x00\x00"#++happyAdjustOffset :: Happy_GHC_Exts.Int# -> Happy_GHC_Exts.Int#+happyAdjustOffset off = off++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\xff\xae\xff\xaf\xff\x00\x00\x96\xff\xa8\xff\xa6\xff\xa4\xff\x9e\xff\x94\xff\xab\xff\x93\xff\x00\x00\x00\x00\xbe\xff\xbc\xff\xbf\xff\xbb\xff\xbd\xff\x00\x00\xb9\xff\xc1\xff\x00\x00\xba\xff\xc0\xff\xc2\xff\x00\x00\x00\x00\x00\x00\xb8\xff\x00\x00\xb3\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\xff\xe8\xff\x00\x00\x00\x00\x00\x00\x9e\xff\x00\x00\x00\x00\xab\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc4\xff\x00\x00\x00\x00\x00\x00\x00\x00\xcb\xff\xd4\xff\xd0\xff\xcd\xff\x00\x00\x00\x00\xd5\xff\x00\x00\x00\x00\xd2\xff\x00\x00\x00\x00\x00\x00\xd7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xff\xe4\xff\x00\x00\x00\x00\x00\x00\xd7\xff\xe7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\xff\x00\x00\xd1\xff\x00\x00\xd2\xff\x00\x00\xcc\xff\x99\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\xff\x00\x00\x00\x00\x00\x00\x98\xff\x00\x00\x00\x00\x00\x00\xae\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\xff\xa3\xff\xaa\xff\xa9\xff\xa7\xff\xa5\xff\x95\xff\x92\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xff\x00\x00\x00\x00\x00\x00\x00\x00\xad\xff\x00\x00\x00\x00\xa0\xff\xac\xff\xc3\xff\xc5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xff\xde\xff\xdf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xff\xe6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\xff\x00\x00\x9f\xff\x00\x00\x00\x00\x00\x00\x00\x00\xca\xff\xc8\xff\xb5\xff\x00\x00\x00\x00\x00\x00\xb1\xff\x00\x00\x00\x00\xc9\xff\x00\x00\x00\x00\xb4\xff\xa1\xff\xcf\xff\xd3\xff\x00\x00\xe1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\xff\xe3\xff\xdd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xff\x00\x00\x00\x00\xce\xff\x00\x00\xd8\xff\x00\x00\xda\xff\xdb\xff\xd9\xff\x9b\xff\x9c\xff\x00\x00\x00\x00\x00\x00\xa2\xff\x00\x00\x00\x00\xc7\xff\xb6\xff\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xff"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x0b\x00\x10\x00\x07\x00\x0e\x00\x0d\x00\x0f\x00\x16\x00\x12\x00\x13\x00\x14\x00\x15\x00\x31\x00\x32\x00\x0c\x00\x19\x00\x0d\x00\x0f\x00\x3b\x00\x01\x00\x02\x00\x1f\x00\x20\x00\x0f\x00\x22\x00\x23\x00\x24\x00\x25\x00\x0b\x00\x1a\x00\x16\x00\x1c\x00\x0f\x00\x0f\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x0b\x00\x37\x00\x11\x00\x0e\x00\x39\x00\x27\x00\x36\x00\x12\x00\x13\x00\x14\x00\x15\x00\x3c\x00\x3d\x00\x3e\x00\x19\x00\x3e\x00\x0b\x00\x01\x00\x02\x00\x29\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x1b\x00\x26\x00\x1d\x00\x0b\x00\x29\x00\x0f\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x3c\x00\x0f\x00\x33\x00\x34\x00\x03\x00\x04\x00\x3e\x00\x38\x00\x29\x00\x3a\x00\x0b\x00\x3c\x00\x3d\x00\x0e\x00\x1b\x00\x0b\x00\x1d\x00\x12\x00\x13\x00\x14\x00\x15\x00\x29\x00\x0b\x00\x35\x00\x19\x00\x37\x00\x0b\x00\x3c\x00\x0b\x00\x2a\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x0b\x00\x26\x00\x06\x00\x07\x00\x3c\x00\x01\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x08\x00\x09\x00\x33\x00\x34\x00\x29\x00\x0b\x00\x0b\x00\x38\x00\x29\x00\x3a\x00\x0b\x00\x3c\x00\x3d\x00\x0e\x00\x01\x00\x34\x00\x3e\x00\x12\x00\x13\x00\x14\x00\x15\x00\x08\x00\x09\x00\x3c\x00\x19\x00\x01\x00\x02\x00\x3c\x00\x3e\x00\x01\x00\x1f\x00\x20\x00\x0f\x00\x22\x00\x23\x00\x24\x00\x08\x00\x36\x00\x0a\x00\x0f\x00\x01\x00\x02\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x06\x00\x07\x00\x33\x00\x34\x00\x06\x00\x07\x00\x0f\x00\x01\x00\x02\x00\x01\x00\x0b\x00\x3c\x00\x3d\x00\x0e\x00\x3e\x00\x10\x00\x08\x00\x12\x00\x13\x00\x14\x00\x15\x00\x0f\x00\x10\x00\x11\x00\x19\x00\x01\x00\x3c\x00\x15\x00\x01\x00\x02\x00\x1f\x00\x20\x00\x08\x00\x22\x00\x23\x00\x24\x00\x25\x00\x3b\x00\x18\x00\x0c\x00\x18\x00\x3e\x00\x0f\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x15\x00\x1b\x00\x18\x00\x01\x00\x02\x00\x18\x00\x0b\x00\x18\x00\x39\x00\x0e\x00\x16\x00\x3c\x00\x3d\x00\x12\x00\x13\x00\x14\x00\x15\x00\x0f\x00\x10\x00\x0f\x00\x19\x00\x01\x00\x16\x00\x15\x00\x10\x00\x01\x00\x1f\x00\x20\x00\x08\x00\x22\x00\x23\x00\x24\x00\x08\x00\x09\x00\x01\x00\x02\x00\x16\x00\x01\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x08\x00\x0c\x00\x33\x00\x34\x00\x0f\x00\x16\x00\x0b\x00\x01\x00\x02\x00\x0e\x00\x15\x00\x3c\x00\x3d\x00\x12\x00\x13\x00\x14\x00\x15\x00\x01\x00\x10\x00\x16\x00\x19\x00\x0f\x00\x16\x00\x0d\x00\x08\x00\x01\x00\x1f\x00\x20\x00\x0f\x00\x22\x00\x23\x00\x24\x00\x08\x00\x16\x00\x0a\x00\x0b\x00\x16\x00\x0c\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x0b\x00\x16\x00\x33\x00\x0e\x00\x37\x00\x28\x00\x01\x00\x12\x00\x13\x00\x14\x00\x15\x00\x3c\x00\x3d\x00\x08\x00\x19\x00\x0a\x00\x0b\x00\x16\x00\x16\x00\x16\x00\x1f\x00\x20\x00\x01\x00\x22\x00\x23\x00\x24\x00\x25\x00\x3b\x00\x18\x00\x08\x00\x18\x00\x0a\x00\x0b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x0b\x00\x17\x00\x0b\x00\x0e\x00\x17\x00\x35\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x3c\x00\x3d\x00\x16\x00\x19\x00\x0b\x00\x0b\x00\x37\x00\x0c\x00\x0c\x00\x1f\x00\x20\x00\x0c\x00\x22\x00\x23\x00\x24\x00\x16\x00\x16\x00\x01\x00\x02\x00\x1e\x00\x01\x00\x29\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x08\x00\x0f\x00\x01\x00\x02\x00\x0f\x00\x34\x00\x0c\x00\x29\x00\x29\x00\x0c\x00\x15\x00\x3c\x00\x3d\x00\x3c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x34\x00\x34\x00\x0c\x00\x0f\x00\x15\x00\x0c\x00\x0c\x00\x0c\x00\x3c\x00\x3c\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x01\x00\x02\x00\x01\x00\x01\x00\x0c\x00\x17\x00\x17\x00\x35\x00\x18\x00\x08\x00\x08\x00\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x01\x00\x02\x00\x01\x00\x18\x00\x18\x00\x0f\x00\x37\x00\x0f\x00\x37\x00\x08\x00\x0f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x01\x00\x02\x00\x0f\x00\x0f\x00\x18\x00\x18\x00\x37\x00\x0f\x00\x0c\x00\x0f\x00\x0c\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x01\x00\x02\x00\x04\x00\x06\x00\x01\x00\x05\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x01\x00\x02\x00\x05\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0c\x00\x0d\x00\xff\xff\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xff\xff\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xff\xff\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xff\xff\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xff\xff\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xff\xff\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xff\xff\xff\xff\x0c\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x01\x00\x02\x00\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\xff\xff\x15\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\xff\xff\x15\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\xff\xff\x15\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\xff\xff\x15\x00\x01\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\xff\xff\xff\xff\x15\x00\x01\x00\x02\x00\x01\x00\x02\x00\xff\xff\x0f\x00\x10\x00\x11\x00\x12\x00\xff\xff\xff\xff\x15\x00\xff\xff\xff\xff\x0f\x00\x10\x00\x0f\x00\x01\x00\xff\xff\xff\xff\x15\x00\x01\x00\x15\x00\xff\xff\x08\x00\x01\x00\x0a\x00\x0b\x00\x08\x00\xff\xff\x0a\x00\x0b\x00\x08\x00\xff\xff\x0a\x00\x0b\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++happyTable :: HappyAddr+happyTable = HappyA# "\x00\x00\x40\x00\x9c\x00\x6b\x00\x25\x00\x84\x00\xdf\x00\xae\x00\x26\x00\x27\x00\x28\x00\x29\x00\x68\x00\x69\x00\xb4\x00\x2a\x00\x84\x00\xb5\x00\x17\x00\x17\x00\x18\x00\x2b\x00\x2c\x00\xbd\x00\x2e\x00\x2f\x00\x30\x00\x81\x00\x59\x00\x9a\x00\xdd\x00\x9b\x00\xbd\x00\x47\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x24\x00\xaf\x00\x99\x00\x25\x00\x9d\x00\x98\x00\x82\x00\x26\x00\x27\x00\x28\x00\x29\x00\x3c\x00\x3d\x00\xff\xff\x2a\x00\xff\xff\x59\x00\x17\x00\x18\x00\x54\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x85\x00\x31\x00\x86\x00\x8b\x00\x95\x00\x7f\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x3c\x00\x96\x00\x38\x00\x39\x00\x6b\x00\x6c\x00\xff\xff\x3a\x00\x54\x00\x3b\x00\x24\x00\x3c\x00\x3d\x00\x25\x00\x85\x00\x92\x00\x86\x00\x26\x00\x27\x00\x28\x00\x29\x00\x54\x00\x53\x00\xef\x00\x2a\x00\xf0\x00\x59\x00\x3c\x00\x8f\x00\x97\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x8e\x00\x31\x00\x5a\x00\x5b\x00\x3c\x00\x4e\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x56\x00\x57\x00\x38\x00\x39\x00\x54\x00\x89\x00\x88\x00\x3a\x00\x54\x00\x3b\x00\x24\x00\x3c\x00\x3d\x00\x25\x00\x4e\x00\x55\x00\xff\xff\x26\x00\x27\x00\x28\x00\x29\x00\x7c\x00\x7d\x00\x3c\x00\x2a\x00\x17\x00\x18\x00\x3c\x00\xff\xff\x4e\x00\x2b\x00\x2c\x00\x83\x00\x2e\x00\x2f\x00\x30\x00\x4f\x00\x82\x00\x55\x00\x8f\x00\x17\x00\x18\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x5a\x00\x78\x00\x38\x00\x39\x00\x5a\x00\x6d\x00\x8b\x00\x17\x00\x18\x00\x4e\x00\x40\x00\x3c\x00\x3d\x00\x25\x00\xff\xff\xcb\xff\x59\x00\x26\x00\x27\x00\x28\x00\x29\x00\x1a\x00\x1b\x00\x45\x00\x2a\x00\x4e\x00\x3c\x00\x43\x00\x17\x00\x18\x00\x2b\x00\x2c\x00\x89\x00\x2e\x00\x2f\x00\x30\x00\x81\x00\x17\x00\xcb\x00\x4c\x00\xca\x00\xff\xff\x1a\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x4d\x00\xc9\x00\xc2\x00\x17\x00\x18\x00\xc1\x00\x24\x00\xc0\x00\xcb\xff\x25\x00\xbf\x00\x3c\x00\x3d\x00\x26\x00\x27\x00\x28\x00\x29\x00\x1a\x00\x46\x00\xbd\x00\x2a\x00\x4e\x00\xbe\x00\x43\x00\xaa\x00\x4e\x00\x2b\x00\x2c\x00\x7b\x00\x2e\x00\x2f\x00\x30\x00\x56\x00\x7a\x00\x17\x00\x18\x00\xbc\x00\x4e\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x79\x00\x92\x00\x38\x00\x39\x00\x1a\x00\xb1\x00\x40\x00\x17\x00\x18\x00\x25\x00\x4d\x00\x3c\x00\x3d\x00\x26\x00\x27\x00\x28\x00\x29\x00\x4e\x00\xa8\x00\xa7\x00\x2a\x00\x7f\x00\xa6\x00\x84\x00\xb2\x00\x4e\x00\x2b\x00\x2c\x00\xe1\x00\x2e\x00\x2f\x00\x30\x00\x4f\x00\xe3\x00\x50\x00\x51\x00\xdb\x00\xe0\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x40\x00\xda\x00\x38\x00\x25\x00\xd8\x00\xd7\x00\x4e\x00\x26\x00\x27\x00\x28\x00\x29\x00\x3c\x00\x3d\x00\x4f\x00\x2a\x00\x50\x00\x90\x00\xd2\x00\xd0\x00\xce\x00\x2b\x00\x2c\x00\x4e\x00\x2e\x00\x2f\x00\x30\x00\x81\x00\x17\x00\xff\x00\x4f\x00\xfe\x00\x50\x00\x7e\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x40\x00\xfc\x00\x53\x00\x25\x00\xfa\x00\xf7\x00\xf8\x00\x26\x00\x27\x00\x28\x00\x29\x00\x3c\x00\x3d\x00\xc8\x00\x2a\x00\x53\x00\x53\x00\xed\x00\xf6\x00\xf5\x00\x2b\x00\x2c\x00\xf3\x00\x2e\x00\x2f\x00\x30\x00\xc6\x00\xc4\x00\x17\x00\x18\x00\xe9\x00\x4e\x00\x54\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xb1\x00\x0b\x01\x17\x00\x18\x00\x1a\x00\x55\x00\xe8\x00\x54\x00\x54\x00\xe7\x00\x3e\x00\x3c\x00\x3d\x00\x3c\x00\x17\x00\x18\x00\x1a\x00\xa0\x00\x55\x00\x55\x00\x0c\x01\x0a\x01\x43\x00\x09\x01\x07\x01\x19\x00\x3c\x00\x3c\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x17\x00\x18\x00\x4e\x00\x4e\x00\x06\x01\x04\x01\x02\x01\x10\x01\x00\x01\xaf\x00\xa8\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\xa4\x00\x19\x00\x48\x00\x49\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x4a\x00\x17\x00\x18\x00\x4e\x00\x18\x01\x16\x01\x13\x01\x14\x01\x12\x01\x11\x01\xd4\x00\x0d\x01\x19\x00\x48\x00\xba\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x4a\x00\x17\x00\x18\x00\x1f\x01\x1e\x01\x1a\x01\x19\x01\x23\x01\x25\x01\x24\x01\x27\x01\x29\x01\x19\x00\x48\x00\xb8\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x4a\x00\x17\x00\x18\x00\x69\x00\x65\x00\x73\x00\x66\x00\x72\x00\x71\x00\x70\x00\x6f\x00\xcb\x00\x19\x00\x48\x00\xab\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xac\x00\x17\x00\x18\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x4b\x00\x00\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x4a\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x93\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x3d\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x86\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x8c\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x86\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x77\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x76\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x75\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x74\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xb9\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xb5\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xaa\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xe5\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xe4\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xe3\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xdd\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xdb\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xd8\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xd5\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xd3\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xd2\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xd0\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xce\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xcc\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xfc\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xfa\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xf8\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xf1\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xf0\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xed\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xeb\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xea\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xe9\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x07\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x04\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x02\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x00\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x16\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x14\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x0e\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x0d\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x1c\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x20\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x25\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x27\x01\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x40\x00\x41\x00\x20\x00\x00\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x40\x00\xa3\x00\x20\x00\x00\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x40\x00\x9e\x00\x20\x00\x00\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x40\x00\x9d\x00\x20\x00\x00\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x40\x00\xe1\x00\x20\x00\x00\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x40\x00\x1f\x01\x20\x00\x00\x00\x00\x00\x19\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x40\x00\x1b\x01\x20\x00\x17\x00\x18\x00\x19\x00\x00\x00\x00\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x40\x00\x1a\x01\x20\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x42\x00\x00\x00\x43\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\xb6\x00\x00\x00\x43\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\xa2\x00\x00\x00\x43\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\xf3\x00\x00\x00\x43\x00\x17\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x44\x00\x00\x00\x00\x00\x43\x00\x17\x00\x18\x00\x17\x00\x18\x00\x00\x00\x1a\x00\x1b\x00\x1c\x00\xa1\x00\x00\x00\x00\x00\x43\x00\x00\x00\x00\x00\x1a\x00\x9f\x00\x1a\x00\x4e\x00\x00\x00\x00\x00\x43\x00\x4e\x00\xb7\x00\x00\x00\x4f\x00\x4e\x00\x50\x00\xc6\x00\x4f\x00\x00\x00\x50\x00\xc4\x00\x4f\x00\x00\x00\x50\x00\xc2\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x00\x00\x63\x00\x64\x00\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyReduceArr = Happy_Data_Array.array (21, 109) [+	(21 , happyReduce_21),+	(22 , happyReduce_22),+	(23 , happyReduce_23),+	(24 , happyReduce_24),+	(25 , happyReduce_25),+	(26 , happyReduce_26),+	(27 , happyReduce_27),+	(28 , happyReduce_28),+	(29 , happyReduce_29),+	(30 , happyReduce_30),+	(31 , happyReduce_31),+	(32 , happyReduce_32),+	(33 , happyReduce_33),+	(34 , happyReduce_34),+	(35 , happyReduce_35),+	(36 , happyReduce_36),+	(37 , happyReduce_37),+	(38 , happyReduce_38),+	(39 , happyReduce_39),+	(40 , happyReduce_40),+	(41 , happyReduce_41),+	(42 , happyReduce_42),+	(43 , happyReduce_43),+	(44 , happyReduce_44),+	(45 , happyReduce_45),+	(46 , happyReduce_46),+	(47 , happyReduce_47),+	(48 , happyReduce_48),+	(49 , happyReduce_49),+	(50 , happyReduce_50),+	(51 , happyReduce_51),+	(52 , happyReduce_52),+	(53 , happyReduce_53),+	(54 , happyReduce_54),+	(55 , happyReduce_55),+	(56 , happyReduce_56),+	(57 , happyReduce_57),+	(58 , happyReduce_58),+	(59 , happyReduce_59),+	(60 , happyReduce_60),+	(61 , happyReduce_61),+	(62 , happyReduce_62),+	(63 , happyReduce_63),+	(64 , happyReduce_64),+	(65 , happyReduce_65),+	(66 , happyReduce_66),+	(67 , happyReduce_67),+	(68 , happyReduce_68),+	(69 , happyReduce_69),+	(70 , happyReduce_70),+	(71 , happyReduce_71),+	(72 , happyReduce_72),+	(73 , happyReduce_73),+	(74 , happyReduce_74),+	(75 , happyReduce_75),+	(76 , happyReduce_76),+	(77 , happyReduce_77),+	(78 , happyReduce_78),+	(79 , happyReduce_79),+	(80 , happyReduce_80),+	(81 , happyReduce_81),+	(82 , happyReduce_82),+	(83 , happyReduce_83),+	(84 , happyReduce_84),+	(85 , happyReduce_85),+	(86 , happyReduce_86),+	(87 , happyReduce_87),+	(88 , happyReduce_88),+	(89 , happyReduce_89),+	(90 , happyReduce_90),+	(91 , happyReduce_91),+	(92 , happyReduce_92),+	(93 , happyReduce_93),+	(94 , happyReduce_94),+	(95 , happyReduce_95),+	(96 , happyReduce_96),+	(97 , happyReduce_97),+	(98 , happyReduce_98),+	(99 , happyReduce_99),+	(100 , happyReduce_100),+	(101 , happyReduce_101),+	(102 , happyReduce_102),+	(103 , happyReduce_103),+	(104 , happyReduce_104),+	(105 , happyReduce_105),+	(106 , happyReduce_106),+	(107 , happyReduce_107),+	(108 , happyReduce_108),+	(109 , happyReduce_109)+	]++happy_n_terms = 63 :: Prelude.Int+happy_n_nonterms = 24 :: Prelude.Int++happyReduce_21 = happySpecReduce_1  0# happyReduction_21+happyReduction_21 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn24+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), ((\(PT _ (TL s)) -> s) happy_var_1))+	)}++happyReduce_22 = happySpecReduce_1  1# happyReduction_22+happyReduction_22 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn25+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.VarIdent (tokenText happy_var_1))+	)}++happyReduce_23 = happySpecReduce_1  2# happyReduction_23+happyReduction_23 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn26+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.HoleIdent (tokenText happy_var_1))+	)}++happyReduce_24 = happySpecReduce_2  3# happyReduction_24+happyReduction_24 happy_x_2+	happy_x_1+	 =  case happyOut28 happy_x_1 of { (HappyWrap28 happy_var_1) -> +	case happyOut31 happy_x_2 of { (HappyWrap31 happy_var_2) -> +	happyIn27+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.Module (fst happy_var_1) (snd happy_var_1) (snd happy_var_2))+	)}}++happyReduce_25 = happySpecReduce_3  4# happyReduction_25+happyReduction_25 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut29 happy_x_2 of { (HappyWrap29 happy_var_2) -> +	happyIn28+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.LanguageDecl (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2))+	)}}++happyReduce_26 = happySpecReduce_1  5# happyReduction_26+happyReduction_26 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn29+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.Rzk1 (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_27 = happySpecReduce_1  5# happyReduction_27+happyReduction_27 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn29+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.Rzk2 (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_28 = happyReduce 5# 6# happyReduction_28+happyReduction_28 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut24 happy_x_2 of { (HappyWrap24 happy_var_2) -> +	case happyOut24 happy_x_4 of { (HappyWrap24 happy_var_4) -> +	happyIn30+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.CommandSetOption (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4))+	) `HappyStk` happyRest}}}++happyReduce_29 = happySpecReduce_3  6# happyReduction_29+happyReduction_29 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut24 happy_x_2 of { (HappyWrap24 happy_var_2) -> +	happyIn30+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.CommandUnsetOption (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2))+	)}}++happyReduce_30 = happyReduce 5# 6# happyReduction_30+happyReduction_30 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut46 happy_x_2 of { (HappyWrap46 happy_var_2) -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	happyIn30+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.CommandCheck (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4))+	) `HappyStk` happyRest}}}++happyReduce_31 = happySpecReduce_3  6# happyReduction_31+happyReduction_31 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut46 happy_x_2 of { (HappyWrap46 happy_var_2) -> +	happyIn30+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.CommandCompute (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2))+	)}}++happyReduce_32 = happySpecReduce_3  6# happyReduction_32+happyReduction_32 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut46 happy_x_2 of { (HappyWrap46 happy_var_2) -> +	happyIn30+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.CommandComputeWHNF (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2))+	)}}++happyReduce_33 = happySpecReduce_3  6# happyReduction_33+happyReduction_33 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut46 happy_x_2 of { (HappyWrap46 happy_var_2) -> +	happyIn30+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.CommandComputeNF (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2))+	)}}++happyReduce_34 = happyReduce 6# 6# happyReduction_34+happyReduction_34 (happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut25 happy_x_2 of { (HappyWrap25 happy_var_2) -> +	case happyOut35 happy_x_3 of { (HappyWrap35 happy_var_3) -> +	case happyOut46 happy_x_5 of { (HappyWrap46 happy_var_5) -> +	happyIn30+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.CommandPostulate (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_3) (snd happy_var_5))+	) `HappyStk` happyRest}}}}++happyReduce_35 = happyReduce 5# 6# happyReduction_35+happyReduction_35 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut25 happy_x_2 of { (HappyWrap25 happy_var_2) -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	happyIn30+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.commandPostulateNoParams (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4))+	) `HappyStk` happyRest}}}++happyReduce_36 = happyReduce 8# 6# happyReduction_36+happyReduction_36 (happy_x_8 `HappyStk`+	happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut25 happy_x_2 of { (HappyWrap25 happy_var_2) -> +	case happyOut35 happy_x_3 of { (HappyWrap35 happy_var_3) -> +	case happyOut46 happy_x_5 of { (HappyWrap46 happy_var_5) -> +	case happyOut46 happy_x_7 of { (HappyWrap46 happy_var_7) -> +	happyIn30+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.CommandDefine (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_3) (snd happy_var_5) (snd happy_var_7))+	) `HappyStk` happyRest}}}}}++happyReduce_37 = happyReduce 7# 6# happyReduction_37+happyReduction_37 (happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut25 happy_x_2 of { (HappyWrap25 happy_var_2) -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	case happyOut46 happy_x_6 of { (HappyWrap46 happy_var_6) -> +	happyIn30+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.commandDefineNoParams (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4) (snd happy_var_6))+	) `HappyStk` happyRest}}}}++happyReduce_38 = happyReduce 8# 6# happyReduction_38+happyReduction_38 (happy_x_8 `HappyStk`+	happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut25 happy_x_2 of { (HappyWrap25 happy_var_2) -> +	case happyOut35 happy_x_3 of { (HappyWrap35 happy_var_3) -> +	case happyOut46 happy_x_5 of { (HappyWrap46 happy_var_5) -> +	case happyOut46 happy_x_7 of { (HappyWrap46 happy_var_7) -> +	happyIn30+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.commandDef (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_3) (snd happy_var_5) (snd happy_var_7))+	) `HappyStk` happyRest}}}}}++happyReduce_39 = happyReduce 7# 6# happyReduction_39+happyReduction_39 (happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut25 happy_x_2 of { (HappyWrap25 happy_var_2) -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	case happyOut46 happy_x_6 of { (HappyWrap46 happy_var_6) -> +	happyIn30+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.commandDefNoParams (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4) (snd happy_var_6))+	) `HappyStk` happyRest}}}}++happyReduce_40 = happySpecReduce_0  7# happyReduction_40+happyReduction_40  =  happyIn31+		 ((Language.Rzk.Syntax.Abs.BNFC'NoPosition, [])+	)++happyReduce_41 = happySpecReduce_2  7# happyReduction_41+happyReduction_41 happy_x_2+	happy_x_1+	 =  case happyOut30 happy_x_1 of { (HappyWrap30 happy_var_1) -> +	case happyOut31 happy_x_2 of { (HappyWrap31 happy_var_2) -> +	happyIn31+		 ((fst happy_var_1, (:) (snd happy_var_1) (snd happy_var_2))+	)}}++happyReduce_42 = happySpecReduce_1  8# happyReduction_42+happyReduction_42 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn32+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.PatternWildcard (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_43 = happySpecReduce_1  8# happyReduction_43+happyReduction_43 happy_x_1+	 =  case happyOut25 happy_x_1 of { (HappyWrap25 happy_var_1) -> +	happyIn32+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.PatternVar (fst happy_var_1) (snd happy_var_1))+	)}++happyReduce_44 = happyReduce 5# 8# happyReduction_44+happyReduction_44 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut32 happy_x_2 of { (HappyWrap32 happy_var_2) -> +	case happyOut32 happy_x_4 of { (HappyWrap32 happy_var_4) -> +	happyIn32+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.PatternPair (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4))+	) `HappyStk` happyRest}}}++happyReduce_45 = happySpecReduce_1  9# happyReduction_45+happyReduction_45 happy_x_1+	 =  case happyOut32 happy_x_1 of { (HappyWrap32 happy_var_1) -> +	happyIn33+		 ((fst happy_var_1, (:[]) (snd happy_var_1))+	)}++happyReduce_46 = happySpecReduce_2  9# happyReduction_46+happyReduction_46 happy_x_2+	happy_x_1+	 =  case happyOut32 happy_x_1 of { (HappyWrap32 happy_var_1) -> +	case happyOut33 happy_x_2 of { (HappyWrap33 happy_var_2) -> +	happyIn33+		 ((fst happy_var_1, (:) (snd happy_var_1) (snd happy_var_2))+	)}}++happyReduce_47 = happySpecReduce_1  10# happyReduction_47+happyReduction_47 happy_x_1+	 =  case happyOut32 happy_x_1 of { (HappyWrap32 happy_var_1) -> +	happyIn34+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.ParamPattern (fst happy_var_1) (snd happy_var_1))+	)}++happyReduce_48 = happyReduce 5# 10# happyReduction_48+happyReduction_48 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut33 happy_x_2 of { (HappyWrap33 happy_var_2) -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	happyIn34+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.ParamPatternType (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4))+	) `HappyStk` happyRest}}}++happyReduce_49 = happyReduce 7# 10# happyReduction_49+happyReduction_49 (happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut32 happy_x_2 of { (HappyWrap32 happy_var_2) -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	case happyOut46 happy_x_6 of { (HappyWrap46 happy_var_6) -> +	happyIn34+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.ParamPatternShape (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4) (snd happy_var_6))+	) `HappyStk` happyRest}}}}++happyReduce_50 = happySpecReduce_1  11# happyReduction_50+happyReduction_50 happy_x_1+	 =  case happyOut34 happy_x_1 of { (HappyWrap34 happy_var_1) -> +	happyIn35+		 ((fst happy_var_1, (:[]) (snd happy_var_1))+	)}++happyReduce_51 = happySpecReduce_2  11# happyReduction_51+happyReduction_51 happy_x_2+	happy_x_1+	 =  case happyOut34 happy_x_1 of { (HappyWrap34 happy_var_1) -> +	case happyOut35 happy_x_2 of { (HappyWrap35 happy_var_2) -> +	happyIn35+		 ((fst happy_var_1, (:) (snd happy_var_1) (snd happy_var_2))+	)}}++happyReduce_52 = happySpecReduce_1  12# happyReduction_52+happyReduction_52 happy_x_1+	 =  case happyOut45 happy_x_1 of { (HappyWrap45 happy_var_1) -> +	happyIn36+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.ParamType (fst happy_var_1) (snd happy_var_1))+	)}++happyReduce_53 = happyReduce 5# 12# happyReduction_53+happyReduction_53 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	happyIn36+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.ParamWildcardType (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_4))+	) `HappyStk` happyRest}}++happyReduce_54 = happyReduce 5# 12# happyReduction_54+happyReduction_54 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut32 happy_x_2 of { (HappyWrap32 happy_var_2) -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	happyIn36+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.ParamVarType (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4))+	) `HappyStk` happyRest}}}++happyReduce_55 = happyReduce 5# 12# happyReduction_55+happyReduction_55 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut25 happy_x_2 of { (HappyWrap25 happy_var_2) -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	happyIn36+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.paramVarType (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4))+	) `HappyStk` happyRest}}}++happyReduce_56 = happyReduce 9# 12# happyReduction_56+happyReduction_56 (happy_x_9 `HappyStk`+	happy_x_8 `HappyStk`+	happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut32 happy_x_3 of { (HappyWrap32 happy_var_3) -> +	case happyOut46 happy_x_5 of { (HappyWrap46 happy_var_5) -> +	case happyOut46 happy_x_8 of { (HappyWrap46 happy_var_8) -> +	happyIn36+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.ParamVarShape (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_3) (snd happy_var_5) (snd happy_var_8))+	) `HappyStk` happyRest}}}}++happyReduce_57 = happyReduce 7# 12# happyReduction_57+happyReduction_57 (happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut32 happy_x_2 of { (HappyWrap32 happy_var_2) -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	case happyOut46 happy_x_6 of { (HappyWrap46 happy_var_6) -> +	happyIn36+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.paramVarShape (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4) (snd happy_var_6))+	) `HappyStk` happyRest}}}}++happyReduce_58 = happySpecReduce_3  13# happyReduction_58+happyReduction_58 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut46 happy_x_1 of { (HappyWrap46 happy_var_1) -> +	case happyOut46 happy_x_3 of { (HappyWrap46 happy_var_3) -> +	happyIn37+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.Restriction (fst happy_var_1) (snd happy_var_1) (snd happy_var_3))+	)}}++happyReduce_59 = happySpecReduce_1  14# happyReduction_59+happyReduction_59 happy_x_1+	 =  case happyOut37 happy_x_1 of { (HappyWrap37 happy_var_1) -> +	happyIn38+		 ((fst happy_var_1, (:[]) (snd happy_var_1))+	)}++happyReduce_60 = happySpecReduce_3  14# happyReduction_60+happyReduction_60 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut37 happy_x_1 of { (HappyWrap37 happy_var_1) -> +	case happyOut38 happy_x_3 of { (HappyWrap38 happy_var_3) -> +	happyIn38+		 ((fst happy_var_1, (:) (snd happy_var_1) (snd happy_var_3))+	)}}++happyReduce_61 = happySpecReduce_1  15# happyReduction_61+happyReduction_61 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.Universe (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_62 = happySpecReduce_1  15# happyReduction_62+happyReduction_62 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.UniverseCube (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_63 = happySpecReduce_1  15# happyReduction_63+happyReduction_63 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.UniverseTope (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_64 = happySpecReduce_1  15# happyReduction_64+happyReduction_64 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.CubeUnit (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_65 = happySpecReduce_1  15# happyReduction_65+happyReduction_65 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.CubeUnitStar (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_66 = happySpecReduce_1  15# happyReduction_66+happyReduction_66 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.Cube2 (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_67 = happySpecReduce_1  15# happyReduction_67+happyReduction_67 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.Cube2_0 (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_68 = happySpecReduce_1  15# happyReduction_68+happyReduction_68 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.Cube2_1 (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_69 = happySpecReduce_1  15# happyReduction_69+happyReduction_69 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.TopeTop (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_70 = happySpecReduce_1  15# happyReduction_70+happyReduction_70 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.TopeBottom (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_71 = happySpecReduce_1  15# happyReduction_71+happyReduction_71 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.RecBottom (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_72 = happyReduce 4# 15# happyReduction_72+happyReduction_72 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut38 happy_x_3 of { (HappyWrap38 happy_var_3) -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.RecOr (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_3))+	) `HappyStk` happyRest}}++happyReduce_73 = happyReduce 10# 15# happyReduction_73+happyReduction_73 (happy_x_10 `HappyStk`+	happy_x_9 `HappyStk`+	happy_x_8 `HappyStk`+	happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut46 happy_x_3 of { (HappyWrap46 happy_var_3) -> +	case happyOut46 happy_x_5 of { (HappyWrap46 happy_var_5) -> +	case happyOut46 happy_x_7 of { (HappyWrap46 happy_var_7) -> +	case happyOut46 happy_x_9 of { (HappyWrap46 happy_var_9) -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.recOr (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_3) (snd happy_var_5) (snd happy_var_7) (snd happy_var_9))+	) `HappyStk` happyRest}}}}}++happyReduce_74 = happyReduce 5# 15# happyReduction_74+happyReduction_74 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut36 happy_x_2 of { (HappyWrap36 happy_var_2) -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.typeExtension (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4))+	) `HappyStk` happyRest}}}++happyReduce_75 = happyReduce 5# 15# happyReduction_75+happyReduction_75 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut46 happy_x_2 of { (HappyWrap46 happy_var_2) -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.Pair (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4))+	) `HappyStk` happyRest}}}++happyReduce_76 = happySpecReduce_1  15# happyReduction_76+happyReduction_76 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.Refl (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)))+	)}++happyReduce_77 = happySpecReduce_3  15# happyReduction_77+happyReduction_77 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut46 happy_x_2 of { (HappyWrap46 happy_var_2) -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.ReflTerm (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2))+	)}}++happyReduce_78 = happyReduce 5# 15# happyReduction_78+happyReduction_78 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut46 happy_x_2 of { (HappyWrap46 happy_var_2) -> +	case happyOut46 happy_x_4 of { (HappyWrap46 happy_var_4) -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.ReflTermType (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4))+	) `HappyStk` happyRest}}}++happyReduce_79 = happyReduce 14# 15# happyReduction_79+happyReduction_79 (happy_x_14 `HappyStk`+	happy_x_13 `HappyStk`+	happy_x_12 `HappyStk`+	happy_x_11 `HappyStk`+	happy_x_10 `HappyStk`+	happy_x_9 `HappyStk`+	happy_x_8 `HappyStk`+	happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut46 happy_x_3 of { (HappyWrap46 happy_var_3) -> +	case happyOut46 happy_x_5 of { (HappyWrap46 happy_var_5) -> +	case happyOut46 happy_x_7 of { (HappyWrap46 happy_var_7) -> +	case happyOut46 happy_x_9 of { (HappyWrap46 happy_var_9) -> +	case happyOut46 happy_x_11 of { (HappyWrap46 happy_var_11) -> +	case happyOut46 happy_x_13 of { (HappyWrap46 happy_var_13) -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.IdJ (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_3) (snd happy_var_5) (snd happy_var_7) (snd happy_var_9) (snd happy_var_11) (snd happy_var_13))+	) `HappyStk` happyRest}}}}}}}++happyReduce_80 = happySpecReduce_1  15# happyReduction_80+happyReduction_80 happy_x_1+	 =  case happyOut26 happy_x_1 of { (HappyWrap26 happy_var_1) -> +	happyIn39+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.Hole (fst happy_var_1) (snd happy_var_1))+	)}++happyReduce_81 = happySpecReduce_1  15# happyReduction_81+happyReduction_81 happy_x_1+	 =  case happyOut25 happy_x_1 of { (HappyWrap25 happy_var_1) -> +	happyIn39+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.Var (fst happy_var_1) (snd happy_var_1))+	)}++happyReduce_82 = happySpecReduce_3  15# happyReduction_82+happyReduction_82 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut46 happy_x_2 of { (HappyWrap46 happy_var_2) -> +	happyIn39+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), (snd happy_var_2))+	)}}++happyReduce_83 = happySpecReduce_3  16# happyReduction_83+happyReduction_83 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut40 happy_x_1 of { (HappyWrap40 happy_var_1) -> +	case happyOut45 happy_x_3 of { (HappyWrap45 happy_var_3) -> +	happyIn40+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.CubeProduct (fst happy_var_1) (snd happy_var_1) (snd happy_var_3))+	)}}++happyReduce_84 = happySpecReduce_1  16# happyReduction_84+happyReduction_84 happy_x_1+	 =  case happyOut45 happy_x_1 of { (HappyWrap45 happy_var_1) -> +	happyIn40+		 ((fst happy_var_1, (snd happy_var_1))+	)}++happyReduce_85 = happySpecReduce_3  17# happyReduction_85+happyReduction_85 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut40 happy_x_1 of { (HappyWrap40 happy_var_1) -> +	case happyOut40 happy_x_3 of { (HappyWrap40 happy_var_3) -> +	happyIn41+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.TopeEQ (fst happy_var_1) (snd happy_var_1) (snd happy_var_3))+	)}}++happyReduce_86 = happySpecReduce_3  17# happyReduction_86+happyReduction_86 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut40 happy_x_1 of { (HappyWrap40 happy_var_1) -> +	case happyOut40 happy_x_3 of { (HappyWrap40 happy_var_3) -> +	happyIn41+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.TopeLEQ (fst happy_var_1) (snd happy_var_1) (snd happy_var_3))+	)}}++happyReduce_87 = happySpecReduce_1  17# happyReduction_87+happyReduction_87 happy_x_1+	 =  case happyOut40 happy_x_1 of { (HappyWrap40 happy_var_1) -> +	happyIn41+		 ((fst happy_var_1, (snd happy_var_1))+	)}++happyReduce_88 = happySpecReduce_3  18# happyReduction_88+happyReduction_88 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut41 happy_x_1 of { (HappyWrap41 happy_var_1) -> +	case happyOut42 happy_x_3 of { (HappyWrap42 happy_var_3) -> +	happyIn42+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.TopeAnd (fst happy_var_1) (snd happy_var_1) (snd happy_var_3))+	)}}++happyReduce_89 = happySpecReduce_1  18# happyReduction_89+happyReduction_89 happy_x_1+	 =  case happyOut41 happy_x_1 of { (HappyWrap41 happy_var_1) -> +	happyIn42+		 ((fst happy_var_1, (snd happy_var_1))+	)}++happyReduce_90 = happySpecReduce_3  19# happyReduction_90+happyReduction_90 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut42 happy_x_1 of { (HappyWrap42 happy_var_1) -> +	case happyOut43 happy_x_3 of { (HappyWrap43 happy_var_3) -> +	happyIn43+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.TopeOr (fst happy_var_1) (snd happy_var_1) (snd happy_var_3))+	)}}++happyReduce_91 = happySpecReduce_1  19# happyReduction_91+happyReduction_91 happy_x_1+	 =  case happyOut42 happy_x_1 of { (HappyWrap42 happy_var_1) -> +	happyIn43+		 ((fst happy_var_1, (snd happy_var_1))+	)}++happyReduce_92 = happySpecReduce_3  20# happyReduction_92+happyReduction_92 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut36 happy_x_1 of { (HappyWrap36 happy_var_1) -> +	case happyOut44 happy_x_3 of { (HappyWrap44 happy_var_3) -> +	happyIn44+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.TypeFun (fst happy_var_1) (snd happy_var_1) (snd happy_var_3))+	)}}++happyReduce_93 = happyReduce 8# 20# happyReduction_93+happyReduction_93 (happy_x_8 `HappyStk`+	happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut32 happy_x_3 of { (HappyWrap32 happy_var_3) -> +	case happyOut46 happy_x_5 of { (HappyWrap46 happy_var_5) -> +	case happyOut44 happy_x_8 of { (HappyWrap44 happy_var_8) -> +	happyIn44+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.TypeSigma (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_3) (snd happy_var_5) (snd happy_var_8))+	) `HappyStk` happyRest}}}}++happyReduce_94 = happyReduce 5# 20# happyReduction_94+happyReduction_94 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut43 happy_x_1 of { (HappyWrap43 happy_var_1) -> +	case happyOut46 happy_x_3 of { (HappyWrap46 happy_var_3) -> +	case happyOut43 happy_x_5 of { (HappyWrap43 happy_var_5) -> +	happyIn44+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.TypeId (fst happy_var_1) (snd happy_var_1) (snd happy_var_3) (snd happy_var_5))+	) `HappyStk` happyRest}}}++happyReduce_95 = happySpecReduce_3  20# happyReduction_95+happyReduction_95 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut43 happy_x_1 of { (HappyWrap43 happy_var_1) -> +	case happyOut43 happy_x_3 of { (HappyWrap43 happy_var_3) -> +	happyIn44+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.TypeIdSimple (fst happy_var_1) (snd happy_var_1) (snd happy_var_3))+	)}}++happyReduce_96 = happyReduce 4# 20# happyReduction_96+happyReduction_96 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut35 happy_x_2 of { (HappyWrap35 happy_var_2) -> +	case happyOut44 happy_x_4 of { (HappyWrap44 happy_var_4) -> +	happyIn44+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.Lambda (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2) (snd happy_var_4))+	) `HappyStk` happyRest}}}++happyReduce_97 = happySpecReduce_1  20# happyReduction_97+happyReduction_97 happy_x_1+	 =  case happyOut43 happy_x_1 of { (HappyWrap43 happy_var_1) -> +	happyIn44+		 ((fst happy_var_1, (snd happy_var_1))+	)}++happyReduce_98 = happySpecReduce_3  20# happyReduction_98+happyReduction_98 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut36 happy_x_1 of { (HappyWrap36 happy_var_1) -> +	case happyOut44 happy_x_3 of { (HappyWrap44 happy_var_3) -> +	happyIn44+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.unicode_TypeFun (fst happy_var_1) (snd happy_var_1) (snd happy_var_3))+	)}}++happyReduce_99 = happyReduce 8# 20# happyReduction_99+happyReduction_99 (happy_x_8 `HappyStk`+	happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut32 happy_x_3 of { (HappyWrap32 happy_var_3) -> +	case happyOut46 happy_x_5 of { (HappyWrap46 happy_var_5) -> +	case happyOut44 happy_x_8 of { (HappyWrap44 happy_var_8) -> +	happyIn44+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.unicode_TypeSigma (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_3) (snd happy_var_5) (snd happy_var_8))+	) `HappyStk` happyRest}}}}++happyReduce_100 = happyReduce 8# 20# happyReduction_100+happyReduction_100 (happy_x_8 `HappyStk`+	happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut32 happy_x_3 of { (HappyWrap32 happy_var_3) -> +	case happyOut46 happy_x_5 of { (HappyWrap46 happy_var_5) -> +	case happyOut44 happy_x_8 of { (HappyWrap44 happy_var_8) -> +	happyIn44+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.unicode_TypeSigmaAlt (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_3) (snd happy_var_5) (snd happy_var_8))+	) `HappyStk` happyRest}}}}++happyReduce_101 = happyReduce 4# 21# happyReduction_101+happyReduction_101 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut45 happy_x_1 of { (HappyWrap45 happy_var_1) -> +	case happyOut38 happy_x_3 of { (HappyWrap38 happy_var_3) -> +	happyIn45+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.TypeRestricted (fst happy_var_1) (snd happy_var_1) (snd happy_var_3))+	) `HappyStk` happyRest}}++happyReduce_102 = happySpecReduce_2  21# happyReduction_102+happyReduction_102 happy_x_2+	happy_x_1+	 =  case happyOut45 happy_x_1 of { (HappyWrap45 happy_var_1) -> +	case happyOut39 happy_x_2 of { (HappyWrap39 happy_var_2) -> +	happyIn45+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.App (fst happy_var_1) (snd happy_var_1) (snd happy_var_2))+	)}}++happyReduce_103 = happySpecReduce_2  21# happyReduction_103+happyReduction_103 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut39 happy_x_2 of { (HappyWrap39 happy_var_2) -> +	happyIn45+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.First (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2))+	)}}++happyReduce_104 = happySpecReduce_2  21# happyReduction_104+happyReduction_104 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut39 happy_x_2 of { (HappyWrap39 happy_var_2) -> +	happyIn45+		 ((uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1), Language.Rzk.Syntax.Abs.Second (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol happy_var_1)) (snd happy_var_2))+	)}}++happyReduce_105 = happySpecReduce_1  21# happyReduction_105+happyReduction_105 happy_x_1+	 =  case happyOut39 happy_x_1 of { (HappyWrap39 happy_var_1) -> +	happyIn45+		 ((fst happy_var_1, (snd happy_var_1))+	)}++happyReduce_106 = happySpecReduce_3  22# happyReduction_106+happyReduction_106 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut43 happy_x_1 of { (HappyWrap43 happy_var_1) -> +	case happyOut44 happy_x_3 of { (HappyWrap44 happy_var_3) -> +	happyIn46+		 ((fst happy_var_1, Language.Rzk.Syntax.Abs.TypeAsc (fst happy_var_1) (snd happy_var_1) (snd happy_var_3))+	)}}++happyReduce_107 = happySpecReduce_1  22# happyReduction_107+happyReduction_107 happy_x_1+	 =  case happyOut44 happy_x_1 of { (HappyWrap44 happy_var_1) -> +	happyIn46+		 ((fst happy_var_1, (snd happy_var_1))+	)}++happyReduce_108 = happySpecReduce_1  23# happyReduction_108+happyReduction_108 happy_x_1+	 =  case happyOut46 happy_x_1 of { (HappyWrap46 happy_var_1) -> +	happyIn47+		 ((fst happy_var_1, (:[]) (snd happy_var_1))+	)}++happyReduce_109 = happySpecReduce_3  23# happyReduction_109+happyReduction_109 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut46 happy_x_1 of { (HappyWrap46 happy_var_1) -> +	case happyOut47 happy_x_3 of { (HappyWrap47 happy_var_3) -> +	happyIn47+		 ((fst happy_var_1, (:) (snd happy_var_1) (snd happy_var_3))+	)}}++happyNewToken action sts stk [] =+	happyDoAction 62# notHappyAtAll action sts stk []++happyNewToken action sts stk (tk:tks) =+	let cont i = happyDoAction i tk action sts stk tks in+	case tk of {+	PT _ (TS _ 1) -> cont 1#;+	PT _ (TS _ 2) -> cont 2#;+	PT _ (TS _ 3) -> cont 3#;+	PT _ (TS _ 4) -> cont 4#;+	PT _ (TS _ 5) -> cont 5#;+	PT _ (TS _ 6) -> cont 6#;+	PT _ (TS _ 7) -> cont 7#;+	PT _ (TS _ 8) -> cont 8#;+	PT _ (TS _ 9) -> cont 9#;+	PT _ (TS _ 10) -> cont 10#;+	PT _ (TS _ 11) -> cont 11#;+	PT _ (TS _ 12) -> cont 12#;+	PT _ (TS _ 13) -> cont 13#;+	PT _ (TS _ 14) -> cont 14#;+	PT _ (TS _ 15) -> cont 15#;+	PT _ (TS _ 16) -> cont 16#;+	PT _ (TS _ 17) -> cont 17#;+	PT _ (TS _ 18) -> cont 18#;+	PT _ (TS _ 19) -> cont 19#;+	PT _ (TS _ 20) -> cont 20#;+	PT _ (TS _ 21) -> cont 21#;+	PT _ (TS _ 22) -> cont 22#;+	PT _ (TS _ 23) -> cont 23#;+	PT _ (TS _ 24) -> cont 24#;+	PT _ (TS _ 25) -> cont 25#;+	PT _ (TS _ 26) -> cont 26#;+	PT _ (TS _ 27) -> cont 27#;+	PT _ (TS _ 28) -> cont 28#;+	PT _ (TS _ 29) -> cont 29#;+	PT _ (TS _ 30) -> cont 30#;+	PT _ (TS _ 31) -> cont 31#;+	PT _ (TS _ 32) -> cont 32#;+	PT _ (TS _ 33) -> cont 33#;+	PT _ (TS _ 34) -> cont 34#;+	PT _ (TS _ 35) -> cont 35#;+	PT _ (TS _ 36) -> cont 36#;+	PT _ (TS _ 37) -> cont 37#;+	PT _ (TS _ 38) -> cont 38#;+	PT _ (TS _ 39) -> cont 39#;+	PT _ (TS _ 40) -> cont 40#;+	PT _ (TS _ 41) -> cont 41#;+	PT _ (TS _ 42) -> cont 42#;+	PT _ (TS _ 43) -> cont 43#;+	PT _ (TS _ 44) -> cont 44#;+	PT _ (TS _ 45) -> cont 45#;+	PT _ (TS _ 46) -> cont 46#;+	PT _ (TS _ 47) -> cont 47#;+	PT _ (TS _ 48) -> cont 48#;+	PT _ (TS _ 49) -> cont 49#;+	PT _ (TS _ 50) -> cont 50#;+	PT _ (TS _ 51) -> cont 51#;+	PT _ (TS _ 52) -> cont 52#;+	PT _ (TS _ 53) -> cont 53#;+	PT _ (TS _ 54) -> cont 54#;+	PT _ (TS _ 55) -> cont 55#;+	PT _ (TS _ 56) -> cont 56#;+	PT _ (TS _ 57) -> cont 57#;+	PT _ (TS _ 58) -> cont 58#;+	PT _ (TL _) -> cont 59#;+	PT _ (T_VarIdent _) -> cont 60#;+	PT _ (T_HoleIdent _) -> cont 61#;+	_ -> happyError' ((tk:tks), [])+	}++happyError_ explist 62# tk tks = happyError' (tks, explist)+happyError_ explist _ tk tks = happyError' ((tk:tks), explist)++happyThen :: () => Err a -> (a -> Err b) -> Err b+happyThen = ((>>=))+happyReturn :: () => a -> Err a+happyReturn = (return)+happyThen1 m k tks = ((>>=)) m (\a -> k a tks)+happyReturn1 :: () => a -> b -> Err a+happyReturn1 = \a tks -> (return) a+happyError' :: () => ([(Token)], [Prelude.String]) -> Err a+happyError' = (\(tokens, _) -> happyError tokens)+pModule_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (let {(HappyWrap27 x') = happyOut27 x} in x'))++pLanguageDecl_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 1# tks) (\x -> happyReturn (let {(HappyWrap28 x') = happyOut28 x} in x'))++pLanguage_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 2# tks) (\x -> happyReturn (let {(HappyWrap29 x') = happyOut29 x} in x'))++pCommand_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 3# tks) (\x -> happyReturn (let {(HappyWrap30 x') = happyOut30 x} in x'))++pListCommand_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 4# tks) (\x -> happyReturn (let {(HappyWrap31 x') = happyOut31 x} in x'))++pPattern_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 5# tks) (\x -> happyReturn (let {(HappyWrap32 x') = happyOut32 x} in x'))++pListPattern_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 6# tks) (\x -> happyReturn (let {(HappyWrap33 x') = happyOut33 x} in x'))++pParam_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 7# tks) (\x -> happyReturn (let {(HappyWrap34 x') = happyOut34 x} in x'))++pListParam_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 8# tks) (\x -> happyReturn (let {(HappyWrap35 x') = happyOut35 x} in x'))++pParamDecl_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 9# tks) (\x -> happyReturn (let {(HappyWrap36 x') = happyOut36 x} in x'))++pRestriction_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 10# tks) (\x -> happyReturn (let {(HappyWrap37 x') = happyOut37 x} in x'))++pListRestriction_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 11# tks) (\x -> happyReturn (let {(HappyWrap38 x') = happyOut38 x} in x'))++pTerm7_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 12# tks) (\x -> happyReturn (let {(HappyWrap39 x') = happyOut39 x} in x'))++pTerm5_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 13# tks) (\x -> happyReturn (let {(HappyWrap40 x') = happyOut40 x} in x'))++pTerm4_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 14# tks) (\x -> happyReturn (let {(HappyWrap41 x') = happyOut41 x} in x'))++pTerm3_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 15# tks) (\x -> happyReturn (let {(HappyWrap42 x') = happyOut42 x} in x'))++pTerm2_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 16# tks) (\x -> happyReturn (let {(HappyWrap43 x') = happyOut43 x} in x'))++pTerm1_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 17# tks) (\x -> happyReturn (let {(HappyWrap44 x') = happyOut44 x} in x'))++pTerm6_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 18# tks) (\x -> happyReturn (let {(HappyWrap45 x') = happyOut45 x} in x'))++pTerm_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 19# tks) (\x -> happyReturn (let {(HappyWrap46 x') = happyOut46 x} in x'))++pListTerm_internal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 20# tks) (\x -> happyReturn (let {(HappyWrap47 x') = happyOut47 x} in x'))++happySeq = happyDontSeq+++type Err = Either String++happyError :: [Token] -> Err a+happyError ts = Left $+  "syntax error at " ++ tokenPos ts +++  case ts of+    []      -> []+    [Err _] -> " due to lexer error"+    t:_     -> " before `" ++ (prToken t) ++ "'"++myLexer :: String -> [Token]+myLexer = tokens++-- Entrypoints++pModule :: [Token] -> Err Language.Rzk.Syntax.Abs.Module+pModule = fmap snd . pModule_internal++pLanguageDecl :: [Token] -> Err Language.Rzk.Syntax.Abs.LanguageDecl+pLanguageDecl = fmap snd . pLanguageDecl_internal++pLanguage :: [Token] -> Err Language.Rzk.Syntax.Abs.Language+pLanguage = fmap snd . pLanguage_internal++pCommand :: [Token] -> Err Language.Rzk.Syntax.Abs.Command+pCommand = fmap snd . pCommand_internal++pListCommand :: [Token] -> Err [Language.Rzk.Syntax.Abs.Command]+pListCommand = fmap snd . pListCommand_internal++pPattern :: [Token] -> Err Language.Rzk.Syntax.Abs.Pattern+pPattern = fmap snd . pPattern_internal++pListPattern :: [Token] -> Err [Language.Rzk.Syntax.Abs.Pattern]+pListPattern = fmap snd . pListPattern_internal++pParam :: [Token] -> Err Language.Rzk.Syntax.Abs.Param+pParam = fmap snd . pParam_internal++pListParam :: [Token] -> Err [Language.Rzk.Syntax.Abs.Param]+pListParam = fmap snd . pListParam_internal++pParamDecl :: [Token] -> Err Language.Rzk.Syntax.Abs.ParamDecl+pParamDecl = fmap snd . pParamDecl_internal++pRestriction :: [Token] -> Err Language.Rzk.Syntax.Abs.Restriction+pRestriction = fmap snd . pRestriction_internal++pListRestriction :: [Token] -> Err [Language.Rzk.Syntax.Abs.Restriction]+pListRestriction = fmap snd . pListRestriction_internal++pTerm7 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm7 = fmap snd . pTerm7_internal++pTerm5 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm5 = fmap snd . pTerm5_internal++pTerm4 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm4 = fmap snd . pTerm4_internal++pTerm3 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm3 = fmap snd . pTerm3_internal++pTerm2 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm2 = fmap snd . pTerm2_internal++pTerm1 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm1 = fmap snd . pTerm1_internal++pTerm6 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm6 = fmap snd . pTerm6_internal++pTerm :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm = fmap snd . pTerm_internal++pListTerm :: [Token] -> Err [Language.Rzk.Syntax.Abs.Term]+pListTerm = fmap snd . pListTerm_internal+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- $Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp $++++++++++++++-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ > 706+#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Prelude.Bool)+#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Prelude.Bool)+#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Prelude.Bool)+#else+#define LT(n,m) (n Happy_GHC_Exts.<# m)+#define GTE(n,m) (n Happy_GHC_Exts.>=# m)+#define EQ(n,m) (n Happy_GHC_Exts.==# m)+#endif++++++++++++++++++++data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList+++++++++++++++++++++++++++++++++++++++++infixr 9 `HappyStk`+data HappyStk a = HappyStk a (HappyStk a)++-----------------------------------------------------------------------------+-- starting the parse++happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll++-----------------------------------------------------------------------------+-- Accepting the parse++-- If the current token is ERROR_TOK, it means we've just accepted a partial+-- parse (a %partial parser).  We must ignore the saved token on the top of+-- the stack in this case.+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =+        happyReturn1 ans+happyAccept j tk st sts (HappyStk ans _) = +        (happyTcHack j (happyTcHack st)) (happyReturn1 ans)++-----------------------------------------------------------------------------+-- Arrays only: do the next action++++happyDoAction i tk st+        = {- nothing -}+          case action of+                0#           -> {- nothing -}+                                     happyFail (happyExpListPerState ((Happy_GHC_Exts.I# (st)) :: Prelude.Int)) i tk st+                -1#          -> {- nothing -}+                                     happyAccept i tk st+                n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}+                                                   (happyReduceArr Happy_Data_Array.! rule) i tk st+                                                   where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))+                n                 -> {- nothing -}+                                     happyShift new_state i tk st+                                     where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))+   where off    = happyAdjustOffset (indexShortOffAddr happyActOffsets st)+         off_i  = (off Happy_GHC_Exts.+# i)+         check  = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))+                  then EQ(indexShortOffAddr happyCheck off_i, i)+                  else Prelude.False+         action+          | check     = indexShortOffAddr happyTable off_i+          | Prelude.otherwise = indexShortOffAddr happyDefActions st+++++indexShortOffAddr (HappyA# arr) off =+        Happy_GHC_Exts.narrow16Int# i+  where+        i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)+        high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))+        low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))+        off' = off Happy_GHC_Exts.*# 2#+++++{-# INLINE happyLt #-}+happyLt x y = LT(x,y)+++readArrayBit arr bit =+    Bits.testBit (Happy_GHC_Exts.I# (indexShortOffAddr arr ((unbox_int bit) `Happy_GHC_Exts.iShiftRA#` 4#))) (bit `Prelude.mod` 16)+  where unbox_int (Happy_GHC_Exts.I# x) = x+++++++data HappyAddr = HappyA# Happy_GHC_Exts.Addr#+++-----------------------------------------------------------------------------+-- HappyState data type (not arrays)++++++++++++++-----------------------------------------------------------------------------+-- Shifting a token++happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =+     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+--     trace "shifting the error token" $+     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)++happyShift new_state i tk st sts stk =+     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)++-- happyReduce is specialised for the common cases.++happySpecReduce_0 i fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happySpecReduce_0 nt fn j tk st@((action)) sts stk+     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)++happySpecReduce_1 i fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')+     = let r = fn v1 in+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_2 i fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')+     = let r = fn v1 v2 in+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_3 i fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')+     = let r = fn v1 v2 v3 in+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happyReduce k i fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happyReduce k nt fn j tk st sts stk+     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of+         sts1@((HappyCons (st1@(action)) (_))) ->+                let r = fn stk in  -- it doesn't hurt to always seq here...+                happyDoSeq r (happyGoto nt j tk st1 sts1 r)++happyMonadReduce k nt fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happyMonadReduce k nt fn j tk st sts stk =+      case happyDrop k (HappyCons (st) (sts)) of+        sts1@((HappyCons (st1@(action)) (_))) ->+          let drop_stk = happyDropStk k stk in+          happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))++happyMonad2Reduce k nt fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happyMonad2Reduce k nt fn j tk st sts stk =+      case happyDrop k (HappyCons (st) (sts)) of+        sts1@((HappyCons (st1@(action)) (_))) ->+         let drop_stk = happyDropStk k stk++             off = happyAdjustOffset (indexShortOffAddr happyGotoOffsets st1)+             off_i = (off Happy_GHC_Exts.+# nt)+             new_state = indexShortOffAddr happyTable off_i+++++          in+          happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))++happyDrop 0# l = l+happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t++happyDropStk 0# l = l+happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs++-----------------------------------------------------------------------------+-- Moving to a new state after a reduction+++happyGoto nt j tk st = +   {- nothing -}+   happyDoAction j tk new_state+   where off = happyAdjustOffset (indexShortOffAddr happyGotoOffsets st)+         off_i = (off Happy_GHC_Exts.+# nt)+         new_state = indexShortOffAddr happyTable off_i+++++-----------------------------------------------------------------------------+-- Error recovery (ERROR_TOK is the error token)++-- parse error if we are in recovery and we fail again+happyFail explist 0# tk old_st _ stk@(x `HappyStk` _) =+     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+--      trace "failing" $ +        happyError_ explist i tk++{-  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  ERROR_TOK tk old_st CONS(HAPPYSTATE(action),sts) +                                                (saved_tok `HappyStk` _ `HappyStk` stk) =+--      trace ("discarding state, depth " ++ show (length stk))  $+        DO_ACTION(action,ERROR_TOK,tk,sts,(saved_tok`HappyStk`stk))+-}++-- Enter error recovery: generate an error token,+--                       save the old token and carry on.+happyFail explist i tk (action) sts stk =+--      trace "entering error recovery" $+        happyDoAction 0# tk action sts ((Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)++-- Internal happy errors:++notHappyAtAll :: a+notHappyAtAll = Prelude.error "Internal Happy error\n"++-----------------------------------------------------------------------------+-- Hack to get the typechecker to accept our action functions+++happyTcHack :: Happy_GHC_Exts.Int# -> a -> a+happyTcHack x y = y+{-# INLINE happyTcHack #-}+++-----------------------------------------------------------------------------+-- 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 `Prelude.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 happyDoAction #-}+{-# NOINLINE happyTable #-}+{-# NOINLINE happyCheck #-}+{-# NOINLINE happyActOffsets #-}+{-# NOINLINE happyGotoOffsets #-}+{-# NOINLINE happyDefActions #-}++{-# 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.
+ src/Language/Rzk/Syntax/Par.y view
@@ -0,0 +1,368 @@+-- -*- haskell -*- File generated by the BNF Converter (bnfc 2.9.4.1).++-- Parser definition for use with Happy+{+{-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}+{-# LANGUAGE PatternSynonyms #-}++module Language.Rzk.Syntax.Par+  ( happyError+  , myLexer+  , pModule+  , pLanguageDecl+  , pLanguage+  , pCommand+  , pListCommand+  , pPattern+  , pListPattern+  , pParam+  , pListParam+  , pParamDecl+  , pRestriction+  , pListRestriction+  , pTerm7+  , pTerm5+  , pTerm4+  , pTerm3+  , pTerm2+  , pTerm1+  , pTerm6+  , pTerm+  , pListTerm+  ) where++import Prelude++import qualified Language.Rzk.Syntax.Abs+import Language.Rzk.Syntax.Lex++}++%name pModule_internal Module+%name pLanguageDecl_internal LanguageDecl+%name pLanguage_internal Language+%name pCommand_internal Command+%name pListCommand_internal ListCommand+%name pPattern_internal Pattern+%name pListPattern_internal ListPattern+%name pParam_internal Param+%name pListParam_internal ListParam+%name pParamDecl_internal ParamDecl+%name pRestriction_internal Restriction+%name pListRestriction_internal ListRestriction+%name pTerm7_internal Term7+%name pTerm5_internal Term5+%name pTerm4_internal Term4+%name pTerm3_internal Term3+%name pTerm2_internal Term2+%name pTerm1_internal Term1+%name pTerm6_internal Term6+%name pTerm_internal Term+%name pListTerm_internal ListTerm+-- no lexer declaration+%monad { Err } { (>>=) } { return }+%tokentype {Token}+%token+  '#check'        { PT _ (TS _ 1)        }+  '#compute'      { PT _ (TS _ 2)        }+  '#compute-nf'   { PT _ (TS _ 3)        }+  '#compute-whnf' { PT _ (TS _ 4)        }+  '#def'          { PT _ (TS _ 5)        }+  '#define'       { PT _ (TS _ 6)        }+  '#lang'         { PT _ (TS _ 7)        }+  '#postulate'    { PT _ (TS _ 8)        }+  '#set-option'   { PT _ (TS _ 9)        }+  '#unset-option' { PT _ (TS _ 10)       }+  '('             { PT _ (TS _ 11)       }+  ')'             { PT _ (TS _ 12)       }+  '*'             { PT _ (TS _ 13)       }+  '*_1'           { PT _ (TS _ 14)       }+  ','             { PT _ (TS _ 15)       }+  '->'            { PT _ (TS _ 16)       }+  '/\\'           { PT _ (TS _ 17)       }+  '0_2'           { PT _ (TS _ 18)       }+  '1'             { PT _ (TS _ 19)       }+  '1_2'           { PT _ (TS _ 20)       }+  '2'             { PT _ (TS _ 21)       }+  ':'             { PT _ (TS _ 22)       }+  ':='            { PT _ (TS _ 23)       }+  ';'             { PT _ (TS _ 24)       }+  '<'             { PT _ (TS _ 25)       }+  '<='            { PT _ (TS _ 26)       }+  '='             { PT _ (TS _ 27)       }+  '==='           { PT _ (TS _ 28)       }+  '=_{'           { PT _ (TS _ 29)       }+  '>'             { PT _ (TS _ 30)       }+  'BOT'           { PT _ (TS _ 31)       }+  'CUBE'          { PT _ (TS _ 32)       }+  'Sigma'         { PT _ (TS _ 33)       }+  'TOP'           { PT _ (TS _ 34)       }+  'TOPE'          { PT _ (TS _ 35)       }+  'U'             { PT _ (TS _ 36)       }+  '['             { PT _ (TS _ 37)       }+  '\\'            { PT _ (TS _ 38)       }+  '\\/'           { PT _ (TS _ 39)       }+  ']'             { PT _ (TS _ 40)       }+  '_'             { PT _ (TS _ 41)       }+  'as'            { PT _ (TS _ 42)       }+  'first'         { PT _ (TS _ 43)       }+  'idJ'           { PT _ (TS _ 44)       }+  'recBOT'        { PT _ (TS _ 45)       }+  'recOR'         { PT _ (TS _ 46)       }+  'refl'          { PT _ (TS _ 47)       }+  'refl_{'        { PT _ (TS _ 48)       }+  'rzk-1'         { PT _ (TS _ 49)       }+  'rzk-2'         { PT _ (TS _ 50)       }+  'second'        { PT _ (TS _ 51)       }+  '{'             { PT _ (TS _ 52)       }+  '|'             { PT _ (TS _ 53)       }+  '|->'           { PT _ (TS _ 54)       }+  '}'             { PT _ (TS _ 55)       }+  'Σ'             { PT _ (TS _ 56)       }+  '→'             { PT _ (TS _ 57)       }+  '∑'             { PT _ (TS _ 58)       }+  L_quoted        { PT _ (TL _)          }+  L_VarIdent      { PT _ (T_VarIdent _)  }+  L_HoleIdent     { PT _ (T_HoleIdent _) }++%%++String  :: { (Language.Rzk.Syntax.Abs.BNFC'Position, String) }+String   : L_quoted { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), ((\(PT _ (TL s)) -> s) $1)) }++VarIdent :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.VarIdent) }+VarIdent  : L_VarIdent { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.VarIdent (tokenText $1)) }++HoleIdent :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.HoleIdent) }+HoleIdent  : L_HoleIdent { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.HoleIdent (tokenText $1)) }++Module :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Module) }+Module+  : LanguageDecl ListCommand { (fst $1, Language.Rzk.Syntax.Abs.Module (fst $1) (snd $1) (snd $2)) }++LanguageDecl :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.LanguageDecl) }+LanguageDecl+  : '#lang' Language ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.LanguageDecl (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2)) }++Language :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Language) }+Language+  : 'rzk-1' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.Rzk1 (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | 'rzk-2' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.Rzk2 (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }++Command :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Command) }+Command+  : '#set-option' String '=' String ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.CommandSetOption (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) }+  | '#unset-option' String ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.CommandUnsetOption (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2)) }+  | '#check' Term ':' Term ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.CommandCheck (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) }+  | '#compute' Term ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.CommandCompute (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2)) }+  | '#compute-whnf' Term ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.CommandComputeWHNF (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2)) }+  | '#compute-nf' Term ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.CommandComputeNF (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2)) }+  | '#postulate' VarIdent ListParam ':' Term ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.CommandPostulate (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $3) (snd $5)) }+  | '#postulate' VarIdent ':' Term ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.commandPostulateNoParams (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) }+  | '#define' VarIdent ListParam ':' Term ':=' Term ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.CommandDefine (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $3) (snd $5) (snd $7)) }+  | '#define' VarIdent ':' Term ':=' Term ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.commandDefineNoParams (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4) (snd $6)) }+  | '#def' VarIdent ListParam ':' Term ':=' Term ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.commandDef (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $3) (snd $5) (snd $7)) }+  | '#def' VarIdent ':' Term ':=' Term ';' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.commandDefNoParams (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4) (snd $6)) }++ListCommand :: { (Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Command]) }+ListCommand+  : {- empty -} { (Language.Rzk.Syntax.Abs.BNFC'NoPosition, []) }+  | Command ListCommand { (fst $1, (:) (snd $1) (snd $2)) }++Pattern :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Pattern) }+Pattern+  : '_' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.PatternWildcard (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | VarIdent { (fst $1, Language.Rzk.Syntax.Abs.PatternVar (fst $1) (snd $1)) }+  | '(' Pattern ',' Pattern ')' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.PatternPair (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) }++ListPattern :: { (Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Pattern]) }+ListPattern+  : Pattern { (fst $1, (:[]) (snd $1)) }+  | Pattern ListPattern { (fst $1, (:) (snd $1) (snd $2)) }++Param :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Param) }+Param+  : Pattern { (fst $1, Language.Rzk.Syntax.Abs.ParamPattern (fst $1) (snd $1)) }+  | '(' ListPattern ':' Term ')' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.ParamPatternType (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) }+  | '{' Pattern ':' Term '|' Term '}' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.ParamPatternShape (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4) (snd $6)) }++ListParam :: { (Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Param]) }+ListParam+  : Param { (fst $1, (:[]) (snd $1)) }+  | Param ListParam { (fst $1, (:) (snd $1) (snd $2)) }++ParamDecl :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.ParamDecl) }+ParamDecl+  : Term6 { (fst $1, Language.Rzk.Syntax.Abs.ParamType (fst $1) (snd $1)) }+  | '(' '_' ':' Term ')' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.ParamWildcardType (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $4)) }+  | '{' Pattern ':' Term '}' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.ParamVarType (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) }+  | '(' VarIdent ':' Term ')' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.paramVarType (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) }+  | '{' '(' Pattern ':' Term ')' '|' Term '}' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.ParamVarShape (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $3) (snd $5) (snd $8)) }+  | '{' Pattern ':' Term '|' Term '}' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.paramVarShape (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4) (snd $6)) }++Restriction :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Restriction) }+Restriction+  : Term '|->' Term { (fst $1, Language.Rzk.Syntax.Abs.Restriction (fst $1) (snd $1) (snd $3)) }++ListRestriction :: { (Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Restriction]) }+ListRestriction+  : Restriction { (fst $1, (:[]) (snd $1)) }+  | Restriction ',' ListRestriction { (fst $1, (:) (snd $1) (snd $3)) }++Term7 :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term) }+Term7+  : 'U' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.Universe (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | 'CUBE' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.UniverseCube (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | 'TOPE' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.UniverseTope (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | '1' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.CubeUnit (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | '*_1' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.CubeUnitStar (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | '2' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.Cube2 (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | '0_2' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.Cube2_0 (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | '1_2' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.Cube2_1 (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | 'TOP' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.TopeTop (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | 'BOT' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.TopeBottom (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | 'recBOT' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.RecBottom (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | 'recOR' '(' ListRestriction ')' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.RecOr (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $3)) }+  | 'recOR' '(' Term ',' Term ',' Term ',' Term ')' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.recOr (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $3) (snd $5) (snd $7) (snd $9)) }+  | '<' ParamDecl '->' Term '>' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.typeExtension (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) }+  | '(' Term ',' Term ')' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.Pair (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) }+  | 'refl' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.Refl (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1))) }+  | 'refl_{' Term '}' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.ReflTerm (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2)) }+  | 'refl_{' Term ':' Term '}' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.ReflTermType (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) }+  | 'idJ' '(' Term ',' Term ',' Term ',' Term ',' Term ',' Term ')' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.IdJ (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $3) (snd $5) (snd $7) (snd $9) (snd $11) (snd $13)) }+  | HoleIdent { (fst $1, Language.Rzk.Syntax.Abs.Hole (fst $1) (snd $1)) }+  | VarIdent { (fst $1, Language.Rzk.Syntax.Abs.Var (fst $1) (snd $1)) }+  | '(' Term ')' { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), (snd $2)) }++Term5 :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term) }+Term5+  : Term5 '*' Term6 { (fst $1, Language.Rzk.Syntax.Abs.CubeProduct (fst $1) (snd $1) (snd $3)) }+  | Term6 { (fst $1, (snd $1)) }++Term4 :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term) }+Term4+  : Term5 '===' Term5 { (fst $1, Language.Rzk.Syntax.Abs.TopeEQ (fst $1) (snd $1) (snd $3)) }+  | Term5 '<=' Term5 { (fst $1, Language.Rzk.Syntax.Abs.TopeLEQ (fst $1) (snd $1) (snd $3)) }+  | Term5 { (fst $1, (snd $1)) }++Term3 :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term) }+Term3+  : Term4 '/\\' Term3 { (fst $1, Language.Rzk.Syntax.Abs.TopeAnd (fst $1) (snd $1) (snd $3)) }+  | Term4 { (fst $1, (snd $1)) }++Term2 :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term) }+Term2+  : Term3 '\\/' Term2 { (fst $1, Language.Rzk.Syntax.Abs.TopeOr (fst $1) (snd $1) (snd $3)) }+  | Term3 { (fst $1, (snd $1)) }++Term1 :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term) }+Term1+  : ParamDecl '->' Term1 { (fst $1, Language.Rzk.Syntax.Abs.TypeFun (fst $1) (snd $1) (snd $3)) }+  | 'Sigma' '(' Pattern ':' Term ')' ',' Term1 { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.TypeSigma (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $3) (snd $5) (snd $8)) }+  | Term2 '=_{' Term '}' Term2 { (fst $1, Language.Rzk.Syntax.Abs.TypeId (fst $1) (snd $1) (snd $3) (snd $5)) }+  | Term2 '=' Term2 { (fst $1, Language.Rzk.Syntax.Abs.TypeIdSimple (fst $1) (snd $1) (snd $3)) }+  | '\\' ListParam '->' Term1 { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.Lambda (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) }+  | Term2 { (fst $1, (snd $1)) }+  | ParamDecl '→' Term1 { (fst $1, Language.Rzk.Syntax.Abs.unicode_TypeFun (fst $1) (snd $1) (snd $3)) }+  | 'Σ' '(' Pattern ':' Term ')' ',' Term1 { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.unicode_TypeSigma (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $3) (snd $5) (snd $8)) }+  | '∑' '(' Pattern ':' Term ')' ',' Term1 { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.unicode_TypeSigmaAlt (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $3) (snd $5) (snd $8)) }++Term6 :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term) }+Term6+  : Term6 '[' ListRestriction ']' { (fst $1, Language.Rzk.Syntax.Abs.TypeRestricted (fst $1) (snd $1) (snd $3)) }+  | Term6 Term7 { (fst $1, Language.Rzk.Syntax.Abs.App (fst $1) (snd $1) (snd $2)) }+  | 'first' Term7 { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.First (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2)) }+  | 'second' Term7 { (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1), Language.Rzk.Syntax.Abs.Second (uncurry Language.Rzk.Syntax.Abs.BNFC'Position (tokenLineCol $1)) (snd $2)) }+  | Term7 { (fst $1, (snd $1)) }++Term :: { (Language.Rzk.Syntax.Abs.BNFC'Position, Language.Rzk.Syntax.Abs.Term) }+Term+  : Term2 'as' Term1 { (fst $1, Language.Rzk.Syntax.Abs.TypeAsc (fst $1) (snd $1) (snd $3)) }+  | Term1 { (fst $1, (snd $1)) }++ListTerm :: { (Language.Rzk.Syntax.Abs.BNFC'Position, [Language.Rzk.Syntax.Abs.Term]) }+ListTerm+  : Term { (fst $1, (:[]) (snd $1)) }+  | Term ',' ListTerm { (fst $1, (:) (snd $1) (snd $3)) }++{++type Err = Either String++happyError :: [Token] -> Err a+happyError ts = Left $+  "syntax error at " ++ tokenPos ts +++  case ts of+    []      -> []+    [Err _] -> " due to lexer error"+    t:_     -> " before `" ++ (prToken t) ++ "'"++myLexer :: String -> [Token]+myLexer = tokens++-- Entrypoints++pModule :: [Token] -> Err Language.Rzk.Syntax.Abs.Module+pModule = fmap snd . pModule_internal++pLanguageDecl :: [Token] -> Err Language.Rzk.Syntax.Abs.LanguageDecl+pLanguageDecl = fmap snd . pLanguageDecl_internal++pLanguage :: [Token] -> Err Language.Rzk.Syntax.Abs.Language+pLanguage = fmap snd . pLanguage_internal++pCommand :: [Token] -> Err Language.Rzk.Syntax.Abs.Command+pCommand = fmap snd . pCommand_internal++pListCommand :: [Token] -> Err [Language.Rzk.Syntax.Abs.Command]+pListCommand = fmap snd . pListCommand_internal++pPattern :: [Token] -> Err Language.Rzk.Syntax.Abs.Pattern+pPattern = fmap snd . pPattern_internal++pListPattern :: [Token] -> Err [Language.Rzk.Syntax.Abs.Pattern]+pListPattern = fmap snd . pListPattern_internal++pParam :: [Token] -> Err Language.Rzk.Syntax.Abs.Param+pParam = fmap snd . pParam_internal++pListParam :: [Token] -> Err [Language.Rzk.Syntax.Abs.Param]+pListParam = fmap snd . pListParam_internal++pParamDecl :: [Token] -> Err Language.Rzk.Syntax.Abs.ParamDecl+pParamDecl = fmap snd . pParamDecl_internal++pRestriction :: [Token] -> Err Language.Rzk.Syntax.Abs.Restriction+pRestriction = fmap snd . pRestriction_internal++pListRestriction :: [Token] -> Err [Language.Rzk.Syntax.Abs.Restriction]+pListRestriction = fmap snd . pListRestriction_internal++pTerm7 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm7 = fmap snd . pTerm7_internal++pTerm5 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm5 = fmap snd . pTerm5_internal++pTerm4 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm4 = fmap snd . pTerm4_internal++pTerm3 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm3 = fmap snd . pTerm3_internal++pTerm2 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm2 = fmap snd . pTerm2_internal++pTerm1 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm1 = fmap snd . pTerm1_internal++pTerm6 :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm6 = fmap snd . pTerm6_internal++pTerm :: [Token] -> Err Language.Rzk.Syntax.Abs.Term+pTerm = fmap snd . pTerm_internal++pListTerm :: [Token] -> Err [Language.Rzk.Syntax.Abs.Term]+pListTerm = fmap snd . pListTerm_internal+}+
+ src/Language/Rzk/Syntax/Print.hs view
@@ -0,0 +1,251 @@+-- File generated by the BNF Converter (bnfc 2.9.4.1).++{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE LambdaCase #-}+#if __GLASGOW_HASKELL__ <= 708+{-# LANGUAGE OverlappingInstances #-}+#endif++-- | Pretty-printer for Language.++module Language.Rzk.Syntax.Print where++import Prelude+  ( ($), (.)+  , Bool(..), (==), (<)+  , Int, Integer, Double, (+), (-), (*)+  , String, (++)+  , ShowS, showChar, showString+  , all, elem, foldr, id, map, null, replicate, shows, span+  )+import Data.Char ( Char, isSpace )+import qualified Language.Rzk.Syntax.Abs++-- | The top-level printing method.++printTree :: Print a => a -> String+printTree = render . prt 0++type Doc = [ShowS] -> [ShowS]++doc :: ShowS -> Doc+doc = (:)++render :: Doc -> String+render d = rend 0 False (map ($ "") $ d []) ""+  where+  rend+    :: Int        -- ^ Indentation level.+    -> Bool       -- ^ Pending indentation to be output before next character?+    -> [String]+    -> ShowS+  rend i p = \case+      "["      :ts -> char '[' . rend i False ts+      "("      :ts -> char '(' . rend i False ts+--       "{"      :ts -> onNewLine i     p . showChar   '{'  . new (i+1) ts+--       "}" : ";":ts -> onNewLine (i-1) p . showString "};" . new (i-1) ts+--       "}"      :ts -> onNewLine (i-1) p . showChar   '}'  . new (i-1) ts+      [";"]        -> char ';'+      ";"      :ts -> char ';' . new i ts+      t  : ts@(s:_) | closingOrPunctuation s+                   -> pending . showString t . rend i False ts+      t        :ts -> pending . space t      . rend i False ts+      []           -> id+    where+    -- Output character after pending indentation.+    char :: Char -> ShowS+    char c = pending . showChar c++    -- Output pending indentation.+    pending :: ShowS+    pending = if p then indent i else id++  -- Indentation (spaces) for given indentation level.+  indent :: Int -> ShowS+  indent i = replicateS (2*i) (showChar ' ')++  -- Continue rendering in new line with new indentation.+  new :: Int -> [String] -> ShowS+  new j ts = showChar '\n' . rend j True ts++  -- Make sure we are on a fresh line.+  onNewLine :: Int -> Bool -> ShowS+  onNewLine i p = (if p then id else showChar '\n') . indent i++  -- Separate given string from following text by a space (if needed).+  space :: String -> ShowS+  space t s =+    case (all isSpace t', null spc, null rest) of+      (True , _   , True ) -> []              -- remove trailing space+      (False, _   , True ) -> t'              -- remove trailing space+      (False, True, False) -> t' ++ ' ' : s   -- add space if none+      _                    -> t' ++ s+    where+      t'          = showString t []+      (spc, rest) = span isSpace s++  closingOrPunctuation :: String -> Bool+  closingOrPunctuation [c] = c `elem` closerOrPunct+  closingOrPunctuation _   = False++  closerOrPunct :: String+  closerOrPunct = ")],;"++parenth :: Doc -> Doc+parenth ss = doc (showChar '(') . ss . doc (showChar ')')++concatS :: [ShowS] -> ShowS+concatS = foldr (.) id++concatD :: [Doc] -> Doc+concatD = foldr (.) id++replicateS :: Int -> ShowS -> ShowS+replicateS n f = concatS (replicate n f)++-- | The printer class does the job.++class Print a where+  prt :: Int -> a -> Doc++instance {-# OVERLAPPABLE #-} Print a => Print [a] where+  prt i = concatD . map (prt i)++instance Print Char where+  prt _ c = doc (showChar '\'' . mkEsc '\'' c . showChar '\'')++instance Print String where+  prt _ = printString++printString :: String -> Doc+printString s = doc (showChar '"' . concatS (map (mkEsc '"') s) . showChar '"')++mkEsc :: Char -> Char -> ShowS+mkEsc q = \case+  s | s == q -> showChar '\\' . showChar s+  '\\' -> showString "\\\\"+  '\n' -> showString "\\n"+  '\t' -> showString "\\t"+  s -> showChar s++prPrec :: Int -> Int -> Doc -> Doc+prPrec i j = if j < i then parenth else id++instance Print Integer where+  prt _ x = doc (shows x)++instance Print Double where+  prt _ x = doc (shows x)++instance Print Language.Rzk.Syntax.Abs.VarIdent where+  prt _ (Language.Rzk.Syntax.Abs.VarIdent i) = doc $ showString i+instance Print Language.Rzk.Syntax.Abs.HoleIdent where+  prt _ (Language.Rzk.Syntax.Abs.HoleIdent i) = doc $ showString i+instance Print (Language.Rzk.Syntax.Abs.Module' a) where+  prt i = \case+    Language.Rzk.Syntax.Abs.Module _ languagedecl commands -> prPrec i 0 (concatD [prt 0 languagedecl, prt 0 commands])++instance Print (Language.Rzk.Syntax.Abs.LanguageDecl' a) where+  prt i = \case+    Language.Rzk.Syntax.Abs.LanguageDecl _ language -> prPrec i 0 (concatD [doc (showString "#lang"), prt 0 language, doc (showString ";")])++instance Print (Language.Rzk.Syntax.Abs.Language' a) where+  prt i = \case+    Language.Rzk.Syntax.Abs.Rzk1 _ -> prPrec i 0 (concatD [doc (showString "rzk-1")])+    Language.Rzk.Syntax.Abs.Rzk2 _ -> prPrec i 0 (concatD [doc (showString "rzk-2")])++instance Print (Language.Rzk.Syntax.Abs.Command' a) where+  prt i = \case+    Language.Rzk.Syntax.Abs.CommandSetOption _ str1 str2 -> prPrec i 0 (concatD [doc (showString "#set-option"), printString str1, doc (showString "="), printString str2, doc (showString ";")])+    Language.Rzk.Syntax.Abs.CommandUnsetOption _ str -> prPrec i 0 (concatD [doc (showString "#unset-option"), printString str, doc (showString ";")])+    Language.Rzk.Syntax.Abs.CommandCheck _ term1 term2 -> prPrec i 0 (concatD [doc (showString "#check"), prt 0 term1, doc (showString ":"), prt 0 term2, doc (showString ";")])+    Language.Rzk.Syntax.Abs.CommandCompute _ term -> prPrec i 0 (concatD [doc (showString "#compute"), prt 0 term, doc (showString ";")])+    Language.Rzk.Syntax.Abs.CommandComputeWHNF _ term -> prPrec i 0 (concatD [doc (showString "#compute-whnf"), prt 0 term, doc (showString ";")])+    Language.Rzk.Syntax.Abs.CommandComputeNF _ term -> prPrec i 0 (concatD [doc (showString "#compute-nf"), prt 0 term, doc (showString ";")])+    Language.Rzk.Syntax.Abs.CommandPostulate _ varident params term -> prPrec i 0 (concatD [doc (showString "#postulate"), prt 0 varident, prt 0 params, doc (showString ":"), prt 0 term, doc (showString ";")])+    Language.Rzk.Syntax.Abs.CommandDefine _ varident params term1 term2 -> prPrec i 0 (concatD [doc (showString "#define"), prt 0 varident, prt 0 params, doc (showString ":"), prt 0 term1, doc (showString ":="), prt 0 term2, doc (showString ";")])++instance Print [Language.Rzk.Syntax.Abs.Command' a] where+  prt _ [] = concatD []+  prt _ (x:xs) = concatD [prt 0 x, prt 0 xs]++instance Print (Language.Rzk.Syntax.Abs.Pattern' a) where+  prt i = \case+    Language.Rzk.Syntax.Abs.PatternWildcard _ -> prPrec i 0 (concatD [doc (showString "_")])+    Language.Rzk.Syntax.Abs.PatternVar _ varident -> prPrec i 0 (concatD [prt 0 varident])+    Language.Rzk.Syntax.Abs.PatternPair _ pattern_1 pattern_2 -> prPrec i 0 (concatD [doc (showString "("), prt 0 pattern_1, doc (showString ","), prt 0 pattern_2, doc (showString ")")])++instance Print [Language.Rzk.Syntax.Abs.Pattern' a] where+  prt _ [] = concatD []+  prt _ [x] = concatD [prt 0 x]+  prt _ (x:xs) = concatD [prt 0 x, prt 0 xs]++instance Print (Language.Rzk.Syntax.Abs.Param' a) where+  prt i = \case+    Language.Rzk.Syntax.Abs.ParamPattern _ pattern_ -> prPrec i 0 (concatD [prt 0 pattern_])+    Language.Rzk.Syntax.Abs.ParamPatternType _ patterns term -> prPrec i 0 (concatD [doc (showString "("), prt 0 patterns, doc (showString ":"), prt 0 term, doc (showString ")")])+    Language.Rzk.Syntax.Abs.ParamPatternShape _ pattern_ term1 term2 -> prPrec i 0 (concatD [doc (showString "{"), prt 0 pattern_, doc (showString ":"), prt 0 term1, doc (showString "|"), prt 0 term2, doc (showString "}")])++instance Print [Language.Rzk.Syntax.Abs.Param' a] where+  prt _ [] = concatD []+  prt _ [x] = concatD [prt 0 x]+  prt _ (x:xs) = concatD [prt 0 x, prt 0 xs]++instance Print (Language.Rzk.Syntax.Abs.ParamDecl' a) where+  prt i = \case+    Language.Rzk.Syntax.Abs.ParamType _ term -> prPrec i 0 (concatD [prt 6 term])+    Language.Rzk.Syntax.Abs.ParamWildcardType _ term -> prPrec i 0 (concatD [doc (showString "("), doc (showString "_"), doc (showString ":"), prt 0 term, doc (showString ")")])+    Language.Rzk.Syntax.Abs.ParamVarType _ pattern_ term -> prPrec i 0 (concatD [doc (showString "{"), prt 0 pattern_, doc (showString ":"), prt 0 term, doc (showString "}")])+    Language.Rzk.Syntax.Abs.ParamVarShape _ pattern_ term1 term2 -> prPrec i 0 (concatD [doc (showString "{"), doc (showString "("), prt 0 pattern_, doc (showString ":"), prt 0 term1, doc (showString ")"), doc (showString "|"), prt 0 term2, doc (showString "}")])++instance Print (Language.Rzk.Syntax.Abs.Restriction' a) where+  prt i = \case+    Language.Rzk.Syntax.Abs.Restriction _ term1 term2 -> prPrec i 0 (concatD [prt 0 term1, doc (showString "|->"), prt 0 term2])++instance Print [Language.Rzk.Syntax.Abs.Restriction' a] where+  prt _ [] = concatD []+  prt _ [x] = concatD [prt 0 x]+  prt _ (x:xs) = concatD [prt 0 x, doc (showString ","), prt 0 xs]++instance Print (Language.Rzk.Syntax.Abs.Term' a) where+  prt i = \case+    Language.Rzk.Syntax.Abs.Universe _ -> prPrec i 7 (concatD [doc (showString "U")])+    Language.Rzk.Syntax.Abs.UniverseCube _ -> prPrec i 7 (concatD [doc (showString "CUBE")])+    Language.Rzk.Syntax.Abs.UniverseTope _ -> prPrec i 7 (concatD [doc (showString "TOPE")])+    Language.Rzk.Syntax.Abs.CubeUnit _ -> prPrec i 7 (concatD [doc (showString "1")])+    Language.Rzk.Syntax.Abs.CubeUnitStar _ -> prPrec i 7 (concatD [doc (showString "*_1")])+    Language.Rzk.Syntax.Abs.Cube2 _ -> prPrec i 7 (concatD [doc (showString "2")])+    Language.Rzk.Syntax.Abs.Cube2_0 _ -> prPrec i 7 (concatD [doc (showString "0_2")])+    Language.Rzk.Syntax.Abs.Cube2_1 _ -> prPrec i 7 (concatD [doc (showString "1_2")])+    Language.Rzk.Syntax.Abs.CubeProduct _ term1 term2 -> prPrec i 5 (concatD [prt 5 term1, doc (showString "*"), prt 6 term2])+    Language.Rzk.Syntax.Abs.TopeTop _ -> prPrec i 7 (concatD [doc (showString "TOP")])+    Language.Rzk.Syntax.Abs.TopeBottom _ -> prPrec i 7 (concatD [doc (showString "BOT")])+    Language.Rzk.Syntax.Abs.TopeEQ _ term1 term2 -> prPrec i 4 (concatD [prt 5 term1, doc (showString "==="), prt 5 term2])+    Language.Rzk.Syntax.Abs.TopeLEQ _ term1 term2 -> prPrec i 4 (concatD [prt 5 term1, doc (showString "<="), prt 5 term2])+    Language.Rzk.Syntax.Abs.TopeAnd _ term1 term2 -> prPrec i 3 (concatD [prt 4 term1, doc (showString "/\\"), prt 3 term2])+    Language.Rzk.Syntax.Abs.TopeOr _ term1 term2 -> prPrec i 2 (concatD [prt 3 term1, doc (showString "\\/"), prt 2 term2])+    Language.Rzk.Syntax.Abs.RecBottom _ -> prPrec i 7 (concatD [doc (showString "recBOT")])+    Language.Rzk.Syntax.Abs.RecOr _ restrictions -> prPrec i 7 (concatD [doc (showString "recOR"), doc (showString "("), prt 0 restrictions, doc (showString ")")])+    Language.Rzk.Syntax.Abs.TypeFun _ paramdecl term -> prPrec i 1 (concatD [prt 0 paramdecl, doc (showString "->"), prt 1 term])+    Language.Rzk.Syntax.Abs.TypeSigma _ pattern_ term1 term2 -> prPrec i 1 (concatD [doc (showString "Sigma"), doc (showString "("), prt 0 pattern_, doc (showString ":"), prt 0 term1, doc (showString ")"), doc (showString ","), prt 1 term2])+    Language.Rzk.Syntax.Abs.TypeId _ term1 term2 term3 -> prPrec i 1 (concatD [prt 2 term1, doc (showString "=_{"), prt 0 term2, doc (showString "}"), prt 2 term3])+    Language.Rzk.Syntax.Abs.TypeIdSimple _ term1 term2 -> prPrec i 1 (concatD [prt 2 term1, doc (showString "="), prt 2 term2])+    Language.Rzk.Syntax.Abs.TypeRestricted _ term restrictions -> prPrec i 6 (concatD [prt 6 term, doc (showString "["), prt 0 restrictions, doc (showString "]")])+    Language.Rzk.Syntax.Abs.App _ term1 term2 -> prPrec i 6 (concatD [prt 6 term1, prt 7 term2])+    Language.Rzk.Syntax.Abs.Lambda _ params term -> prPrec i 1 (concatD [doc (showString "\\"), prt 0 params, doc (showString "->"), prt 1 term])+    Language.Rzk.Syntax.Abs.Pair _ term1 term2 -> prPrec i 7 (concatD [doc (showString "("), prt 0 term1, doc (showString ","), prt 0 term2, doc (showString ")")])+    Language.Rzk.Syntax.Abs.First _ term -> prPrec i 6 (concatD [doc (showString "first"), prt 7 term])+    Language.Rzk.Syntax.Abs.Second _ term -> prPrec i 6 (concatD [doc (showString "second"), prt 7 term])+    Language.Rzk.Syntax.Abs.Refl _ -> prPrec i 7 (concatD [doc (showString "refl")])+    Language.Rzk.Syntax.Abs.ReflTerm _ term -> prPrec i 7 (concatD [doc (showString "refl_{"), prt 0 term, doc (showString "}")])+    Language.Rzk.Syntax.Abs.ReflTermType _ term1 term2 -> prPrec i 7 (concatD [doc (showString "refl_{"), prt 0 term1, doc (showString ":"), prt 0 term2, doc (showString "}")])+    Language.Rzk.Syntax.Abs.IdJ _ term1 term2 term3 term4 term5 term6 -> prPrec i 7 (concatD [doc (showString "idJ"), doc (showString "("), prt 0 term1, doc (showString ","), prt 0 term2, doc (showString ","), prt 0 term3, doc (showString ","), prt 0 term4, doc (showString ","), prt 0 term5, doc (showString ","), prt 0 term6, doc (showString ")")])+    Language.Rzk.Syntax.Abs.Hole _ holeident -> prPrec i 7 (concatD [prt 0 holeident])+    Language.Rzk.Syntax.Abs.Var _ varident -> prPrec i 7 (concatD [prt 0 varident])+    Language.Rzk.Syntax.Abs.TypeAsc _ term1 term2 -> prPrec i 0 (concatD [prt 2 term1, doc (showString "as"), prt 1 term2])++instance Print [Language.Rzk.Syntax.Abs.Term' a] where+  prt _ [] = concatD []+  prt _ [x] = concatD [prt 0 x]+  prt _ (x:xs) = concatD [prt 0 x, doc (showString ","), prt 0 xs]
+ src/Rzk.hs view
@@ -0,0 +1,1 @@+module Rzk where
+ src/Rzk/Main.hs view
@@ -0,0 +1,49 @@+module Rzk.Main where++import System.Environment (getArgs)+import Control.Monad (forM)++import qualified Language.Rzk.Syntax as Rzk+import Rzk.TypeCheck++main :: IO ()+main = do+  args <- getArgs+  case args of+    "typecheck" : paths -> do+      modules <- forM paths $ \path -> do+        putStrLn ("Loading file " <> path)+        result <- Rzk.parseModule <$> readFile path+        case result of+          Left err -> do+            putStrLn ("An error occurred when parsing file " <> path)+            error err+          Right rzkModule -> return (path, rzkModule)+      case defaultTypeCheck (typecheckModulesWithLocation modules) of+        Left err -> do+          putStrLn "An error occurred when typechecking!"+          putStrLn "Rendering type error... (this may take a few seconds)"+          putStrLn $ unlines+            [ "Type Error:"+            , ppTypeErrorInScopedContext' err+            ]+        Right () -> putStrLn "Everything is ok!"+    _ -> ppUsage++ppUsage :: IO ()+ppUsage = putStrLn "rzk typecheck FILE"++typecheckString :: String -> Either String String+typecheckString moduleString = do+  rzkModule <- Rzk.parseModule moduleString+  case defaultTypeCheck (typecheckModule rzkModule) of+    Left err -> Left $ unlines+      [ "An error occurred when typechecking!"+      , "Rendering type error... (this may take a few seconds)"+      , unlines+        [ "Type Error:"+        , ppTypeErrorInScopedContext' err+        ]+      ]+    Right _ -> pure "Everything is ok!"+
+ src/Rzk/TypeCheck.hs view
@@ -0,0 +1,2155 @@+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE DeriveFoldable #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE RecordWildCards #-}+module Rzk.TypeCheck where++import Control.Applicative ((<|>))+import Control.Monad.Reader+import Control.Monad.Except+import Data.List (tails, (\\), intercalate, nub)+import Data.Maybe (fromMaybe, isNothing, catMaybes, mapMaybe)+import Data.Tuple (swap)++import Free.Scoped+import Language.Rzk.Free.Syntax+import qualified Language.Rzk.Syntax as Rzk++import Debug.Trace+import Unsafe.Coerce++defaultTypeCheck+  :: TypeCheck Rzk.VarIdent a+  -> Either (TypeErrorInScopedContext Rzk.VarIdent) a+defaultTypeCheck tc = runExcept (runReaderT tc emptyContext)++data Decl var = Decl+  { declName :: var+  , declType :: TermT var+  , declValue :: Maybe (TermT var)+  }++type Decl' = Decl Rzk.VarIdent++typecheckModulesWithLocation :: [(FilePath, Rzk.Module)] -> TypeCheck Rzk.VarIdent ()+typecheckModulesWithLocation = \case+  [] -> return ()+  m : ms -> do+    decls <- typecheckModuleWithLocation m+    localDeclsPrepared decls $+      typecheckModulesWithLocation ms++typecheckModules :: [Rzk.Module] -> TypeCheck Rzk.VarIdent ()+typecheckModules = \case+  [] -> return ()+  m : ms -> do+    decls <- typecheckModule m+    localDeclsPrepared decls $+      typecheckModules ms++typecheckModuleWithLocation :: (FilePath, Rzk.Module) -> TypeCheck Rzk.VarIdent [Decl']+typecheckModuleWithLocation (path, module_) = do+  traceTypeCheck Normal ("Checking module from " <> path) $ do+    withLocation (LocationInfo { locationFilePath = Just path, locationLine = Nothing }) $+      typecheckModule module_++typecheckModule :: Rzk.Module -> TypeCheck Rzk.VarIdent [Decl']+typecheckModule (Rzk.Module _loc _lang commands) = go 1 commands+  where+    totalCommands = length commands++    go :: Integer -> [Rzk.Command] -> TypeCheck Rzk.VarIdent [Decl']+    go _i [] = return []++    go  i (command@(Rzk.CommandUnsetOption _loc optionName) : moreCommands) = do+      traceTypeCheck Normal ("[ " <> show i <> " out of " <> show totalCommands <> " ]"+          <> " Unsetting option " <> optionName) $ do+        withCommand command $ do+          unsetOption optionName $+            go (i + 1) moreCommands++    go  i (command@(Rzk.CommandSetOption _loc optionName optionValue) : moreCommands) = do+      traceTypeCheck Normal ("[ " <> show i <> " out of " <> show totalCommands <> " ]"+          <> " Setting option " <> optionName <> " = " <> optionValue ) $ do+        withCommand command $ do+          setOption optionName optionValue $+            go (i + 1) moreCommands++    go  i (command@(Rzk.CommandDefine _loc name params ty term) : moreCommands) =+      traceTypeCheck Normal ("[ " <> show i <> " out of " <> show totalCommands <> " ]"+          <> " Checking #define " <> show (Pure name :: Term') ) $ do+        withCommand command $ do+          paramDecls <- concat <$> mapM paramToParamDecl params+          ty' <- typecheck (toTerm' (addParamDecls paramDecls ty)) universeT >>= whnfT -- >>= pure . termIsWHNF+          term' <- typecheck (toTerm' (addParams params term)) ty' >>= whnfT >>= pure . termIsWHNF+          let decl = Decl name ty' (Just term')+          fmap (decl :) $+            localDeclPrepared decl $+              go (i + 1) moreCommands++    go  i (command@(Rzk.CommandPostulate _loc name params ty) : moreCommands) =+      traceTypeCheck Normal ("[ " <> show i <> " out of " <> show totalCommands <> " ]"+          <> " Checking #postulate " <> show (Pure name :: Term') ) $ do+        withCommand command $ do+          paramDecls <- concat <$> mapM paramToParamDecl params+          ty' <- typecheck (toTerm' (addParamDecls paramDecls ty)) universeT >>= whnfT -- >>= pure . termIsWHNF+          let decl = Decl name ty' Nothing+          fmap (decl :) $+            localDeclPrepared decl $+              go (i + 1) moreCommands++    go  i (command@(Rzk.CommandCheck _loc term ty) : moreCommands) =+      traceTypeCheck Normal ("[ " <> show i <> " out of " <> show totalCommands <> " ]"+          <> " Checking " <> Rzk.printTree term <> " : " <> Rzk.printTree ty ) $ do+        withCommand command $ do+          ty' <- typecheck (toTerm' ty) universeT >>= whnfT -- >>= pure . termIsWHNF+          _term' <- typecheck (toTerm' term) ty'+          go (i + 1) moreCommands++    go  i (Rzk.CommandCompute loc term : moreCommands) =+      go i (Rzk.CommandComputeWHNF loc term : moreCommands)++    go  i (command@(Rzk.CommandComputeNF _loc term) : moreCommands) =+      traceTypeCheck Normal ("[ " <> show i <> " out of " <> show totalCommands <> " ]"+          <> " Computing NF for " <> Rzk.printTree term) $ do+        withCommand command $ do+          term' <- infer (toTerm' term) >>= nfT+          traceTypeCheck Normal ("  " <> show (untyped term')) $ do+            go (i + 1) moreCommands++    go  i (command@(Rzk.CommandComputeWHNF _loc term) : moreCommands) =+      traceTypeCheck Normal ("[ " <> show i <> " out of " <> show totalCommands <> " ]"+          <> " Computing WHNF for " <> Rzk.printTree term) $ do+        withCommand command $ do+          term' <- infer (toTerm' term) >>= whnfT+          traceTypeCheck Normal ("  " <> show (untyped term')) $ do+            go (i + 1) moreCommands++setOption :: String -> String -> TypeCheck var a -> TypeCheck var a+setOption "verbosity" = \case+  "debug"   -> localVerbosity Debug+  "normal"  -> localVerbosity Normal+  "silent"  -> localVerbosity Silent+  _ -> const $+    issueTypeError $ TypeErrorOther "unknown verbosity level (use \"debug\", \"normal\", or \"silent\")"+setOption optionName = const $ const $+  issueTypeError $ TypeErrorOther ("unknown option " <> show optionName)++unsetOption :: String -> TypeCheck var a -> TypeCheck var a+unsetOption "verbosity" = localVerbosity (verbosity emptyContext)+unsetOption optionName = const $+  issueTypeError $ TypeErrorOther ("unknown option " <> show optionName)++paramToParamDecl :: Rzk.Param -> TypeCheck var [Rzk.ParamDecl]+paramToParamDecl (Rzk.ParamPatternShape loc pat cube tope) = pure [Rzk.ParamVarShape loc pat cube tope]+paramToParamDecl (Rzk.ParamPatternType loc pats ty) = pure $ map (\pat -> Rzk.ParamVarType loc pat ty) pats+paramToParamDecl Rzk.ParamPattern{} = issueTypeError $+  TypeErrorOther "untyped pattern in parameters"++addParamDecls :: [Rzk.ParamDecl] -> Rzk.Term -> Rzk.Term+addParamDecls [] = id+addParamDecls (paramDecl : paramDecls)+  = Rzk.TypeFun Nothing paramDecl . addParamDecls paramDecls++addParams :: [Rzk.Param] -> Rzk.Term -> Rzk.Term+addParams [] = id+addParams params = Rzk.Lambda Nothing params++data TypeError var+  = TypeErrorOther String+  | TypeErrorUnify (TermT var) (TermT var) (TermT var)+  | TypeErrorUnifyTerms (TermT var) (TermT var)+  | TypeErrorNotPair (TermT var) (TermT var)+  | TypeErrorNotFunction (TermT var) (TermT var)+  | TypeErrorUnexpectedLambda (Term var) (TermT var)+  | TypeErrorUnexpectedPair (Term var) (TermT var)+  | TypeErrorUnexpectedRefl (Term var) (TermT var)+  | TypeErrorCannotInferBareLambda (Term var)+  | TypeErrorCannotInferBareRefl (Term var)+  | TypeErrorUndefined var+  | TypeErrorTopeNotSatisfied [TermT var] (TermT var)+  | TypeErrorTopesNotEquivalent (TermT var) (TermT var)+  | TypeErrorInvalidArgumentType (Term var) (TermT var)+  | TypeErrorDuplicateTopLevel Rzk.VarIdent+  deriving (Functor, Foldable)++data TypeErrorInContext var = TypeErrorInContext+  { typeErrorError   :: TypeError var+  , typeErrorContext :: Context var+  } deriving (Functor, Foldable)++data TypeErrorInScopedContext var+  = PlainTypeError (TypeErrorInContext var)+  | ScopedTypeError (Maybe Rzk.VarIdent) (TypeErrorInScopedContext (Inc var))+  deriving (Functor, Foldable)++type TypeError' = TypeError Rzk.VarIdent++ppTypeError' :: TypeError' -> String+ppTypeError' = \case+  TypeErrorOther msg -> msg+  TypeErrorUnify term expected actual -> unlines+    [ "cannot unify expected type"+    , "  " <> show (untyped expected)+    , "with actual type"+    , "  " <> show (untyped actual)+    , "for term"+    , "  " <> show (untyped term) ]+  TypeErrorUnifyTerms expected actual -> unlines+    [ "cannot unify term"+    , "  " <> show (untyped expected)+    , "with term"+    , "  " <> show (untyped actual) ]+  TypeErrorNotPair term ty -> unlines+    [ "expected a cube product or dependent pair"+    , "but got type"+    , "  " <> show (untyped ty)+    , "for term"+    , "  " <> show (untyped term)+    , case ty of+        TypeFunT{} -> "\nPerhaps the term is applied to too few arguments?"+        _ -> ""+    ]++  TypeErrorUnexpectedLambda term ty -> unlines+    [ "unexpected lambda abstraction"+    , "  " <> show term+    , "when typechecking against a non-function type"+    , "  " <> show ty+    ]+  TypeErrorUnexpectedPair term ty -> unlines+    [ "unexpected pair"+    , "  " <> show term+    , "when typechecking against a type that is not a product or a dependent sum"+    , "  " <> show ty+    ]+  TypeErrorUnexpectedRefl term ty -> unlines+    [ "unexpected refl"+    , "  " <> show term+    , "when typechecking against a type that is not an identity type"+    , "  " <> show ty+    ]++  TypeErrorNotFunction term ty -> unlines+    [ "expected a function or extension type"+    , "but got type"+    , "  " <> show (untyped ty)+    , "for term"+    , "  " <> show (untyped term)+    , case term of+        AppT _ty f _x -> "\nPerhaps the term\n  " <> show (untyped f) <> "\nis applied to too many arguments?"+        _ -> ""+    ]+  TypeErrorCannotInferBareLambda term -> unlines+    [ "cannot infer the type of the argument"+    , "in lambda abstraction"+    , "  " <> show term+    ]+  TypeErrorCannotInferBareRefl term -> unlines+    [ "cannot infer the type of term"+    , "  " <> show term+    ]+  TypeErrorUndefined var -> unlines+    [ "undefined variable: " <> show (Pure var :: Term') ]+  TypeErrorTopeNotSatisfied topes tope -> unlines+    [ "local context is not included in (does not entail) the tope"+    , "  " <> show (untyped tope)+    , "in local context (normalised)"+    , intercalate "\n" (map ("  " <>) (map show topes))+    , intercalate "\n" (map ("  " <>) (map show (generateTopesForPoints (allTopePoints tope))))] -- FIXME: remove+  TypeErrorTopesNotEquivalent expected actual -> unlines+    [ "expected tope"+    , "  " <> show (untyped expected)+    , "but got"+    , "  " <> show (untyped actual) ]++  TypeErrorInvalidArgumentType argType argKind -> unlines+    [ "invalid function parameter type"+    , "  " <> show argType+    , "function parameter can be a cube, a shape, or a type"+    , "but given parameter type has type"+    , "  " <> show (untyped argKind)+    ]++  TypeErrorDuplicateTopLevel name -> unlines+    [ "duplicate top-level definition"+    , "  " <> Rzk.printTree name+    ]++ppTypeErrorInContext :: TypeErrorInContext Rzk.VarIdent -> String+ppTypeErrorInContext TypeErrorInContext{..} = intercalate "\n"+  [ ppContext' typeErrorContext+  , ppTypeError' typeErrorError+  ]++ppTypeErrorInScopedContextWith'+  :: [Rzk.VarIdent]+  -> [Rzk.VarIdent]+  -> TypeErrorInScopedContext Rzk.VarIdent+  -> String+ppTypeErrorInScopedContextWith' used vars = \case+  PlainTypeError err -> ppTypeErrorInContext err+  ScopedTypeError orig err -> withFresh orig $ \(x, xs) ->+    ppTypeErrorInScopedContextWith' (x:used) xs $ fmap (g x) err+  where+    g x Z = x+    g _ (S y) = y++    withFresh Nothing f =+      case vars of+        x:xs -> f (x, xs)+        _ -> panicImpossible "not enough fresh variables"+    withFresh (Just z) f = f (z', filter (/= z') vars)    -- FIXME: very inefficient filter+      where+        z' = refreshVar used z -- FIXME: inefficient++ppTypeErrorInScopedContext' :: TypeErrorInScopedContext Rzk.VarIdent -> String+ppTypeErrorInScopedContext' err = ppTypeErrorInScopedContextWith' vars (defaultVarIdents \\ vars) err+  where+    vars = nub (foldMap pure err)++issueTypeError :: TypeError var -> TypeCheck var a+issueTypeError err = do+  context <- ask+  throwError $ PlainTypeError $ TypeErrorInContext+    { typeErrorError = err+    , typeErrorContext = context+    }++panicImpossible :: String -> a+panicImpossible msg = error $ unlines+  [ "PANIC! Impossible happened (" <> msg <> ")!"+  , "Please, report a bug at https://github.com/fizruk/rzk/issues"+    -- TODO: add details and/or instructions how to produce an artifact for reproducing+  ]++data Action var+  = ActionTypeCheck (Term var) (TermT var)+  | ActionUnify (TermT var) (TermT var) (TermT var)+  | ActionUnifyTerms (TermT var) (TermT var)+  | ActionInfer (Term var)+  | ActionContextEntailedBy (TermT var)+  | ActionContextEntails (TermT var)+  | ActionContextEquiv [TermT var]+  | ActionWHNF (TermT var)+  | ActionNF (TermT var)+  | ActionCheckCoherence (TermT var, TermT var) (TermT var, TermT var)+  deriving (Functor, Foldable)++type Action' = Action Rzk.VarIdent++ppSomeAction :: Eq var => [(var, Maybe Rzk.VarIdent)] -> Int -> Action var -> String+ppSomeAction origs n action = ppAction n (toRzkVarIdent <$> action)+  where+    vars = nub (foldMap pure action)+    mapping = zip vars defaultVarIdents+    toRzkVarIdent var = fromMaybe (Rzk.VarIdent "_") $+      join (lookup var origs) <|> lookup var mapping++ppAction :: Int -> Action' -> String+ppAction n = unlines . map (replicate (2 * n) ' ' <>) . \case+  ActionTypeCheck term ty ->+    [ "typechecking"+    , "  " <> show term+    , "against type"+    , "  " <> show (untyped ty) ]++  ActionUnify term expected actual ->+    [ "unifying expected type"+    , "  " <> show (untyped expected)+    , "with actual type"+    , "  " <> show (untyped actual)+    , "for term"+    , "  " <> show (untyped term) ]++  ActionUnifyTerms expected actual ->+    [ "unifying term"+    , "  " <> show expected+    , "with term"+    , "  " <> show actual ]++  ActionInfer term ->+    [ "inferring type for term"+    , "  " <> show term ]++  ActionContextEntailedBy term ->+    [ "checking if local context includes (is entailed by) restriction tope"+    , "  " <> show (untyped term) ]++  ActionContextEntails term ->+    [ "checking if local context is included in (entails) the tope"+    , "  " <> show (untyped term) ]++  ActionContextEquiv terms ->+    [ "checking if local context is equivalent to the union of the topes"+    , intercalate "\n" (map (("  " <>) . show . untyped) terms) ]++  ActionWHNF term ->+    [ "computing WHNF for term"+    , "  " <> show term ]++  ActionNF term ->+    [ "computing normal form for term"+    , "  " <> show (untyped term) ]++  ActionCheckCoherence (ltope, lterm) (rtope, rterm) ->+    [ "checking coherence for"+    , "  " <> show (untyped ltope)+    , "  |-> " <> show (untyped lterm)+    , "and"+    , "  " <> show (untyped rtope)+    , "  |-> " <> show (untyped rterm) ]+++traceAction' :: Int -> Action' -> a -> a+traceAction' n action = trace ("[debug]\n" <> ppAction n action)++unsafeTraceAction' :: Int -> Action var -> a -> a+unsafeTraceAction' n = traceAction' n . unsafeCoerce++data LocationInfo = LocationInfo+  { locationFilePath  :: Maybe FilePath+  , locationLine      :: Maybe Int+  }++data Verbosity+  = Debug+  | Normal+  | Silent+  deriving (Eq, Ord)++trace' :: Verbosity -> Verbosity -> String -> a -> a+trace' msgLevel currentLevel+  | currentLevel <= msgLevel = trace+  | otherwise                = const id++traceTypeCheck :: Verbosity -> String -> TypeCheck var a -> TypeCheck var a+traceTypeCheck msgLevel msg tc = do+  Context{..} <- ask+  trace' msgLevel verbosity msg tc++localVerbosity :: Verbosity -> TypeCheck var a -> TypeCheck var a+localVerbosity v = local $ \Context{..} -> Context { verbosity = v, .. }++data Covariance+  = Covariant     -- ^ Positive position.+  | Contravariant -- ^ Negative position++data Context var = Context+  { varTypes          :: [(var, TermT var)]+  , varValues         :: [(var, Maybe (TermT var))]+  , varOrigs          :: [(var, Maybe Rzk.VarIdent)]+  , localTopes        :: [TermT var]+  , localTopesNF      :: [TermT var]+  , localTopesNFUnion :: [[TermT var]]+  , localTopesEntailBottom  :: Bool+  , actionStack       :: [Action var]+  , currentCommand    :: Maybe Rzk.Command+  , location          :: Maybe LocationInfo+  , verbosity         :: Verbosity+  , covariance        :: Covariance+  } deriving (Functor, Foldable)++emptyContext :: Context var+emptyContext = Context+  { varTypes = []+  , varValues = []+  , varOrigs = []+  , localTopes = []+  , localTopesNF = []+  , localTopesNFUnion = [[]]+  , localTopesEntailBottom = False+  , actionStack = []+  , currentCommand = Nothing+  , location = Nothing+  , verbosity = Normal+  , covariance = Covariant+  }++ppContext' :: Context Rzk.VarIdent -> String+ppContext' Context{..} = unlines+  [ "Definitions in context:"+  , unlines+      [ show (Pure x :: Term') <> " : " <> show (untyped ty)+      | (x, ty) <- reverse varTypes ]+--  , unlines+--      [ show (Pure x :: Term') <> " = " <> show (untyped term)+--      | (x, Just term) <- reverse varValues ]+  , intercalate "\n" (map (("when " <>) . ppAction 0) (reverse actionStack))+  , "Local tope context:"+  , intercalate "\n" (map (("  " <>) . show . untyped) localTopes)+  , case location of+      Just (LocationInfo (Just path) _) -> "\n" <> path <> ":"+      _ -> ""+  , case currentCommand of+      Just (Rzk.CommandDefine _loc name _params _ty _term) ->+        "  Error occurred when checking\n    #define " <> show (Pure name :: Term')+      Just (Rzk.CommandPostulate _loc name _params _ty ) ->+        "  Error occurred when checking\n    #postulate " <> show (Pure name :: Term')+      Just (Rzk.CommandCheck _loc term ty) ->+        "  Error occurred when checking\n    " <> Rzk.printTree term <> " : " <> Rzk.printTree ty+      Just (Rzk.CommandCompute _loc term) ->+        "  Error occurred when computing\n    " <> Rzk.printTree term+      Just (Rzk.CommandComputeNF _loc term) ->+        "  Error occurred when computing NF for\n    " <> Rzk.printTree term+      Just (Rzk.CommandComputeWHNF _loc term) ->+        "  Error occurred when computing WHNF for\n    " <> Rzk.printTree term+      Just (Rzk.CommandSetOption _loc optionName _optionValue) ->+        "  Error occurred when trying to set option\n    #set-option " <> show optionName+      Just (Rzk.CommandUnsetOption _loc optionName) ->+        "  Error occurred when trying to unset option\n    #unset-option " <> show optionName+      Nothing -> ""+--  , "Local tope context (expanded):"+--  , intercalate "\n" (map (("  " <>) . show . untyped) (intercalate [TopeAndT topeT topeBottomT topeBottomT] (saturateTopes [] <$> simplifyLHS localTopes)))+  ]++doesShadowName :: Rzk.VarIdent -> TypeCheck var Bool+doesShadowName name = asks $ \Context{..} ->+  name `elem` mapMaybe snd varOrigs++checkTopLevelDuplicate :: Rzk.VarIdent -> TypeCheck var ()+checkTopLevelDuplicate name = do+  doesShadowName name >>= \case+    True -> issueTypeError (TypeErrorDuplicateTopLevel name)+    False -> return ()++checkNameShadowing :: Rzk.VarIdent -> TypeCheck var ()+checkNameShadowing name = do+  doesShadowName name >>= \case+    True -> do+      trace ("Warning: " <> Rzk.printTree name <> " shadows an existing definition") $+        return ()+    False -> return ()++withLocation :: LocationInfo -> TypeCheck var a -> TypeCheck var a+withLocation loc = local $ \Context{..} -> Context { location = Just loc, .. }++withCommand :: Rzk.Command -> TypeCheck var a -> TypeCheck var a+withCommand command = local $ \Context{..} -> Context { currentCommand = Just command, .. }++localDecls :: [Decl Rzk.VarIdent] -> TypeCheck Rzk.VarIdent a -> TypeCheck Rzk.VarIdent a+localDecls [] = id+localDecls (decl : decls) = localDecl decl . localDecls decls++localDeclsPrepared :: [Decl Rzk.VarIdent] -> TypeCheck Rzk.VarIdent a -> TypeCheck Rzk.VarIdent a+localDeclsPrepared [] = id+localDeclsPrepared (decl : decls) = localDeclPrepared decl . localDeclsPrepared decls++localDecl :: Decl Rzk.VarIdent -> TypeCheck Rzk.VarIdent a -> TypeCheck Rzk.VarIdent a+localDecl (Decl x ty term) tc = do+  ty' <- whnfT ty+  term' <- traverse whnfT term+  localDeclPrepared (Decl x ty' term') tc++localDeclPrepared :: Decl Rzk.VarIdent -> TypeCheck Rzk.VarIdent a -> TypeCheck Rzk.VarIdent a+localDeclPrepared (Decl x ty term) tc = do+  checkTopLevelDuplicate x+  local update tc+  where+    update Context{..} = Context+      { varTypes = (x, ty) : varTypes+      , varValues = (x, term) : varValues+      , varOrigs = (x, Just x) : varOrigs+      , .. }++type TypeCheck var = ReaderT (Context var) (Except (TypeErrorInScopedContext var))++showSomeTermTs :: Eq var => [TermT var] -> String+showSomeTermTs terms = show [ untyped (rename <$> term) | term <- terms ]+  where+    vars = nub (foldMap (foldMap pure) terms)+    mapping = zip vars defaultVarIdents+    rename x = fromMaybe (Rzk.VarIdent "?") (lookup x mapping)++traceStartAndFinish :: Show a => String -> a -> a+traceStartAndFinish tag = trace ("start [" <> tag <> "]") .+  (\x -> trace ("finish [" <> tag <> "] with " <> show x) x)++entail :: Eq var => [TermT var] -> TermT var -> Bool+entail topes tope = all (`solveRHS` tope) $+  saturateTopes (allTopePoints tope) <$>+    simplifyLHS topes'+  where+    topes' = nubTermT (topes <> generateTopesForPoints (allTopePoints tope))++nubTermT :: Eq var => [TermT var] -> [TermT var]+nubTermT [] = []+nubTermT (t:ts) = t : nubTermT (filter (/= t) ts)++saturateTopes :: Eq var => [TermT var] -> [TermT var] -> [TermT var]+saturateTopes _points topes = saturateWith+  (\tope ts -> tope `elem` ts)+  generateTopes+  topes++-- FIXME: cleanup+saturateWith :: (a -> [a] -> Bool) -> ([a] -> [a] -> [a]) -> [a] -> [a]+saturateWith elem' step zs = go (nub' zs) []+  where+    go lastNew xs+      | null new = lastNew+      | otherwise = lastNew <> go new xs'+      where+        xs' = lastNew <> xs+        new = filter (not . (`elem'` xs')) (nub' $ step lastNew xs)+    nub' [] = []+    nub' (x:xs) = x : nub' (filter (not . (`elem'` [x])) xs)++generateTopes :: Eq var => [TermT var] -> [TermT var] -> [TermT var]+generateTopes newTopes oldTopes+  | topeBottomT `elem` newTopes = []+  | topeEQT cube2_0T cube2_1T `elem` newTopes = [topeBottomT]+  | otherwise = concat+      [  -- symmetry EQ+        [ topeEQT y x | TopeEQT _ty x y <- newTopes ]+        -- transitivity EQ (1)+      , [ topeEQT x z+        | TopeEQT _ty x y : newTopes' <- tails newTopes+        , TopeEQT _ty y' z <- newTopes' <> oldTopes+        , y == y' ]+        -- transitivity EQ (2)+      , [ topeEQT x z+        | TopeEQT _ty y z : newTopes' <- tails newTopes+        , TopeEQT _ty x y' <- newTopes' <> oldTopes+        , y == y' ]++        -- transitivity LEQ (1)+      , [ topeLEQT x z+        | TopeLEQT _ty x y : newTopes' <- tails newTopes+        , TopeLEQT _ty y' z <- newTopes' <> oldTopes+        , y == y' ]+        -- transitivity LEQ (2)+      , [ topeLEQT x z+        | TopeLEQT _ty y z : newTopes' <- tails newTopes+        , TopeLEQT _ty x y' <- newTopes' <> oldTopes+        , y == y' ]++        -- antisymmetry LEQ+      , [ topeEQT x y+        | TopeLEQT _ty x y : newTopes' <- tails newTopes+        , TopeLEQT _ty y' x' <- newTopes' <> oldTopes+        , y == y'+        , x == x' ]++        -- FIXME: special case of substitution of EQ+        -- transitivity EQ-LEQ (1)+      , [ topeLEQT x z+        | TopeEQT  _ty y z : newTopes' <- tails newTopes+        , TopeLEQT _ty x y' <- newTopes' <> oldTopes+        , y == y' ]+  +        -- FIXME: special case of substitution of EQ+        -- transitivity EQ-LEQ (2)+      , [ topeLEQT x z+        | TopeEQT  _ty x y : newTopes' <- tails newTopes+        , TopeLEQT _ty y' z <- newTopes' <> oldTopes+        , y == y' ]+  +        -- FIXME: special case of substitution of EQ+        -- transitivity EQ-LEQ (3)+      , [ topeLEQT x z+        | TopeLEQT  _ty y z : newTopes' <- tails newTopes+        , TopeEQT _ty x y' <- newTopes' <> oldTopes+        , y == y' ]+  +        -- FIXME: special case of substitution of EQ+        -- transitivity EQ-LEQ (4)+      , [ topeLEQT x z+        | TopeLEQT  _ty x y : newTopes' <- tails newTopes+        , TopeEQT _ty y' z <- newTopes' <> oldTopes+        , y == y' ]++        -- FIXME: consequence of LEM for LEQ and antisymmetry for LEQ+      , [ topeEQT x y | TopeLEQT _ty x y@Cube2_0T{} <- newTopes ]+        -- FIXME: consequence of LEM for LEQ and antisymmetry for LEQ+      , [ topeEQT x y | TopeLEQT _ty x@Cube2_1T{} y <- newTopes ]+      ]++generateTopesForPoints :: Eq var => [TermT var] -> [TermT var]+generateTopesForPoints points = nubTermT $ concat+  [ [ topeOrT (topeLEQT x y) (topeLEQT y x)+    | x : points' <- tails points, y <- points'+    , x /= y+    , x `notElem` [cube2_0T, cube2_1T]+    , y `notElem` [cube2_0T, cube2_1T] ]+  ]++allTopePoints :: Eq var => TermT var -> [TermT var]+allTopePoints = nubTermT . foldMap subPoints . nubTermT . topePoints++topePoints :: TermT var -> [TermT var]+topePoints = \case+  TopeTopT{} -> []+  TopeBottomT{} -> []+  TopeAndT _ l r -> topePoints l <> topePoints r+  TopeOrT  _ l r -> topePoints l <> topePoints r+  TopeEQT  _ x y -> [x, y]+  TopeLEQT _ x y -> [x, y]+  _ -> []++subPoints :: TermT var -> [TermT var]+subPoints = \case+  p@(PairT _ x y) -> p : foldMap subPoints [x, y]+  p@Pure{} -> [p]+  p@(Free (AnnF TypeInfo{..} _))+    | Cube2T{} <- infoType -> [p]+  _ -> []++simplifyLHS :: Eq var => [TermT var] -> [[TermT var]]+simplifyLHS topes = map nubTermT $+  case topes of+    [] -> [[]]+    TopeTopT{} : topes' -> simplifyLHS topes'+    TopeBottomT{} : _  -> [[topeBottomT]]+    TopeAndT _ l r : topes' -> simplifyLHS (l : r : topes')+    TopeOrT  _ l r : topes' -> simplifyLHS (l : topes') <> simplifyLHS (r : topes')+    TopeEQT  _ (PairT _ x y) (PairT _ x' y') : topes' ->+      simplifyLHS (topeEQT x x' : topeEQT y y' : topes')+    t : topes' -> map (t:) (simplifyLHS topes')++solveRHS :: Eq var => [TermT var] -> TermT var -> Bool+solveRHS topes tope =+  case tope of+    _ | topeBottomT `elem` topes -> True+    TopeTopT{}     -> True+    TopeEQT  _ty (PairT _ty1 x y) (PairT _ty2 x' y')+      | solveRHS topes (topeEQT x x') && solveRHS topes (topeEQT y y') -> True+    TopeEQT  _ty l r -> or+      [ l == r+      , tope `elem` topes+      , topeEQT r l `elem` topes+      ]+    TopeLEQT _ty l r+      | l == r -> True+      | solveRHS topes (topeEQT l r) -> True+      | solveRHS topes (topeEQT l cube2_0T) -> True+      | solveRHS topes (topeEQT r cube2_1T) -> True+    -- TopeBottomT{}  -> solveLHS topes tope+    TopeAndT _ l r -> solveRHS topes l && solveRHS topes r+    TopeOrT  _ l r -> solveRHS topes l || solveRHS topes r+    _ -> tope `elem` topes++checkTope :: Eq var => TermT var -> TypeCheck var Bool+checkTope tope = performing (ActionContextEntails tope) $ do+  topes' <- asks localTopesNF+  tope' <- nfTope tope+  return (topes' `entail` tope')++contextEntailedBy :: Eq var => TermT var -> TypeCheck var ()+contextEntailedBy tope = performing (ActionContextEntailedBy tope) $ do+  contextTopes <- asks localTopesNF+  restrictionTope <- nfTope tope+  let contextTopesRHS = foldr topeOrT topeBottomT contextTopes+  unless ([restrictionTope] `entail` contextTopesRHS) $+    issueTypeError $ TypeErrorTopeNotSatisfied [restrictionTope] contextTopesRHS++contextEntails :: Eq var => TermT var -> TypeCheck var ()+contextEntails tope = performing (ActionContextEntails tope) $ do+  topeIsEntailed <- checkTope tope+  topes' <- asks localTopesNF+  unless topeIsEntailed $+    issueTypeError $ TypeErrorTopeNotSatisfied topes' tope++topesEquiv :: Eq var => TermT var -> TermT var -> TypeCheck var Bool+topesEquiv expected actual = performing (ActionUnifyTerms expected actual) $ do+  expected' <- nfT expected+  actual' <- nfT actual+  return ([expected'] `entail` actual' && [actual'] `entail` expected')++contextEquiv :: Eq var => [TermT var] -> TypeCheck var ()+contextEquiv topes = performing (ActionContextEquiv topes) $ do+  contextTopes <- asks localTopesNF+  recTopes <- mapM nfTope topes+  let contextTopesRHS = foldr topeOrT topeBottomT contextTopes+      recTopesRHS     = foldr topeOrT topeBottomT recTopes+  unless (contextTopes `entail` recTopesRHS) $+    issueTypeError $ TypeErrorTopeNotSatisfied contextTopes recTopesRHS+  unless (recTopes `entail` contextTopesRHS) $+    issueTypeError $ TypeErrorTopeNotSatisfied recTopes contextTopesRHS++switchVariance :: TypeCheck var a -> TypeCheck var a+switchVariance = local $ \Context{..} -> Context+  { covariance = switch covariance, .. }+    where+      switch Covariant = Contravariant+      switch Contravariant = Covariant++enterScopeContext :: Maybe Rzk.VarIdent -> TermT var -> Context var -> Context (Inc var)+enterScopeContext orig ty Context{..} = Context+  { varTypes = (Z, S <$> ty) : [ (S x, fmap S t) | (x, t) <- varTypes ]+  , varValues = (Z, Nothing) : [ (S x, fmap S <$> t) | (x, t) <- varValues ]+  , varOrigs = (Z, orig) : [ (S x, o) | (x, o) <- varOrigs ]+  , localTopes = map (fmap S) localTopes+  , localTopesNF = map (fmap S) localTopesNF+  , localTopesNFUnion = map (map (fmap S)) localTopesNFUnion+  , actionStack = map (fmap S) actionStack+  , ..+  }++enterScope :: Maybe Rzk.VarIdent -> TermT var -> TypeCheck (Inc var) b -> TypeCheck var b+enterScope orig ty action = do+  newContext <- asks (enterScopeContext orig ty)+  lift $ withExceptT (ScopedTypeError orig) $+    runReaderT action newContext++performing :: Eq var => Action var -> TypeCheck var a -> TypeCheck var a+performing action tc = do+  Context{..} <- ask+  unless (length actionStack < 1000) $  -- FIXME: which depth is reasonable? factor out into a parameter+    issueTypeError $ TypeErrorOther "maximum depth reached"+  traceTypeCheck Debug (ppSomeAction varOrigs (length actionStack) action) $+    local (const Context { actionStack = action : actionStack, .. }) $ tc++stripTypeRestrictions :: TermT var -> TermT var+stripTypeRestrictions (TypeRestrictedT _ty ty _restriction) = stripTypeRestrictions ty+stripTypeRestrictions t = t++-- | Perform at most one \(\eta\)-expansion at the top-level to assist unification.+etaMatch :: Eq var => Maybe (TermT var) -> TermT var -> TermT var -> TypeCheck var (TermT var, TermT var)+-- FIXME: double check the next 3 rules+etaMatch _mterm expected@TypeRestrictedT{} actual@TypeRestrictedT{} = pure (expected, actual)+etaMatch  mterm expected (TypeRestrictedT _ty ty _rs) = etaMatch mterm expected ty+etaMatch (Just term) expected@TypeRestrictedT{} actual =+  etaMatch (Just term) expected (typeRestrictedT actual [(topeTopT, term)])+-- ------------------------------------+etaMatch _mterm expected@LambdaT{} actual@LambdaT{} = pure (expected, actual)+etaMatch _mterm expected@PairT{}   actual@PairT{}   = pure (expected, actual)+etaMatch _mterm expected@LambdaT{} actual = do+  actual' <- etaExpand actual+  pure (expected, actual')+etaMatch _mterm expected actual@LambdaT{} = do+  expected' <- etaExpand expected+  pure (expected', actual)+etaMatch _mterm expected@PairT{} actual = do+  actual' <- etaExpand actual+  pure (expected, actual')+etaMatch _mterm expected actual@PairT{} = do+  expected' <- etaExpand expected+  pure (expected', actual)+etaMatch _mterm expected actual = pure (expected, actual)++etaExpand :: Eq var => TermT var -> TypeCheck var (TermT var)+etaExpand term@LambdaT{} = pure term+etaExpand term@PairT{} = pure term+etaExpand term = do+  ty <- typeOf term+  case stripTypeRestrictions ty of+    TypeFunT _ty orig param mtope ret -> pure $+      lambdaT ty orig (Just (param, mtope))+        (appT ret (S <$> term) (Pure Z))++    TypeSigmaT _ty _orig a b -> pure $+      pairT ty+        (firstT a term)+        (secondT (substituteT (firstT a term) b) term)++    CubeProductT _ty a b -> pure $+      pairT ty+        (firstT a term)+        (secondT b term)++    _ -> pure term++inCubeLayer :: Eq var => TermT var -> TypeCheck var Bool+inCubeLayer = \case+  RecBottomT{} -> pure False+  UniverseT{} -> pure False++  UniverseCubeT{} -> pure True+  CubeProductT{} -> pure True+  CubeUnitT{} -> pure True+  CubeUnitStarT{} -> pure True+  Cube2T{} -> pure True+  Cube2_0T{} -> pure True+  Cube2_1T{} -> pure True++  t -> typeOf t >>= inCubeLayer++inTopeLayer :: Eq var => TermT var -> TypeCheck var Bool+inTopeLayer = \case+  RecBottomT{} -> pure False+  UniverseT{} -> pure False++  UniverseCubeT{} -> pure True+  UniverseTopeT{} -> pure True++  CubeProductT{} -> pure True+  CubeUnitT{} -> pure True+  CubeUnitStarT{} -> pure True+  Cube2T{} -> pure True+  Cube2_0T{} -> pure True+  Cube2_1T{} -> pure True++  TopeTopT{} -> pure True+  TopeBottomT{} -> pure True+  TopeAndT{} -> pure True+  TopeOrT{} -> pure True+  TopeEQT{} -> pure True+  TopeLEQT{} -> pure True++  TypeFunT _ty orig param _mtope ret -> do+    enterScope orig param $ inTopeLayer ret++  t -> typeOfUncomputed t >>= inTopeLayer++tryRestriction :: Eq var => TermT var -> TypeCheck var (Maybe (TermT var))+tryRestriction = \case+  TypeRestrictedT _ _ rs -> do+    let go [] = pure Nothing+        go ((tope, term') : rs') = do+          checkTope tope >>= \case+            True -> pure (Just term')+            False -> go rs'+    go rs+  _ -> pure Nothing++-- | Compute a typed term to its WHNF.+--+-- >>> whnfT "(\\p -> first (second p)) (x, (y, z))" :: Term'+-- y+whnfT :: Eq var => TermT var -> TypeCheck var (TermT var)+whnfT tt = performing (ActionWHNF tt) $ case tt of+  -- universe constants+  UniverseT{} -> pure tt+  UniverseCubeT{} -> pure tt+  UniverseTopeT{} -> pure tt++  -- cube layer (except vars, pairs, and applications)+  CubeProductT{} -> nfTope tt+  CubeUnitT{} -> pure tt+  CubeUnitStarT{} -> pure tt+  Cube2T{} -> pure tt+  Cube2_0T{} -> pure tt+  Cube2_1T{} -> pure tt++  -- tope layer (except vars, pairs of points, and applications)+  TopeTopT{} -> pure tt+  TopeBottomT{} -> pure tt+  TopeAndT{} -> nfTope tt+  TopeOrT{} -> nfTope tt+  TopeEQT{} -> nfTope tt+  TopeLEQT{} -> nfTope tt++  -- type layer terms that should not be evaluated further+  LambdaT{} -> pure tt+  PairT{} -> pure tt+  ReflT{} -> pure tt+  TypeFunT{} -> pure tt+  TypeSigmaT{} -> pure tt+  TypeIdT{} -> pure tt+  RecBottomT{} -> pure tt++  -- type ascriptions are ignored, since we already have a typechecked term+  TypeAscT _ty term _ty' -> whnfT term++  Free (AnnF info _)+    | Just tt' <- infoWHNF info -> pure tt'++  -- check if we have cube or a tope term (if so, compute NF)+  _ -> typeOf tt >>= \case+    UniverseCubeT{} -> nfTope tt+    UniverseTopeT{} -> nfTope tt++    -- check if we have cube point term (if so, compute NF)+    typeOf_tt -> typeOf typeOf_tt >>= \case+      UniverseCubeT{} -> nfTope tt++      -- now we are in the type layer+      _ -> do+        -- check if we are in the empty context+        inBottom <- asks localTopesEntailBottom+        if inBottom+           then pure recBottomT -- if so, reduce to recBOT+           else tryRestriction typeOf_tt >>= \case+            Just tt' -> whnfT tt'+            Nothing -> case tt of+              t@(Pure var) ->+                valueOfVar var >>= \case+                  Nothing -> pure t+                  Just term -> whnfT term++              AppT ty f x ->+                whnfT f >>= \case+                  LambdaT _ty _orig _arg body ->+                    whnfT (substituteT x body)+                  f' -> typeOf f' >>= \case+                    TypeFunT _ty _orig _param (Just tope) UniverseTopeT{} -> do+                      topeAndT+                        <$> (AppT ty <$> nfT f' <*> nfT x)+                        <*> nfT (substituteT x tope)+                    -- FIXME: this seems to be a hack, and will not work in all situations!+                    -- FIXME: need to check performance of this code thoroughly+                    -- FIXME: for now, it seems to add ~2x slowdown+                    TypeFunT info _orig _param _mtope ret@TypeRestrictedT{}+                      | TypeRestrictedT{} <- infoType info -> pure (AppT ty f' x)+                      | otherwise -> do+                          let ret' = substituteT x ret+                          tryRestriction ret' >>= \case -- FIXME: to many unnecessary checks?+                            Nothing -> pure (AppT ty { infoType = ret' } f' x)+                            Just tt' -> whnfT tt'+                    _ -> pure (AppT ty f' x)++              FirstT ty t ->+                whnfT t >>= \case+                  PairT _ l _r -> whnfT l+                  t' -> pure (FirstT ty t')++              SecondT ty t ->+                whnfT t >>= \case+                  PairT _ _l r -> whnfT r+                  t' -> pure (SecondT ty t')+              IdJT ty tA a tC d x p ->+                whnfT p >>= \case+                  ReflT{} -> whnfT d+                  p' -> pure (IdJT ty tA a tC d x p')++              RecOrT _ty rs -> do+                let go [] = pure Nothing+                    go ((tope, tt') : rs') = do+                      checkTope tope >>= \case+                        True -> pure (Just tt')+                        False -> go rs'+                go rs >>= \case+                  Just tt' -> whnfT tt'+                  Nothing+                    | [tt'] <- nubTermT (map snd rs) -> whnfT tt'+                    | otherwise -> pure tt++              TypeRestrictedT ty type_ rs -> do+                rs' <- traverse (\(tope, term) -> (,) <$> nfT tope <*> pure term) rs+                case filter ((/= topeBottomT) . fst) rs' of+                  [] -> whnfT type_  -- get rid of restrictions at BOT+                  rs'' -> TypeRestrictedT ty <$> whnfT type_ <*> pure rs''++nfTope :: Eq var => TermT var -> TypeCheck var (TermT var)+nfTope tt = performing (ActionNF tt) $ fmap termIsNF $ case tt of+  Pure var ->+    valueOfVar var >>= \case+      Nothing -> pure tt+      Just term -> nfTope term++  -- see if normal form is already available+  Free (AnnF info _) | Just tt' <- infoNF info -> pure tt'++  -- universe constants+  UniverseT{} -> pure tt+  UniverseCubeT{} -> pure tt+  UniverseTopeT{} -> pure tt++  -- cube layer constants+  CubeUnitT{} -> pure tt+  CubeUnitStarT{} -> pure tt+  Cube2T{} -> pure tt+  Cube2_0T{} -> pure tt+  Cube2_1T{} -> pure tt++  -- cube layer with computation+  CubeProductT _ty l r -> cubeProductT <$> nfTope l <*> nfTope r++  -- tope layer constants+  TopeTopT{} -> pure tt+  TopeBottomT{} -> pure tt++  -- tope layer with computation+  TopeAndT ty l r ->+    nfTope l >>= \case+      TopeBottomT{} -> pure topeBottomT+      l' -> nfTope r >>= \case+        TopeBottomT{} -> pure topeBottomT+        r' -> pure (TopeAndT ty l' r')++  TopeOrT  ty l r -> do+    l' <- nfTope l+    r' <- nfTope r+    case (l', r') of+      (TopeBottomT{}, _) -> pure r'+      (_, TopeBottomT{}) -> pure l'+      _ -> pure (TopeOrT ty l' r')++  TopeEQT  ty l r -> TopeEQT  ty <$> nfTope l <*> nfTope r+  TopeLEQT ty l r -> TopeLEQT ty <$> nfTope l <*> nfTope r++  -- type ascriptions are ignored, since we already have a typechecked term+  TypeAscT _ty term _ty' -> nfTope term+  +  PairT ty l r -> PairT ty <$> nfTope l <*> nfTope r++  AppT ty f x ->+    nfTope f >>= \case+      LambdaT _ty _orig _arg body ->+        nfTope (substituteT x body)+      f' -> typeOfUncomputed f' >>= \case+        TypeFunT _ty _orig _param (Just tope) UniverseTopeT{} -> do+          topeAndT+            <$> (AppT ty f' <$> nfTope x)+            <*> nfTope (substituteT x tope)+        _ -> AppT ty f' <$> nfTope x++  FirstT ty t ->+    nfTope t >>= \case+      PairT _ty x _y -> pure x+      t' -> pure (FirstT ty t')++  SecondT ty t ->+    nfTope t >>= \case+      PairT _ty _x y -> pure y+      t' -> pure (SecondT ty t')++  LambdaT ty orig _mparam body+    | TypeFunT _ty _origF param mtope _ret <- infoType ty ->+        LambdaT ty orig (Just (param, mtope)) <$> enterScope orig param (nfTope body)+  LambdaT{} -> panicImpossible "lambda with a non-function type in the tope layer"++  TypeFunT{} -> panicImpossible "exposed function type in the tope layer"+  TypeSigmaT{} -> panicImpossible "dependent sum type in the tope layer"+  TypeIdT{} -> panicImpossible "identity type in the tope layer"+  ReflT{} -> panicImpossible "refl in the tope layer"+  IdJT{} -> panicImpossible "idJ eliminator in the tope layer"+  TypeRestrictedT{} -> panicImpossible "extension types in the tope layer"++  RecOrT{} -> panicImpossible "recOR in the tope layer"+  RecBottomT{} -> panicImpossible "recBOT in the tope layer"++-- | Compute a typed term to its NF.+--+-- >>> nfT "(\\p -> first (second p)) (x, (y, z))" :: Term'+-- y+nfT :: Eq var => TermT var -> TypeCheck var (TermT var)+nfT tt = performing (ActionNF tt) $ case tt of+  -- universe constants+  UniverseT{} -> pure tt+  UniverseCubeT{} -> pure tt+  UniverseTopeT{} -> pure tt++  -- cube layer constants+  CubeUnitT{} -> pure tt+  CubeUnitStarT{} -> pure tt+  Cube2T{} -> pure tt+  Cube2_0T{} -> pure tt+  Cube2_1T{} -> pure tt++  -- cube layer with computation+  CubeProductT{} -> nfTope tt++  -- tope layer constants+  TopeTopT{} -> pure tt+  TopeBottomT{} -> pure tt++  -- tope layer with computation+  TopeAndT{} -> nfTope tt+  TopeOrT{} -> nfTope tt+  TopeEQT{} -> nfTope tt+  TopeLEQT{} -> nfTope tt++  -- type layer constants+  ReflT ty _x -> pure (ReflT ty Nothing)+  RecBottomT{} -> pure tt++  -- type ascriptions are ignored, since we already have a typechecked term+  TypeAscT _ty term _ty' -> nfT term++  -- now we are in the type layer+  _ -> do+    -- check if we are in the empty context+    inBottom <- asks localTopesEntailBottom+    if inBottom+       then pure recBottomT -- if so, reduce to recBOT+       else typeOf tt >>= tryRestriction >>= \case+        Just tt' -> nfT tt'+        Nothing -> case tt of+          t@(Pure var) ->+            valueOfVar var >>= \case+              Nothing -> pure t+              Just term -> nfT term++          TypeFunT ty orig param mtope ret -> do+            param' <- nfT param+            enterScope orig param' $ do+              mtope' <- traverse nfT mtope+              maybe id localTope mtope' $+                TypeFunT ty orig param' mtope' <$> nfT ret+          AppT ty f x ->+            whnfT f >>= \case+              LambdaT _ty _orig _arg body ->+                nfT (substituteT x body)+              f' -> typeOf f' >>= \case+                TypeFunT _ty _orig _param (Just tope) UniverseTopeT{} -> do+                  topeAndT+                    <$> (AppT ty <$> nfT f' <*> nfT x)+                    <*> nfT (substituteT x tope)+                _ -> AppT ty <$> nfT f' <*> nfT x+          LambdaT ty orig _mparam body -> do+            case stripTypeRestrictions (infoType ty) of+              TypeFunT _ty _orig param mtope _ret -> do+                param' <- nfT param+                enterScope orig param' $ do+                  mtope' <- traverse nfT mtope+                  maybe id localTope mtope' $+                    LambdaT ty orig (Just (param', mtope')) <$> nfT body+              _ -> panicImpossible "lambda with a non-function type"+++          TypeSigmaT ty orig a b -> do+            a' <- nfT a+            enterScope orig a' $ do+              TypeSigmaT ty orig a' <$> nfT b+          PairT ty l r -> PairT ty <$> nfT l <*> nfT r+          FirstT ty t ->+            whnfT t >>= \case+              PairT _ l _r -> nfT l+              t' -> FirstT ty <$> nfT t'+          SecondT ty t ->+            whnfT t >>= \case+              PairT _ _l r -> nfT r+              t' -> SecondT ty <$> nfT t'++          TypeIdT ty x _tA y -> TypeIdT ty <$> nfT x <*> pure Nothing <*> nfT y+          IdJT ty tA a tC d x p ->+            whnfT p >>= \case+              ReflT{} -> nfT d+              p' -> IdJT ty <$> nfT tA <*> nfT a <*> nfT tC <*> nfT d <*> nfT x <*> nfT p'++          RecOrT _ty rs -> do+            let go [] = pure Nothing+                go ((tope, tt') : rs') = do+                  checkTope tope >>= \case+                    True -> pure (Just tt')+                    False -> go rs'+            go rs >>= \case+              Just tt' -> nfT tt'+              Nothing+                | [tt'] <- nubTermT (map snd rs) -> nfT tt'+                | otherwise -> pure tt+++          TypeRestrictedT ty type_ rs -> do+            rs' <- forM rs $ \(tope, term) -> do+              nfTope tope >>= \case+                TopeBottomT{} -> pure Nothing+                tope' -> do+                  term' <- localTope tope' $+                    nfT term+                  return (Just (tope', term'))+            case catMaybes rs' of+              [] -> nfT type_+              rs'' -> TypeRestrictedT ty <$> nfT type_ <*> pure rs''++valueOfVar :: Eq var => var -> TypeCheck var (Maybe (TermT var))+valueOfVar x = asks (lookup x . varValues) >>= \case+  Nothing -> issueTypeError $ TypeErrorUndefined x+  Just ty -> return ty++typeOfVar :: Eq var => var -> TypeCheck var (TermT var)+typeOfVar x = asks (lookup x . varTypes) >>= \case+  Nothing -> issueTypeError $ TypeErrorUndefined x+  Just ty -> return ty++typeOfUncomputed :: Eq var => TermT var -> TypeCheck var (TermT var)+typeOfUncomputed = \case+  Pure x -> typeOfVar x+  Free (AnnF TypeInfo{..} _) -> pure infoType++typeOf :: Eq var => TermT var -> TypeCheck var (TermT var)+typeOf t = typeOfUncomputed t >>= whnfT ++unifyTopes :: Eq var => TermT var -> TermT var -> TypeCheck var ()+unifyTopes l r = do+  let equiv = and+        [ [l] `entail` r+        , [r] `entail` l ]+  unless equiv $+    issueTypeError (TypeErrorTopesNotEquivalent l r)++inAllSubContexts :: TypeCheck var () -> TypeCheck var () -> TypeCheck var ()+inAllSubContexts handleSingle tc = do+  topeSubContexts <- asks localTopesNFUnion+  case topeSubContexts of+    [] -> panicImpossible "empty set of alternative contexts"+    [_] -> handleSingle+    _:_:_ -> do+      forM_ topeSubContexts $ \topes' -> do+        local (\Context{..} -> Context+            { localTopes = topes'+            , localTopesNF = topes'+            , localTopesNFUnion = [topes']+            , .. }) $+          tc++unify :: Eq var => Maybe (TermT var) -> TermT var -> TermT var -> TypeCheck var ()+unify mterm expected actual = performUnification `catchError` \typeError -> do+  inAllSubContexts (throwError typeError) performUnification+  where+    performUnification = unifyInCurrentContext mterm expected actual ++unifyInCurrentContext :: Eq var => Maybe (TermT var) -> TermT var -> TermT var -> TypeCheck var ()+unifyInCurrentContext mterm expected actual = performing action $+  unless (expected == actual) $ do      -- NOTE: this gives a small, but noticeable speedup+    expectedVal <- whnfT expected+    actualVal <- whnfT actual+    (expected', actual') <- asks covariance >>= \case+      Covariant -> etaMatch mterm expectedVal actualVal+      Contravariant -> swap <$> etaMatch mterm actualVal expectedVal+    unless (expected' == actual') $ do  -- NOTE: this gives a small, but noticeable speedup+      case actual' of+        RecBottomT{} -> return ()+        RecOrT _ty rs' ->+          case expected' of+            RecOrT _ty rs -> sequence_ $+              checkCoherence <$> rs <*> rs'+            _ -> do+              forM_ rs' $ \(tope, term) ->+                localTope tope $+                  unifyTerms expected' term+        _ -> typeOf expected' >>= typeOf >>= \case+          UniverseCubeT{} -> contextEntails (topeEQT expected' actual')+          _ -> do+            let def = unless (expected' == actual') err+                err =+                  case mterm of+                    Nothing   -> issueTypeError (TypeErrorUnifyTerms expected' actual')+                    Just term -> issueTypeError (TypeErrorUnify term expected' actual')+                errS = do+                  let expectedS = S <$> expected'+                      actualS = S <$> actual'+                  case mterm of+                    Nothing   -> issueTypeError (TypeErrorUnifyTerms expectedS actualS)+                    Just term -> issueTypeError (TypeErrorUnify (S <$> term) expectedS actualS)+            case expected' of+              Pure{} -> def++              UniverseT{} -> def+              UniverseCubeT{} -> def+              UniverseTopeT{} -> def++              CubeUnitT{} -> def+              CubeUnitStarT{} -> def+              Cube2T{} -> def+              Cube2_0T{} -> def+              Cube2_1T{} -> def+              CubeProductT _ l r ->+                case actual' of+                  CubeProductT _ l' r' -> do+                    unifyTerms l l'+                    unifyTerms r r'+                  _ -> err++              PairT _ty l r ->+                case actual' of+                  PairT _ty' l' r' -> do+                    unifyTerms l l'+                    unifyTerms r r'++                  -- one part of eta-expansion for pairs+                  -- FIXME: add symmetric version!+                  _ -> err++              FirstT _ty t ->+                case actual' of+                  FirstT _ty' t' -> unifyTerms t t'+                  _ -> err++              SecondT _ty t ->+                case actual' of+                  SecondT _ty' t' -> unifyTerms t t'+                  _ -> err++              TopeTopT{}    -> unifyTopes expected' actual'+              TopeBottomT{} -> unifyTopes expected' actual'+              TopeEQT{}     -> unifyTopes expected' actual'+              TopeLEQT{}    -> unifyTopes expected' actual'+              TopeAndT{}    -> unifyTopes expected' actual'+              TopeOrT{}     -> unifyTopes expected' actual'++              RecBottomT{} -> return () -- unifies with anything+              RecOrT _ty rs ->+                case actual' of+                  -- ----------------------------------------------+                  -- IMPORTANT: this pattern matching is redundant,+                  -- but it is not obvious, so+                  -- take care when refactoring!+                  -- ----------------------------------------------+  --                RecOrT _ty rs' -> sequence_ $+  --                  checkCoherence <$> rs <*> rs'+                  -- ----------------------------------------------+                  _ -> do+                    forM_ rs $ \(tope, term) ->+                      localTope tope $+                        unifyTerms term actual'++              TypeFunT _ty _orig cube mtope ret ->+                case actual' of+                  TypeFunT _ty' orig' cube' mtope' ret' -> do+                    switchVariance $  -- unifying in the negative position!+                      unifyTerms cube cube' -- FIXME: unifyCubes+                    enterScope orig' cube $ do+                      case (mtope, mtope') of+                        (Just tope, Just tope') -> do+                          topeNF <- nfT tope+                          topeNF' <- nfT tope'+                          unifyTopes topeNF topeNF'+                        (Nothing, Nothing)      -> return ()+                        (Just tope, Nothing)    -> nfT tope >>= (`unifyTopes` topeTopT)+                        (Nothing, Just tope)    -> nfT tope >>= unifyTopes topeTopT+                      case mterm of+                        Nothing -> unifyTerms ret ret'+                        Just term -> unifyTypes (appT ret' (S <$> term) (Pure Z)) ret ret'+                  _ -> err++              TypeSigmaT _ty _orig a b ->+                case actual' of+                  TypeSigmaT _ty' orig' a' b' -> do+                    unify Nothing a a'+                    enterScope orig' a $ unify Nothing b b'+                  _ -> err++              TypeIdT _ty x _tA y ->+                case actual' of+                  TypeIdT _ty' x' _tA' y' -> do+                    -- unify Nothing tA tA' -- TODO: do we need this check?+                    unify Nothing x x'+                    unify Nothing y y'+                  _ -> err++              AppT _ty f x ->+                case actual' of+                  AppT _ty' f' x' -> do+                    unify Nothing f f'+                    unify Nothing x x'+                  _ -> err++              LambdaT ty _orig _mparam body ->+                case stripTypeRestrictions (infoType ty) of+                  TypeFunT _ty _origF param mtope _ret ->+                    case actual' of+                      LambdaT ty' orig' _mparam' body' -> do+                        case stripTypeRestrictions (infoType ty') of+                          TypeFunT _ty' _origF' param' mtope' _ret' -> do+                            unify Nothing param param'+                            enterScope orig' param $ do+                              case (mtope, mtope') of+                                (Just tope, Just tope') -> do+                                  unify Nothing tope tope'+                                  localTope tope $ unify Nothing body body'+                                (Nothing, Nothing) -> do+                                  unify Nothing body body'+                                _ -> errS+                          _ -> err+                      _ -> err+                  _ -> err++              ReflT ty _x | TypeIdT _ty x _tA y <- infoType ty ->+                case actual' of+                  ReflT ty' _x' | TypeIdT _ty' x' _tA' y' <- infoType ty' -> do+                    -- unify Nothing tA tA' -- TODO: do we need this check?+                    unify Nothing x x'+                    unify Nothing y y'+                  _ -> err+              ReflT{} -> panicImpossible "refl with a non-identity type!"++              IdJT _ty a b c d e f ->+                case actual' of+                  IdJT _ty' a' b' c' d' e' f' -> do+                    unify Nothing a a'+                    unify Nothing b b'+                    unify Nothing c c'+                    unify Nothing d d'+                    unify Nothing e e'+                    unify Nothing f f'+                  _ -> err++              TypeAscT{} -> panicImpossible "type ascription at the root of WHNF"++              TypeRestrictedT _ty ty rs ->+                case actual' of+                  TypeRestrictedT _ty' ty' rs' -> do+                    unify mterm ty ty'+                    sequence_+                      [ localTope tope $ do+                          -- FIXME: can do less entails checks?+                          contextEntails (foldr topeOrT topeBottomT (map fst rs')) -- expected is less specified than actual+                          forM_ rs' $ \(tope', term') -> do+                            localTope tope' $+                              unify Nothing term term'+                      | (tope, term) <- rs+                      ]+                  _ -> err    -- FIXME: need better unification for restrictions++  where+    action = case mterm of+               Nothing -> ActionUnifyTerms expected actual+               Just term -> ActionUnify term expected actual++unifyTypes :: Eq var => TermT var -> TermT var -> TermT var -> TypeCheck var ()+unifyTypes = unify . Just++unifyTerms :: Eq var => TermT var -> TermT var -> TypeCheck var ()+unifyTerms = unify Nothing++localTope :: Eq var => TermT var -> TypeCheck var a -> TypeCheck var a+localTope tope tc = do+  Context{..} <- ask+  tope' <- nfTope tope+  -- A small optimisation to help unify terms faster+  let refine = case tope' of+        TopeEQT _ x y | x == y -> const tc          -- no new information added!+        _ | tope' `elem` localTopes -> const tc+          | otherwise -> id+  refine $ do+    local (f tope' localTopesNF) tc+  where+    f tope' localTopes' Context{..} = Context+      { localTopes = tope : localTopes+      , localTopesNF = tope' : localTopesNF+      , localTopesNFUnion = map nubTermT+          [ new <> old+          | new <- simplifyLHS [tope']+          , old <- localTopesNFUnion ]+      , localTopesEntailBottom = entailsBottom+      , .. }+      where+        entailsBottom = (tope' : localTopes') `entail` topeBottomT++universeT :: TermT var+universeT = iterate f (panicImpossible msg) !! 30+  where+    msg = "going too high up the universe levels"+    f t = UniverseT TypeInfo+      { infoType = t+      , infoNF = Just universeT+      , infoWHNF = Just universeT }++cubeT :: TermT var+cubeT = UniverseCubeT TypeInfo+  { infoType = universeT+  , infoNF = Just cubeT+  , infoWHNF = Just cubeT }++topeT :: TermT var+topeT = UniverseTopeT TypeInfo+  { infoType = universeT+  , infoNF = Just topeT+  , infoWHNF = Just topeT }++topeEQT :: TermT var -> TermT var -> TermT var+topeEQT l r = TopeEQT info l r+  where+    info = TypeInfo+      { infoType = topeT+      , infoNF = Nothing+      , infoWHNF = Nothing+      }++topeLEQT :: TermT var -> TermT var -> TermT var+topeLEQT l r = TopeLEQT info l r+  where+    info = TypeInfo+      { infoType = topeT+      , infoNF = Nothing+      , infoWHNF = Nothing+      }++topeOrT :: TermT var -> TermT var -> TermT var+topeOrT l r = TopeOrT info l r+  where+    info = TypeInfo+      { infoType = topeT+      , infoNF = Nothing+      , infoWHNF = Nothing+      }++topeAndT :: TermT var -> TermT var -> TermT var+topeAndT l r = TopeAndT info l r+  where+    info = TypeInfo+      { infoType = topeT+      , infoNF = Nothing+      , infoWHNF = Nothing+      }++cubeProductT :: TermT var -> TermT var -> TermT var+cubeProductT l r = t+  where+    t = CubeProductT info l r+    info = TypeInfo+      { infoType  = cubeT+      , infoNF    = Nothing+      , infoWHNF  = Nothing+      }++cubeUnitT :: TermT var+cubeUnitT = CubeUnitT TypeInfo+  { infoType = cubeT+  , infoNF = Just cubeUnitT+  , infoWHNF = Just cubeUnitT }++cubeUnitStarT :: TermT var+cubeUnitStarT = CubeUnitStarT TypeInfo+  { infoType = cubeUnitT+  , infoNF = Just cubeUnitStarT+  , infoWHNF = Just cubeUnitStarT }++cube2T :: TermT var+cube2T = Cube2T TypeInfo+  { infoType = cubeT+  , infoNF = Just cube2T+  , infoWHNF = Just cube2T }++cube2_0T :: TermT var+cube2_0T = Cube2_0T TypeInfo+  { infoType = cube2T+  , infoNF = Just cube2_0T+  , infoWHNF = Just cube2_0T }++cube2_1T :: TermT var+cube2_1T = Cube2_1T TypeInfo+  { infoType = cube2T+  , infoNF = Just cube2_1T+  , infoWHNF = Just cube2_1T }++topeTopT :: TermT var+topeTopT = TopeTopT TypeInfo+  { infoType = topeT+  , infoNF = Just topeTopT+  , infoWHNF = Just topeTopT }++topeBottomT :: TermT var+topeBottomT = TopeBottomT TypeInfo+  { infoType = topeT+  , infoNF = Just topeBottomT+  , infoWHNF = Just topeBottomT }++recBottomT :: TermT var+recBottomT = RecBottomT TypeInfo+  { infoType = recBottomT+  , infoNF = Just recBottomT+  , infoWHNF = Just recBottomT }++typeRestrictedT :: TermT var -> [(TermT var, TermT var)] -> TermT var+typeRestrictedT ty rs = t+  where+    t = TypeRestrictedT info ty rs+    info = TypeInfo+      { infoType  = universeT+      , infoNF    = Nothing+      , infoWHNF  = Nothing+      }++lambdaT+  :: TermT var+  -> Maybe Rzk.VarIdent+  -> Maybe (TermT var, Maybe (Scope TermT var))+  -> Scope TermT var+  -> TermT var+lambdaT ty orig mparam body = t+  where+    t = LambdaT info orig mparam body+    info = TypeInfo+      { infoType  = ty+      , infoNF    = Nothing+      , infoWHNF  = Just t+      }++appT :: TermT var -> TermT var -> TermT var -> TermT var+appT ty f x = t+  where+    t = AppT info f x+    info = TypeInfo+      { infoType  = ty+      , infoNF    = Nothing+      , infoWHNF  = Nothing+      }++pairT :: TermT var -> TermT var -> TermT var -> TermT var+pairT ty l r = t+  where+    t = PairT info l r+    info = TypeInfo+      { infoType  = ty+      , infoNF    = Nothing+      , infoWHNF  = Just t+      }++firstT :: TermT var -> TermT var -> TermT var+firstT ty arg = t+  where+    t = FirstT info arg+    info = TypeInfo+      { infoType  = ty+      , infoNF    = Nothing+      , infoWHNF  = Nothing+      }++secondT :: TermT var -> TermT var -> TermT var+secondT ty arg = t+  where+    t = SecondT info arg+    info = TypeInfo+      { infoType  = ty+      , infoNF    = Nothing+      , infoWHNF  = Nothing+      }++reflT+  :: TermT var+  -> Maybe (TermT var, Maybe (TermT var))+  -> TermT var+reflT ty mx = t+  where+    t = ReflT info mx+    info = TypeInfo+      { infoType  = ty+      , infoNF    = Just (ReflT info Nothing)+      , infoWHNF  = Just (ReflT info Nothing)+      }++typeFunT+  :: Maybe Rzk.VarIdent+  -> TermT var+  -> Maybe (Scope TermT var)+  -> Scope TermT var+  -> TermT var+typeFunT orig cube mtope ret = t+  where+    t = TypeFunT info orig cube mtope ret+    info = TypeInfo+      { infoType  = universeT+      , infoNF    = Nothing+      , infoWHNF  = Just t+      }++typeSigmaT+  :: Maybe Rzk.VarIdent+  -> TermT var+  -> Scope TermT var+  -> TermT var+typeSigmaT orig a b = t+  where+    t = TypeSigmaT info orig a b+    info = TypeInfo+      { infoType  = universeT+      , infoNF    = Nothing+      , infoWHNF  = Just t+      }++recOrT+  :: TermT var+  -> [(TermT var, TermT var)]+  -> TermT var+recOrT ty rs = t+  where+    t = RecOrT info rs+    info = TypeInfo+      { infoType  = ty+      , infoNF    = Nothing+      , infoWHNF  = Nothing+      }++typeIdT :: TermT var -> Maybe (TermT var) -> TermT var -> TermT var+typeIdT x tA y = t+  where+    t = TypeIdT info x tA y+    info = TypeInfo+      { infoType  = universeT+      , infoNF    = Nothing+      , infoWHNF  = Just t+      }++idJT+  :: TermT var+  -> TermT var+  -> TermT var+  -> TermT var+  -> TermT var+  -> TermT var+  -> TermT var+  -> TermT var+idJT ty tA a tC d x p = t+  where+    t = IdJT info tA a tC d x p+    info = TypeInfo+      { infoType  = ty+      , infoNF    = Nothing+      , infoWHNF  = Nothing+      }++typeAscT :: TermT var -> TermT var -> TermT var+typeAscT x ty = t+  where+    t = TypeAscT info x ty+    info = TypeInfo+      { infoType  = ty+      , infoNF    = Nothing+      , infoWHNF  = Nothing+      }++typecheck :: Eq var => Term var -> TermT var -> TypeCheck var (TermT var)+typecheck term ty = performing (ActionTypeCheck term ty) $ do+  whnfT ty >>= \case++    RecBottomT{} -> do+      return recBottomT++    TypeRestrictedT _ty ty' rs -> do+      term' <- typecheck term ty'+      contextEntailedBy (foldr topeOrT topeBottomT (map fst rs))+      forM_ rs $ \(tope, rterm) -> do+        localTope tope $+          unifyTerms rterm term'+      return term'    -- FIXME: correct?++    ty' -> case term of+      Lambda orig mparam body ->+        case ty' of+          TypeFunT _ty _orig' param' mtope' ret -> do+            case mparam of+              Nothing -> return ()+              Just (param, Nothing) -> do+                (paramType, mtope) <- do+                  paramType <- infer param+                  typeOf paramType >>= \case+                    -- an argument can be a shape+                    TypeFunT _ty _orig cube _mtope UniverseTopeT{} -> do+                      mapM_ checkNameShadowing orig+                      enterScope orig cube $ do+                        let tope' = appT topeT (S <$> paramType) (Pure Z)  -- eta expand ty'+                        return (cube, Just tope')+                    _kind -> return (paramType, Nothing)+                unifyTerms param' paramType+                mapM_ checkNameShadowing orig+                enterScope orig param' $ do+                  mapM_ (unifyTerms (fromMaybe topeTopT mtope')) mtope+              Just (param, mtope) -> do+                param'' <- typecheck param =<< typeOf param'+                unifyTerms param' param''+                mapM_ checkNameShadowing orig+                enterScope orig param' $ do+                  mtope'' <- typecheck (fromMaybe TopeTop mtope) topeT+                  unifyTerms (fromMaybe topeTopT mtope') mtope''++            mapM_ checkNameShadowing orig+            enterScope orig param' $ do+              maybe id localTope mtope' $ do+                body' <- typecheck body ret+                return (lambdaT ty' orig (Just (param', mtope')) body')++          _ -> issueTypeError $ TypeErrorUnexpectedLambda term ty++      Pair l r ->+        case ty' of+          CubeProductT _ty a b -> do+            l' <- typecheck l a+            r' <- typecheck r b+            return (pairT ty' l' r')+          TypeSigmaT _ty _orig a b -> do+            l' <- typecheck l a+            r' <- typecheck r (substituteT l' b)+            return (pairT ty' l' r')+          _ -> issueTypeError $ TypeErrorUnexpectedPair term ty++      Refl mx ->+        case ty' of+          TypeIdT _ty y _tA z -> do+            tA <- typeOf y+            forM_ mx $ \(x, mxty) -> do+              forM_ mxty $ \xty -> do+                xty' <- typecheck xty universeT+                unifyTerms tA xty'+              x' <- typecheck x tA+              unifyTerms x' y+              unifyTerms x' z+            when (isNothing mx) $+              unifyTerms y z+            return (reflT ty' (Just (y, Just tA)))+          _ -> issueTypeError $ TypeErrorUnexpectedRefl term ty++        -- FIXME: this does not make typechecking faster, why?+--      RecOr rs -> do+--        rs' <- forM rs $ \(tope, rterm) -> do+--          tope' <- typecheck tope topeT+--          contextEntailedBy tope'+--          localTope tope' $ do+--            rterm' <- typecheck rterm ty+--            return (tope', rterm')+--        return (recOrT ty rs')++      _ -> do+        term' <- infer term+        inferredType <- typeOf term'+        unifyTypes term' ty' inferredType+        return term'++inferAs :: Eq var => TermT var -> Term var -> TypeCheck var (TermT var)+inferAs expectedKind term = do+  term' <- infer term+  ty <- typeOf term'+  kind <- typeOf ty+  unifyTypes ty expectedKind kind+  return term'++infer :: Eq var => Term var -> TypeCheck var (TermT var)+infer tt = performing (ActionInfer tt) $ case tt of+  Pure x -> pure (Pure x)++  Universe     -> pure universeT+  UniverseCube -> pure cubeT+  UniverseTope -> pure topeT++  CubeUnit      -> pure cubeUnitT+  CubeUnitStar  -> pure cubeUnitStarT++  Cube2 -> pure cube2T+  Cube2_0 -> pure cube2_0T+  Cube2_1 -> pure cube2_1T++  CubeProduct l r -> do+    l' <- typecheck l cubeT+    r' <- typecheck r cubeT+    return (cubeProductT l' r')++  Pair l r -> do+    l' <- infer l+    r' <- infer r+    lt <- typeOf l'+    rt <- typeOf r'+    typeOf lt >>= \case+      UniverseCubeT{} -> return (pairT (cubeProductT lt rt) l' r')+      _ -> do+        -- NOTE: infer as a non-dependent pair!+        return (pairT (typeSigmaT Nothing lt (S <$> rt)) l' r')++  First t -> do+    t' <- infer t+    fmap stripTypeRestrictions (typeOf t') >>= \case+      RecBottomT{} -> pure recBottomT -- FIXME: is this ok?+      TypeSigmaT _ty _orig lt _rt ->+        return (firstT lt t')+      CubeProductT _ty l _r ->+        return (firstT l t')+      ty -> issueTypeError $ TypeErrorNotPair t' ty++  Second t -> do+    t' <- infer t+    fmap stripTypeRestrictions (typeOf t') >>= \case+      RecBottomT{} -> pure recBottomT -- FIXME: is this ok?+      TypeSigmaT _ty _orig lt rt ->+        return (secondT (substituteT (firstT lt t') rt) t')+      CubeProductT _ty _l r ->+        return (secondT r t')+      ty -> issueTypeError $ TypeErrorNotPair t' ty++  TopeTop -> pure topeTopT+  TopeBottom -> pure topeBottomT++  TopeEQ l r -> do+    l' <- inferAs cubeT l+    lt <- typeOf l'+    r' <- typecheck r lt+    return (topeEQT l' r')++  TopeLEQ l r -> do+    l' <- typecheck l cube2T+    r' <- typecheck r cube2T+    return (topeLEQT l' r')++  TopeAnd l r -> do+    l' <- typecheck l topeT+    r' <- typecheck r topeT+    return (topeAndT l' r')++  TopeOr l r -> do+    l' <- typecheck l topeT+    r' <- typecheck r topeT+    return (topeOrT l' r')++  RecBottom -> do+    contextEntails topeBottomT+    return recBottomT++  RecOr rs -> do+    ttts <- forM rs $ \(tope, term) -> do+      tope' <- typecheck tope topeT+      contextEntailedBy tope'+      localTope tope' $ do+        term' <- inferAs universeT term+        ty <- typeOf term'+        return (tope', (term', ty))+    let rs' = map (fmap fst) ttts+        ts  = map (fmap snd) ttts+    sequence_ [ checkCoherence l r | l:rs'' <- tails rs', r <- rs'' ]+    contextEquiv (map fst ttts)+    return (recOrT (recOrT universeT ts) rs')++  TypeFun orig a Nothing b -> do+    a' <- infer a+    typeOf a' >>= \case+      -- an argument can be a type+      UniverseT{} ->+        case a' of+          -- except if its a TOPE universe+          UniverseTopeT{} ->+            issueTypeError $ TypeErrorOther "tope params are illegal"+          _ -> do+            mapM_ checkNameShadowing orig+            b' <- enterScope orig a' $ inferAs universeT b+            return (typeFunT orig a' Nothing b')+      -- an argument can be a cube+      UniverseCubeT{} -> do+        mapM_ checkNameShadowing orig+        b' <- enterScope orig a' $ inferAs universeT b+        return (typeFunT orig a' Nothing b')+      -- an argument can be a shape+      TypeFunT _ty _orig cube _mtope UniverseTopeT{} -> do+        mapM_ checkNameShadowing orig+        enterScope orig cube $ do+          let tope' = appT topeT (S <$> a') (Pure Z)  -- eta expand a'+          localTope tope' $ do+            b' <- inferAs universeT b+            return (typeFunT orig cube (Just tope') b')+      ty -> issueTypeError $ TypeErrorInvalidArgumentType a ty++  TypeFun orig cube (Just tope) ret -> do+    cube' <- typecheck cube cubeT+    mapM_ checkNameShadowing orig+    enterScope orig cube' $ do+      tope' <- typecheck tope topeT+      localTope tope' $ do+        ret' <- inferAs universeT ret+        return (typeFunT orig cube' (Just tope') ret')++  TypeSigma orig a b -> do+    a' <- inferAs universeT a  -- FIXME: separate universe of universes from universe of types+    mapM_ checkNameShadowing orig+    b' <- enterScope orig a' $ inferAs universeT b+    return (typeSigmaT orig a' b')++  TypeId x (Just tA) y -> do+    tA' <- typecheck tA universeT+    x' <- typecheck x tA'+    y' <- typecheck y tA'+    return (typeIdT x' (Just tA') y')++  TypeId x Nothing y -> do+    x' <- inferAs universeT x+    tA <- typeOf x'+    y' <- typecheck y tA+    return (typeIdT x' (Just tA) y')++  App f x -> do+    f' <- inferAs universeT f+    fmap stripTypeRestrictions (typeOf f') >>= \case+      RecBottomT{} -> pure recBottomT -- FIXME: is this ok?+      TypeFunT _ty _orig a mtope b -> do+        x' <- typecheck x a+        case b of+          UniverseTopeT{} -> return ()+          _ -> mapM_ (contextEntails . substituteT x') mtope   -- FIXME: need to check?+        return (appT (substituteT x' b) f' x')+      ty -> issueTypeError $ TypeErrorNotFunction f' ty++  Lambda _orig Nothing _body -> do+    issueTypeError $ TypeErrorCannotInferBareLambda tt+  Lambda orig (Just (ty, Nothing)) body -> do+    ty' <- infer ty+    mtope <- typeOf ty' >>= \case+      -- an argument can be a type+      UniverseT{} ->+        case ty' of+          -- except if its a TOPE universe+          UniverseTopeT{} ->+            issueTypeError $ TypeErrorOther "tope params are illegal"+          _ -> return Nothing+      -- an argument can be a cube+      UniverseCubeT{} -> return Nothing+      -- an argument can be a shape+      TypeFunT _ty _orig cube _mtope UniverseTopeT{} -> do+        mapM_ checkNameShadowing orig+        enterScope orig cube $ do+          let tope' = appT topeT (S <$> ty') (Pure Z)  -- eta expand ty'+          return (Just tope')+      kind -> issueTypeError $ TypeErrorInvalidArgumentType ty kind+    mapM_ checkNameShadowing orig+    enterScope orig ty' $ do+      maybe id localTope mtope $ do+        body' <- infer body+        ret <- typeOf body' +        return (lambdaT (typeFunT orig ty' mtope ret) orig (Just (ty', mtope)) body')+  Lambda orig (Just (cube, Just tope)) body -> do+    cube' <- typecheck cube universeT+    mapM_ checkNameShadowing orig+    enterScope orig cube' $ do+      tope' <- infer tope+      body' <- localTope tope' $ infer body+      ret <- typeOf body'+      return (lambdaT (typeFunT orig cube' (Just tope') ret) orig (Just (cube', Just tope')) body')++  Refl Nothing -> issueTypeError $ TypeErrorCannotInferBareRefl tt+  Refl (Just (x, Nothing)) -> do+    x' <- inferAs universeT x+    ty <- typeOf x'+    return (reflT (typeIdT x' (Just ty) x') (Just (x', Just ty)))+  Refl (Just (x, Just ty)) -> do+    ty' <- typecheck ty universeT+    x' <- typecheck x ty'+    return (reflT (typeIdT x' (Just ty') x') (Just (x', Just ty')))++  IdJ tA a tC d x p -> do+    tA' <- typecheck tA universeT+    a' <- typecheck a tA'+    let typeOf_C =+          typeFunT Nothing tA' Nothing $+            typeFunT Nothing (typeIdT (S <$> a') (Just (S <$> tA')) (Pure Z)) Nothing $+              universeT+    tC' <- typecheck tC typeOf_C+    let typeOf_d =+          appT universeT+            (appT (typeFunT Nothing (typeIdT a' (Just tA') a') Nothing universeT)+              tC' a')+            (reflT (typeIdT a' (Just tA') a') Nothing)+    d' <- typecheck d typeOf_d+    x' <- typecheck x tA'+    p' <- typecheck p (typeIdT a' (Just tA') x')+    let ret =+          appT universeT+            (appT (typeFunT Nothing (typeIdT a' (Just tA') x') Nothing universeT)+              tC' x')+            p'+    return (idJT ret tA' a' tC' d' x' p')++  TypeAsc term ty -> do+    ty' <- inferAs universeT ty+    term' <- typecheck term ty'+    return (typeAscT term' ty')++  TypeRestricted ty rs -> do+    ty' <- typecheck ty universeT+    rs' <- forM rs $ \(tope, term) -> do+      tope' <- typecheck tope topeT+      term' <- localTope tope' $ typecheck term ty'+      return (tope', term')+    return (typeRestrictedT ty' rs')++checkCoherence+  :: Eq var+  => (TermT var, TermT var)+  -> (TermT var, TermT var)+  -> TypeCheck var ()+checkCoherence (ltope, lterm) (rtope, rterm) =+  performing (ActionCheckCoherence (ltope, lterm) (rtope, rterm)) $ do+    localTope (topeAndT ltope rtope) $ do+      ltype <- stripTypeRestrictions <$> typeOf lterm   -- FIXME: why strip?+      rtype <- stripTypeRestrictions <$> typeOf rterm   -- FIXME: why strip?+      -- FIXME: do we need to unify types here or is it included in unification of terms?+      unifyTerms ltype rtype+      unifyTerms lterm rterm++inferStandalone :: Eq var => Term var -> Either (TypeErrorInScopedContext var) (TermT var)+inferStandalone term = runExcept (runReaderT (infer term) emptyContext)++unsafeInferStandalone' :: Term' -> TermT'+unsafeInferStandalone' t =+  case inferStandalone t of+    Left err -> error $ intercalate "\n"+      [ "Type Error:"+      , ppTypeErrorInScopedContext' err+      ]+    Right tt -> tt
+ test/Spec.hs view
@@ -0,0 +1,2 @@+main :: IO ()+main = putStrLn "Test suite not yet implemented"