Agda 2.5.2 → 2.5.3
raw patch · 309 files changed
+16415/−23305 lines, 309 filesdep +asyncdep +blaze-htmldep +stmdep −base-orphansdep −shuffledep −transformers-compatdep ~Agdadep ~EdisonCoredep ~Win32PVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: async, blaze-html, stm, text-icu, uri-encode
Dependencies removed: base-orphans, shuffle, transformers-compat, uhc-light, uhc-util, uulib, xhtml
Dependency ranges changed: Agda, EdisonCore, Win32, array, base, bytestring, containers, deepseq, directory, equivalence, filepath, mtl, pretty, process, template-haskell, time, transformers
API changes (from Hackage documentation)
- Agda.Auto.CaseSplit: eqelr :: Elr o -> Elr o -> Bool
- Agda.Auto.CaseSplit: mm :: a -> MM a b
- Agda.Auto.CaseSplit: rename :: (Nat -> Nat) -> MExp o -> MExp o
- Agda.Auto.CaseSplit: renamep :: (Nat -> Nat) -> CSPat o -> CSPat o
- Agda.Auto.CaseSplit: rm :: MM a b -> a
- Agda.Auto.Convert: cnvh :: LensHiding a => a -> FMode
- Agda.Auto.Convert: frommy :: MExp O -> ExceptT String IO Term
- Agda.Auto.Convert: frommyExp :: MExp O -> ExceptT String IO Term
- Agda.Auto.Convert: frommyType :: MExp O -> ExceptT String IO Type
- Agda.Auto.Convert: norm :: Normalise t => t -> TCM t
- Agda.Auto.Convert: tomyClause :: Clause -> TOM (Maybe ([Pat O], MExp O))
- Agda.Auto.Convert: tomyClauses :: [Clause] -> TOM [([Pat O], MExp O)]
- Agda.Auto.Convert: tomyExp :: Term -> TOM (MExp O)
- Agda.Auto.Convert: tomyExps :: Args -> TOM (MM (ArgList O) (RefInfo O))
- Agda.Auto.Convert: tomyPat :: Arg Pattern -> TOM (Pat O)
- Agda.Auto.Convert: tomyType :: Type -> TOM (MExp O)
- Agda.Auto.Convert: weaken :: Int -> MExp O -> MExp O
- Agda.Auto.Convert: weakens :: Int -> MArgList O -> MArgList O
- Agda.Auto.NarrowingSearch: Pair :: a -> b -> Pair a b
- Agda.Auto.NarrowingSearch: data Pair a b
- Agda.Auto.NarrowingSearch: type Prio = Int
- Agda.Auto.NarrowingSearch: type RefCreateEnv blk = StateT (IORef [SubConstraints blk], Int) IO
- Agda.Auto.SearchControl: [eriInfTypeUnknown, eriIsEliminand] :: ExpRefInfo o -> Bool
- Agda.Auto.Syntax: Hidden :: FMode
- Agda.Auto.Syntax: Instance :: FMode
- Agda.Auto.Syntax: NotHidden :: FMode
- Agda.Auto.Syntax: data FMode
- Agda.Auto.Syntax: data HNExp o
- Agda.Auto.Syntax: expandExp :: MExp o -> IO (MExp o)
- Agda.Auto.Syntax: instance GHC.Classes.Eq Agda.Auto.Syntax.FMode
- Agda.Auto.Syntax: stringToMyId :: String -> MId
- Agda.Auto.Syntax: weakarglist :: Nat -> ICArgList o -> ICArgList o
- Agda.Auto.Syntax: weakelr :: Nat -> Elr o -> Elr o
- Agda.Auto.Syntax: weaki :: Nat -> Clos a o -> Clos a o
- Agda.Benchmarking: Operators :: Phase
- Agda.Benchmarking: instance GHC.Enum.Bounded Agda.Benchmarking.Phase
- Agda.Benchmarking: instance GHC.Enum.Enum Agda.Benchmarking.Phase
- Agda.Compiler.Epic.AuxAST: App :: Var -> [Expr] -> Expr
- Agda.Compiler.Epic.AuxAST: BrInt :: Int -> Expr -> Branch
- Agda.Compiler.Epic.AuxAST: Branch :: Tag -> QName -> [Var] -> Expr -> Branch
- Agda.Compiler.Epic.AuxAST: Case :: Expr -> [Branch] -> Expr
- Agda.Compiler.Epic.AuxAST: Con :: Tag -> QName -> [Expr] -> Expr
- Agda.Compiler.Epic.AuxAST: Default :: Expr -> Branch
- Agda.Compiler.Epic.AuxAST: EpicFun :: Var -> Maybe QName -> Comment -> String -> Fun
- Agda.Compiler.Epic.AuxAST: Fun :: Inline -> Var -> Maybe QName -> Comment -> [Var] -> Expr -> Fun
- Agda.Compiler.Epic.AuxAST: IMPOSSIBLE :: Expr
- Agda.Compiler.Epic.AuxAST: If :: Expr -> Expr -> Expr -> Expr
- Agda.Compiler.Epic.AuxAST: LChar :: Char -> Lit
- Agda.Compiler.Epic.AuxAST: LFloat :: Double -> Lit
- Agda.Compiler.Epic.AuxAST: LInt :: Integer -> Lit
- Agda.Compiler.Epic.AuxAST: LString :: String -> Lit
- Agda.Compiler.Epic.AuxAST: Lam :: Var -> Expr -> Expr
- Agda.Compiler.Epic.AuxAST: Lazy :: Expr -> Expr
- Agda.Compiler.Epic.AuxAST: Let :: Var -> Expr -> Expr -> Expr
- Agda.Compiler.Epic.AuxAST: Lit :: Lit -> Expr
- Agda.Compiler.Epic.AuxAST: UNIT :: Expr
- Agda.Compiler.Epic.AuxAST: Var :: Var -> Expr
- Agda.Compiler.Epic.AuxAST: [brExpr] :: Branch -> Expr
- Agda.Compiler.Epic.AuxAST: [brInt] :: Branch -> Int
- Agda.Compiler.Epic.AuxAST: [brName] :: Branch -> QName
- Agda.Compiler.Epic.AuxAST: [brTag] :: Branch -> Tag
- Agda.Compiler.Epic.AuxAST: [brVars] :: Branch -> [Var]
- Agda.Compiler.Epic.AuxAST: [funArgs] :: Fun -> [Var]
- Agda.Compiler.Epic.AuxAST: [funComment] :: Fun -> Comment
- Agda.Compiler.Epic.AuxAST: [funEpicCode] :: Fun -> String
- Agda.Compiler.Epic.AuxAST: [funExpr] :: Fun -> Expr
- Agda.Compiler.Epic.AuxAST: [funInline] :: Fun -> Inline
- Agda.Compiler.Epic.AuxAST: [funName] :: Fun -> Var
- Agda.Compiler.Epic.AuxAST: [funQName] :: Fun -> Maybe QName
- Agda.Compiler.Epic.AuxAST: apps :: Var -> [Expr] -> Expr
- Agda.Compiler.Epic.AuxAST: casee :: Expr -> [Branch] -> Expr
- Agda.Compiler.Epic.AuxAST: data Branch
- Agda.Compiler.Epic.AuxAST: data Expr
- Agda.Compiler.Epic.AuxAST: data Fun
- Agda.Compiler.Epic.AuxAST: data Lit
- Agda.Compiler.Epic.AuxAST: fv :: Expr -> [Var]
- Agda.Compiler.Epic.AuxAST: getBrVars :: Branch -> [Var]
- Agda.Compiler.Epic.AuxAST: instance GHC.Classes.Eq Agda.Compiler.Epic.AuxAST.Branch
- Agda.Compiler.Epic.AuxAST: instance GHC.Classes.Eq Agda.Compiler.Epic.AuxAST.Expr
- Agda.Compiler.Epic.AuxAST: instance GHC.Classes.Eq Agda.Compiler.Epic.AuxAST.Fun
- Agda.Compiler.Epic.AuxAST: instance GHC.Classes.Eq Agda.Compiler.Epic.AuxAST.Lit
- Agda.Compiler.Epic.AuxAST: instance GHC.Classes.Ord Agda.Compiler.Epic.AuxAST.Branch
- Agda.Compiler.Epic.AuxAST: instance GHC.Classes.Ord Agda.Compiler.Epic.AuxAST.Expr
- Agda.Compiler.Epic.AuxAST: instance GHC.Classes.Ord Agda.Compiler.Epic.AuxAST.Fun
- Agda.Compiler.Epic.AuxAST: instance GHC.Classes.Ord Agda.Compiler.Epic.AuxAST.Lit
- Agda.Compiler.Epic.AuxAST: instance GHC.Show.Show Agda.Compiler.Epic.AuxAST.Branch
- Agda.Compiler.Epic.AuxAST: instance GHC.Show.Show Agda.Compiler.Epic.AuxAST.Expr
- Agda.Compiler.Epic.AuxAST: instance GHC.Show.Show Agda.Compiler.Epic.AuxAST.Fun
- Agda.Compiler.Epic.AuxAST: instance GHC.Show.Show Agda.Compiler.Epic.AuxAST.Lit
- Agda.Compiler.Epic.AuxAST: lazy :: Expr -> Expr
- Agda.Compiler.Epic.AuxAST: lett :: Var -> Expr -> Expr -> Expr
- Agda.Compiler.Epic.AuxAST: subst :: Var -> Var -> Expr -> Expr
- Agda.Compiler.Epic.AuxAST: substBranch :: Var -> Var -> Branch -> Branch
- Agda.Compiler.Epic.AuxAST: substs :: [(Var, Var)] -> Expr -> Expr
- Agda.Compiler.Epic.AuxAST: type Comment = String
- Agda.Compiler.Epic.AuxAST: type Inline = Bool
- Agda.Compiler.Epic.CaseOpts: caseOpts :: [Fun] -> Compile TCM [Fun]
- Agda.Compiler.Epic.CaseOpts: caseOptsExpr :: Expr -> Compile TCM Expr
- Agda.Compiler.Epic.CompileState: CompileState :: [Var] -> Map TopLevelModuleName (EInterface, Set FilePath) -> EInterface -> EInterface -> String -> CompileState
- Agda.Compiler.Epic.CompileState: [compiledModules] :: CompileState -> Map TopLevelModuleName (EInterface, Set FilePath)
- Agda.Compiler.Epic.CompileState: [curFun] :: CompileState -> String
- Agda.Compiler.Epic.CompileState: [curModule] :: CompileState -> EInterface
- Agda.Compiler.Epic.CompileState: [importedModules] :: CompileState -> EInterface
- Agda.Compiler.Epic.CompileState: [nameSupply] :: CompileState -> [Var]
- Agda.Compiler.Epic.CompileState: addDefName :: QName -> Compile TCM ()
- Agda.Compiler.Epic.CompileState: assignConstrTag :: QName -> Compile TCM Tag
- Agda.Compiler.Epic.CompileState: assignConstrTag' :: QName -> [QName] -> Compile TCM Tag
- Agda.Compiler.Epic.CompileState: bindExpr :: Expr -> (Var -> Compile TCM Expr) -> Compile TCM Expr
- Agda.Compiler.Epic.CompileState: constrInScope :: QName -> Compile TCM Bool
- Agda.Compiler.Epic.CompileState: constructorArity :: Num a => QName -> TCM a
- Agda.Compiler.Epic.CompileState: data CompileState
- Agda.Compiler.Epic.CompileState: epicError :: String -> Compile TCM a
- Agda.Compiler.Epic.CompileState: getConArity :: QName -> Compile TCM Int
- Agda.Compiler.Epic.CompileState: getConData :: QName -> Compile TCM QName
- Agda.Compiler.Epic.CompileState: getConstrTag :: QName -> Compile TCM Tag
- Agda.Compiler.Epic.CompileState: getConstrTag' :: QName -> Compile TCM (Maybe Tag)
- Agda.Compiler.Epic.CompileState: getDataCon :: QName -> Compile TCM [QName]
- Agda.Compiler.Epic.CompileState: getDelayed :: QName -> Compile TCM Bool
- Agda.Compiler.Epic.CompileState: getForcedArgs :: QName -> Compile TCM ForcedArgs
- Agda.Compiler.Epic.CompileState: getMain :: Compile TCM Var
- Agda.Compiler.Epic.CompileState: getType :: QName -> Compile TCM Type
- Agda.Compiler.Epic.CompileState: getsEI :: (EInterface -> a) -> Compile TCM a
- Agda.Compiler.Epic.CompileState: initCompileState :: CompileState
- Agda.Compiler.Epic.CompileState: instance GHC.Show.Show Agda.Compiler.Epic.CompileState.CompileState
- Agda.Compiler.Epic.CompileState: lookInterface :: (EInterface -> Maybe a) -> Compile TCM a -> Compile TCM a
- Agda.Compiler.Epic.CompileState: modifyEI :: (EInterface -> EInterface) -> Compile TCM ()
- Agda.Compiler.Epic.CompileState: newName :: Compile TCM Var
- Agda.Compiler.Epic.CompileState: putConArity :: QName -> Int -> Compile TCM ()
- Agda.Compiler.Epic.CompileState: putConstrTag :: QName -> Tag -> Compile TCM ()
- Agda.Compiler.Epic.CompileState: putDelayed :: QName -> Bool -> Compile TCM ()
- Agda.Compiler.Epic.CompileState: putForcedArgs :: QName -> ForcedArgs -> Compile TCM ()
- Agda.Compiler.Epic.CompileState: putMain :: QName -> Compile TCM ()
- Agda.Compiler.Epic.CompileState: replaceAt :: Int -> [a] -> [a] -> [a]
- Agda.Compiler.Epic.CompileState: resetNameSupply :: Compile TCM ()
- Agda.Compiler.Epic.CompileState: topBindings :: Compile TCM (Set Var)
- Agda.Compiler.Epic.CompileState: type Compile = StateT CompileState
- Agda.Compiler.Epic.CompileState: unqname :: QName -> Var
- Agda.Compiler.Epic.Compiler: compilerMain :: Interface -> TCM ()
- Agda.Compiler.Epic.Epic: prettyEpic :: Expr -> String
- Agda.Compiler.Epic.Epic: prettyEpicFun :: MonadTCM m => Fun -> Compile m String
- Agda.Compiler.Epic.Erasure: (&&-) :: Relevance -> Relevance -> Relevance
- Agda.Compiler.Epic.Erasure: (||-) :: Relevance -> Relevance -> Relevance
- Agda.Compiler.Epic.Erasure: ErasureState :: Map Var [Relevance] -> Map Var Fun -> ErasureState
- Agda.Compiler.Epic.Erasure: [funs] :: ErasureState -> Map Var Fun
- Agda.Compiler.Epic.Erasure: [relevancies] :: ErasureState -> Map Var [Relevance]
- Agda.Compiler.Epic.Erasure: data ErasureState
- Agda.Compiler.Epic.Erasure: diff :: Eq a => Map k a -> Map k a -> [(k, (a, a))]
- Agda.Compiler.Epic.Erasure: erasure :: [Fun] -> Compile TCM [Fun]
- Agda.Compiler.Epic.Erasure: ignoreForced :: Relevance -> Bool
- Agda.Compiler.Epic.Erasure: infixr 2 ||-
- Agda.Compiler.Epic.Erasure: infixr 3 &&-
- Agda.Compiler.Epic.Erasure: initialRels :: Type -> Relevance -> [Relevance]
- Agda.Compiler.Epic.Erasure: initiate :: Fun -> Erasure (Compile TCM) ()
- Agda.Compiler.Epic.Erasure: isIrr :: Relevance -> Bool
- Agda.Compiler.Epic.Erasure: isRel :: Relevance -> Bool
- Agda.Compiler.Epic.Erasure: relevant :: Monad m => Var -> Expr -> Erasure m Relevance
- Agda.Compiler.Epic.Erasure: removeUnused :: Map Var [Relevance] -> Expr -> Expr
- Agda.Compiler.Epic.Erasure: step :: Integer -> Erasure (Compile TCM) (Map Var [Relevance])
- Agda.Compiler.Epic.Erasure: type Erasure = StateT ErasureState
- Agda.Compiler.Epic.ForceConstrs: forceConstrs :: [Fun] -> Compile TCM [Fun]
- Agda.Compiler.Epic.ForceConstrs: forceFun :: Fun -> Compile TCM Fun
- Agda.Compiler.Epic.ForceConstrs: makeForcedArgs :: Type -> ForcedArgs
- Agda.Compiler.Epic.Forcing: buildTerm :: Var -> Nat -> Term -> Compile TCM (Expr -> Expr, Var)
- Agda.Compiler.Epic.Forcing: dataParameters :: QName -> Compile TCM Nat
- Agda.Compiler.Epic.Forcing: dataParametersTCM :: QName -> TCM Nat
- Agda.Compiler.Epic.Forcing: findPosition :: Nat -> [Maybe Term] -> Compile TCM (Maybe (Nat, Term))
- Agda.Compiler.Epic.Forcing: forcedExpr :: [Var] -> Telescope -> Expr -> Compile TCM Expr
- Agda.Compiler.Epic.Forcing: insertTele :: (QName, Args) -> Int -> Maybe Type -> Term -> Telescope -> Compile TCM (Telescope, (Telescope, Type, Type))
- Agda.Compiler.Epic.Forcing: mkCon :: QName -> Int -> Term
- Agda.Compiler.Epic.Forcing: piApplyM' :: Type -> Args -> TCM Type
- Agda.Compiler.Epic.Forcing: remForced :: [Fun] -> Compile TCM [Fun]
- Agda.Compiler.Epic.Forcing: replaceForced :: ([Var], [Var]) -> Telescope -> [Var] -> [Maybe Term] -> Expr -> Compile TCM Expr
- Agda.Compiler.Epic.Forcing: report :: Int -> TCM Doc -> Compile TCM ()
- Agda.Compiler.Epic.Forcing: takeTele :: Int -> Telescope -> Telescope
- Agda.Compiler.Epic.Forcing: unifyI :: Telescope -> FlexibleVars -> Type -> Args -> Args -> Compile TCM [Maybe Term]
- Agda.Compiler.Epic.FromAgda: compileClauses :: QName -> Int -> CompiledClauses -> Compile TCM Fun
- Agda.Compiler.Epic.FromAgda: fromAgda :: Maybe Term -> [(QName, Definition)] -> Compile TCM [Fun]
- Agda.Compiler.Epic.FromAgda: reverseCCBody :: Int -> CompiledClauses -> CompiledClauses
- Agda.Compiler.Epic.FromAgda: substLit :: Literal -> Compile TCM Lit
- Agda.Compiler.Epic.FromAgda: substTerm :: [Var] -> Term -> Compile TCM Expr
- Agda.Compiler.Epic.FromAgda: translateDefn :: Maybe Term -> (QName, Definition) -> Compile TCM (Maybe Fun)
- Agda.Compiler.Epic.Injection: (!!!!) :: Ord k => Map k v -> k -> v
- Agda.Compiler.Epic.Injection: (<:) :: Injectible a => a -> a -> ReaderT (Map QName InjectiveFun) (Compile TCM) InjConstraints
- Agda.Compiler.Epic.Injection: IsTag :: Tag -> TagEq
- Agda.Compiler.Epic.Injection: Same :: Int -> TagEq
- Agda.Compiler.Epic.Injection: Tags :: IntMap (Set QName) -> Map QName TagEq -> Tags
- Agda.Compiler.Epic.Injection: [constrGroup] :: Tags -> Map QName TagEq
- Agda.Compiler.Epic.Injection: [eqGroups] :: Tags -> IntMap (Set QName)
- Agda.Compiler.Epic.Injection: addConstraint :: QName -> QName -> InjConstraints -> InjConstraints
- Agda.Compiler.Epic.Injection: class Injectible a
- Agda.Compiler.Epic.Injection: data TagEq
- Agda.Compiler.Epic.Injection: data Tags
- Agda.Compiler.Epic.Injection: emptyC :: InjConstraints
- Agda.Compiler.Epic.Injection: findInjection :: [(QName, Definition)] -> Compile TCM [(QName, Definition)]
- Agda.Compiler.Epic.Injection: initialTags :: Map QName Tag -> [QName] -> Tags
- Agda.Compiler.Epic.Injection: insertAt :: (Nat, Term) -> Term -> Term
- Agda.Compiler.Epic.Injection: instance Agda.Compiler.Epic.Injection.Injectible Agda.Syntax.Internal.Term
- Agda.Compiler.Epic.Injection: instance Agda.Compiler.Epic.Injection.Injectible a => Agda.Compiler.Epic.Injection.Injectible (Agda.Syntax.Common.Arg a)
- Agda.Compiler.Epic.Injection: instance Agda.Compiler.Epic.Injection.Injectible a => Agda.Compiler.Epic.Injection.Injectible (Agda.Syntax.Internal.Elim' a)
- Agda.Compiler.Epic.Injection: instance Agda.Compiler.Epic.Injection.Injectible a => Agda.Compiler.Epic.Injection.Injectible [a]
- Agda.Compiler.Epic.Injection: instance GHC.Classes.Eq Agda.Compiler.Epic.Injection.TagEq
- Agda.Compiler.Epic.Injection: isInjective :: QName -> [Clause] -> Compile TCM (Maybe ((QName, InjectiveFun), [(QName, QName)]))
- Agda.Compiler.Epic.Injection: isInjectiveHere :: QName -> Int -> Clause -> Compile TCM InjConstraints
- Agda.Compiler.Epic.Injection: litInt :: Literal -> Bool
- Agda.Compiler.Epic.Injection: litToCon :: Literal -> TCM Term
- Agda.Compiler.Epic.Injection: mergeGroups :: Int -> Int -> Tags -> Compile TCM (Maybe Tags)
- Agda.Compiler.Epic.Injection: nrBinds :: Num i => Pattern -> i
- Agda.Compiler.Epic.Injection: patternToTerm :: Nat -> Pattern -> Term
- Agda.Compiler.Epic.Injection: replaceFunCC :: QName -> CompiledClauses -> Compile TCM ()
- Agda.Compiler.Epic.Injection: setTag :: Int -> Tag -> Tags -> Compile TCM (Maybe Tags)
- Agda.Compiler.Epic.Injection: solve :: [QName] -> [((QName, InjectiveFun), [(QName, QName)])] -> Compile TCM [(QName, InjectiveFun)]
- Agda.Compiler.Epic.Injection: substForDot :: [NamedArg (Pattern' a)] -> Substitution
- Agda.Compiler.Epic.Injection: type InjConstraints = Maybe [(QName, QName)]
- Agda.Compiler.Epic.Injection: unifiable :: QName -> QName -> Compile TCM Bool
- Agda.Compiler.Epic.Injection: unify :: QName -> QName -> Tags -> Compile TCM (Maybe Tags)
- Agda.Compiler.Epic.Injection: unionConstraints :: [InjConstraints] -> InjConstraints
- Agda.Compiler.Epic.Interface: EInterface :: Map QName Tag -> Set Var -> Map QName Bool -> Map QName Int -> Maybe QName -> Map Var RelevantArgs -> Map QName ForcedArgs -> Map QName InjectiveFun -> EInterface
- Agda.Compiler.Epic.Interface: Forced :: Forced
- Agda.Compiler.Epic.Interface: InjectiveFun :: Nat -> Nat -> InjectiveFun
- Agda.Compiler.Epic.Interface: Irr :: Relevance
- Agda.Compiler.Epic.Interface: NotForced :: Forced
- Agda.Compiler.Epic.Interface: PrimTag :: Var -> Tag
- Agda.Compiler.Epic.Interface: Rel :: Relevance
- Agda.Compiler.Epic.Interface: Tag :: Int -> Tag
- Agda.Compiler.Epic.Interface: [conArity] :: EInterface -> Map QName Int
- Agda.Compiler.Epic.Interface: [constrTags] :: EInterface -> Map QName Tag
- Agda.Compiler.Epic.Interface: [defDelayed] :: EInterface -> Map QName Bool
- Agda.Compiler.Epic.Interface: [definitions] :: EInterface -> Set Var
- Agda.Compiler.Epic.Interface: [forcedArgs] :: EInterface -> Map QName ForcedArgs
- Agda.Compiler.Epic.Interface: [injArg] :: InjectiveFun -> Nat
- Agda.Compiler.Epic.Interface: [injArity] :: InjectiveFun -> Nat
- Agda.Compiler.Epic.Interface: [injectiveFuns] :: EInterface -> Map QName InjectiveFun
- Agda.Compiler.Epic.Interface: [mainName] :: EInterface -> Maybe QName
- Agda.Compiler.Epic.Interface: [relevantArgs] :: EInterface -> Map Var RelevantArgs
- Agda.Compiler.Epic.Interface: data EInterface
- Agda.Compiler.Epic.Interface: data Forced
- Agda.Compiler.Epic.Interface: data InjectiveFun
- Agda.Compiler.Epic.Interface: data Relevance
- Agda.Compiler.Epic.Interface: data Tag
- Agda.Compiler.Epic.Interface: forced :: ForcedArgs -> [a] -> [a]
- Agda.Compiler.Epic.Interface: instance Data.Semigroup.Semigroup Agda.Compiler.Epic.Interface.EInterface
- Agda.Compiler.Epic.Interface: instance GHC.Base.Monoid Agda.Compiler.Epic.Interface.EInterface
- Agda.Compiler.Epic.Interface: instance GHC.Classes.Eq Agda.Compiler.Epic.Interface.Forced
- Agda.Compiler.Epic.Interface: instance GHC.Classes.Eq Agda.Compiler.Epic.Interface.InjectiveFun
- Agda.Compiler.Epic.Interface: instance GHC.Classes.Eq Agda.Compiler.Epic.Interface.Relevance
- Agda.Compiler.Epic.Interface: instance GHC.Classes.Eq Agda.Compiler.Epic.Interface.Tag
- Agda.Compiler.Epic.Interface: instance GHC.Classes.Ord Agda.Compiler.Epic.Interface.Relevance
- Agda.Compiler.Epic.Interface: instance GHC.Classes.Ord Agda.Compiler.Epic.Interface.Tag
- Agda.Compiler.Epic.Interface: instance GHC.Show.Show Agda.Compiler.Epic.Interface.EInterface
- Agda.Compiler.Epic.Interface: instance GHC.Show.Show Agda.Compiler.Epic.Interface.Forced
- Agda.Compiler.Epic.Interface: instance GHC.Show.Show Agda.Compiler.Epic.Interface.InjectiveFun
- Agda.Compiler.Epic.Interface: instance GHC.Show.Show Agda.Compiler.Epic.Interface.Relevance
- Agda.Compiler.Epic.Interface: instance GHC.Show.Show Agda.Compiler.Epic.Interface.Tag
- Agda.Compiler.Epic.Interface: notForced :: ForcedArgs -> [a] -> [a]
- Agda.Compiler.Epic.Interface: pairwiseFilter :: [Bool] -> [a] -> [a]
- Agda.Compiler.Epic.Interface: type ForcedArgs = [Forced]
- Agda.Compiler.Epic.Interface: type RelevantArgs = [Relevance]
- Agda.Compiler.Epic.Interface: type Var = String
- Agda.Compiler.Epic.NatDetection: argIsDef :: Type -> QName -> Bool
- Agda.Compiler.Epic.NatDetection: getNatish :: Compile TCM [(ForcedArgs, [QName])]
- Agda.Compiler.Epic.NatDetection: isNatish :: QName -> Defn -> Compile TCM (Maybe (ForcedArgs, [QName]))
- Agda.Compiler.Epic.NatDetection: isRec :: Int -> Type -> QName -> Bool
- Agda.Compiler.Epic.NatDetection: nrRel :: ForcedArgs -> Integer
- Agda.Compiler.Epic.Primitive: PrimTF :: Map QName Var -> (Expr -> [Branch] -> Expr) -> PrimTransform
- Agda.Compiler.Epic.Primitive: [mapCon] :: PrimTransform -> Map QName Var
- Agda.Compiler.Epic.Primitive: [translateCase] :: PrimTransform -> Expr -> [Branch] -> Expr
- Agda.Compiler.Epic.Primitive: boolPrimTF :: [QName] -> PrimTransform
- Agda.Compiler.Epic.Primitive: data PrimTransform
- Agda.Compiler.Epic.Primitive: defName :: Term -> QName
- Agda.Compiler.Epic.Primitive: getBuiltins :: Compile TCM [PrimTransform]
- Agda.Compiler.Epic.Primitive: initialPrims :: Compile TCM ()
- Agda.Compiler.Epic.Primitive: natPrimTF :: ForcedArgs -> [QName] -> PrimTransform
- Agda.Compiler.Epic.Primitive: prFalse :: Var
- Agda.Compiler.Epic.Primitive: prNatEquality :: Var
- Agda.Compiler.Epic.Primitive: prPred :: Var
- Agda.Compiler.Epic.Primitive: prSuc :: Var
- Agda.Compiler.Epic.Primitive: prTrue :: Var
- Agda.Compiler.Epic.Primitive: prZero :: Var
- Agda.Compiler.Epic.Primitive: primExpr :: [PrimTransform] -> Expr -> Compile TCM Expr
- Agda.Compiler.Epic.Primitive: primFun :: [PrimTransform] -> Fun -> Compile TCM Fun
- Agda.Compiler.Epic.Primitive: primNatCaseZD :: Expr -> Expr -> Expr -> Expr
- Agda.Compiler.Epic.Primitive: primNatCaseZS :: Expr -> Expr -> Var -> Expr -> Expr
- Agda.Compiler.Epic.Primitive: primitivise :: [Fun] -> Compile TCM [Fun]
- Agda.Compiler.Epic.Smashing: (+++) :: Telescope -> Telescope -> Telescope
- Agda.Compiler.Epic.Smashing: buildLambda :: (Ord n, Num n) => n -> Expr -> Expr
- Agda.Compiler.Epic.Smashing: defnPars :: Integral n => Defn -> n
- Agda.Compiler.Epic.Smashing: inferable :: Set QName -> QName -> [Arg Term] -> Compile TCM (Maybe Expr)
- Agda.Compiler.Epic.Smashing: inferableTerm :: Set QName -> Term -> Compile TCM (Maybe Expr)
- Agda.Compiler.Epic.Smashing: smash'em :: [Fun] -> Compile TCM [Fun]
- Agda.Compiler.Epic.Smashing: smashable :: Int -> Type -> Compile TCM (Maybe Expr)
- Agda.Compiler.Epic.Static: class Evaluate a
- Agda.Compiler.Epic.Static: etaExpand :: Term -> Compile TCM Term
- Agda.Compiler.Epic.Static: evaluate :: Evaluate a => a -> Compile TCM a
- Agda.Compiler.Epic.Static: evaluateCC :: CompiledClauses -> Compile TCM CompiledClauses
- Agda.Compiler.Epic.Static: instance Agda.Compiler.Epic.Static.Evaluate Agda.Syntax.Internal.Term
- Agda.Compiler.Epic.Static: instance Agda.Compiler.Epic.Static.Evaluate a => Agda.Compiler.Epic.Static.Evaluate (Agda.Syntax.Common.Arg a)
- Agda.Compiler.Epic.Static: instance Agda.Compiler.Epic.Static.Evaluate a => Agda.Compiler.Epic.Static.Evaluate (Agda.Syntax.Internal.Abs a)
- Agda.Compiler.Epic.Static: instance Agda.Compiler.Epic.Static.Evaluate a => Agda.Compiler.Epic.Static.Evaluate (Agda.Syntax.Internal.Elim' a)
- Agda.Compiler.Epic.Static: instance Agda.Compiler.Epic.Static.Evaluate a => Agda.Compiler.Epic.Static.Evaluate [a]
- Agda.Compiler.Epic.Static: normaliseStatic :: CompiledClauses -> Compile TCM CompiledClauses
- Agda.Compiler.HaskellTypes: getHsType :: QName -> TCM HaskellType
- Agda.Compiler.HaskellTypes: getHsVar :: Nat -> TCM HaskellCode
- Agda.Compiler.HaskellTypes: haskellType :: Type -> TCM HaskellType
- Agda.Compiler.HaskellTypes: hsApp :: String -> [HaskellType] -> HaskellType
- Agda.Compiler.HaskellTypes: hsForall :: String -> HaskellType -> HaskellType
- Agda.Compiler.HaskellTypes: hsFun :: HaskellKind -> HaskellKind -> HaskellKind
- Agda.Compiler.HaskellTypes: hsKFun :: HaskellKind -> HaskellKind -> HaskellKind
- Agda.Compiler.HaskellTypes: hsStar :: HaskellKind
- Agda.Compiler.HaskellTypes: hsUnit :: HaskellType
- Agda.Compiler.HaskellTypes: hsVar :: Name -> HaskellType
- Agda.Compiler.HaskellTypes: notAHaskellType :: Type -> TCM a
- Agda.Compiler.HaskellTypes: type HaskellKind = String
- Agda.Compiler.JS.Compiler: compile :: IsMain -> Interface -> TCM ()
- Agda.Compiler.JS.Compiler: compilerMain :: Interface -> TCM ()
- Agda.Compiler.JS.Pretty: instance (Agda.Compiler.JS.Pretty.Pretty a, Agda.Compiler.JS.Pretty.Pretty b) => Agda.Compiler.JS.Pretty.Pretties (Data.Map.Base.Map a b)
- Agda.Compiler.JS.Syntax: [isCoind] :: Export -> Bool
- Agda.Compiler.JS.Syntax: instance Agda.Compiler.JS.Syntax.Globals a => Agda.Compiler.JS.Syntax.Globals (Data.Map.Base.Map k a)
- Agda.Compiler.JS.Syntax: instance Agda.Compiler.JS.Syntax.Uses a => Agda.Compiler.JS.Syntax.Uses (Data.Map.Base.Map k a)
- Agda.Compiler.MAlonzo.Compiler: compile :: Interface -> TCM ()
- Agda.Compiler.MAlonzo.Compiler: compilerMain :: IsMain -> Interface -> TCM ()
- Agda.Compiler.MAlonzo.Compiler: definitions :: Definitions -> TCM [Decl]
- Agda.Compiler.Treeless.DelayCoinduction: delayCoinduction :: TTerm -> Type -> TCM TTerm
- Agda.Compiler.Treeless.DelayCoinduction: outputIsInf :: Maybe CoinductionKit -> Type -> TCM Bool
- Agda.Compiler.Treeless.DelayCoinduction: transform :: CoinductionKit -> TTerm -> Type -> TCM TTerm
- Agda.Compiler.Treeless.DelayCoinduction: underLambdas :: Int -> (TTerm -> TTerm) -> TTerm -> TTerm
- Agda.Compiler.UHC.Bridge: class Serialize a
- Agda.Compiler.UHC.Bridge: ctagCons :: EHCOpts -> CTag
- Agda.Compiler.UHC.Bridge: ctagFalse :: EHCOpts -> CTag
- Agda.Compiler.UHC.Bridge: ctagNil :: EHCOpts -> CTag
- Agda.Compiler.UHC.Bridge: ctagTrue :: EHCOpts -> CTag
- Agda.Compiler.UHC.Bridge: ctagUnit :: CTag
- Agda.Compiler.UHC.Bridge: data CAlt
- Agda.Compiler.UHC.Bridge: data CBind
- Agda.Compiler.UHC.Bridge: data CDataCon
- Agda.Compiler.UHC.Bridge: data CDeclMeta
- Agda.Compiler.UHC.Bridge: data CExport
- Agda.Compiler.UHC.Bridge: data CExpr
- Agda.Compiler.UHC.Bridge: data CImport
- Agda.Compiler.UHC.Bridge: data CModule
- Agda.Compiler.UHC.Bridge: data CPat
- Agda.Compiler.UHC.Bridge: data CPatFld
- Agda.Compiler.UHC.Bridge: data CTag
- Agda.Compiler.UHC.Bridge: data EHCOpts
- Agda.Compiler.UHC.Bridge: data HsName
- Agda.Compiler.UHC.Bridge: defaultEHCOpts :: EHCOpts
- Agda.Compiler.UHC.Bridge: destructCTag :: a -> (HsName -> HsName -> Int -> Int -> a) -> CTag -> a
- Agda.Compiler.UHC.Bridge: disp :: PP_Doc -> Int -> ShowS
- Agda.Compiler.UHC.Bridge: instance Agda.Compiler.UHC.Bridge.PP Agda.Compiler.UHC.Bridge.CExpr
- Agda.Compiler.UHC.Bridge: instance Agda.Compiler.UHC.Bridge.Serialize Agda.Compiler.UHC.Bridge.CExpr
- Agda.Compiler.UHC.Bridge: instance Agda.Compiler.UHC.Bridge.Serialize Agda.Compiler.UHC.Bridge.CModule
- Agda.Compiler.UHC.Bridge: instance Agda.Compiler.UHC.Bridge.Serialize Agda.Compiler.UHC.Bridge.CTag
- Agda.Compiler.UHC.Bridge: instance Agda.Compiler.UHC.Bridge.Serialize Agda.Compiler.UHC.Bridge.HsName
- Agda.Compiler.UHC.Bridge: instance GHC.Classes.Eq Agda.Compiler.UHC.Bridge.CExpr
- Agda.Compiler.UHC.Bridge: instance GHC.Classes.Eq Agda.Compiler.UHC.Bridge.CTag
- Agda.Compiler.UHC.Bridge: instance GHC.Classes.Eq Agda.Compiler.UHC.Bridge.HsName
- Agda.Compiler.UHC.Bridge: instance GHC.Classes.Ord Agda.Compiler.UHC.Bridge.CExpr
- Agda.Compiler.UHC.Bridge: instance GHC.Classes.Ord Agda.Compiler.UHC.Bridge.CTag
- Agda.Compiler.UHC.Bridge: instance GHC.Classes.Ord Agda.Compiler.UHC.Bridge.HsName
- Agda.Compiler.UHC.Bridge: instance GHC.Show.Show Agda.Compiler.UHC.Bridge.CExpr
- Agda.Compiler.UHC.Bridge: instance GHC.Show.Show Agda.Compiler.UHC.Bridge.CTag
- Agda.Compiler.UHC.Bridge: instance GHC.Show.Show Agda.Compiler.UHC.Bridge.HsName
- Agda.Compiler.UHC.Bridge: mkAlt :: CPat -> CExpr -> CAlt
- Agda.Compiler.UHC.Bridge: mkApp :: CExpr -> [CExpr] -> CExpr
- Agda.Compiler.UHC.Bridge: mkBind1 :: HsName -> CExpr -> CBind
- Agda.Compiler.UHC.Bridge: mkBind1Nm1 :: HsName -> CBind
- Agda.Compiler.UHC.Bridge: mkCTag :: HsName -> HsName -> Int -> Int -> CTag
- Agda.Compiler.UHC.Bridge: mkCase :: CExpr -> [CAlt] -> CExpr
- Agda.Compiler.UHC.Bridge: mkChar :: Char -> CExpr
- Agda.Compiler.UHC.Bridge: mkError :: EHCOpts -> String -> CExpr
- Agda.Compiler.UHC.Bridge: mkExport :: HsName -> CExport
- Agda.Compiler.UHC.Bridge: mkHsName :: [String] -> String -> HsName
- Agda.Compiler.UHC.Bridge: mkHsName1 :: String -> HsName
- Agda.Compiler.UHC.Bridge: mkImport :: HsName -> CImport
- Agda.Compiler.UHC.Bridge: mkInt :: EHCOpts -> Int -> CExpr
- Agda.Compiler.UHC.Bridge: mkInteger :: EHCOpts -> Integer -> CExpr
- Agda.Compiler.UHC.Bridge: mkLam :: [HsName] -> CExpr -> CExpr
- Agda.Compiler.UHC.Bridge: mkLet1Plain :: HsName -> CExpr -> CExpr -> CExpr
- Agda.Compiler.UHC.Bridge: mkLet1Strict :: HsName -> CExpr -> CExpr -> CExpr
- Agda.Compiler.UHC.Bridge: mkLetRec :: [CBind] -> CExpr -> CExpr
- Agda.Compiler.UHC.Bridge: mkMain :: HsName -> CExpr
- Agda.Compiler.UHC.Bridge: mkMetaData :: HsName -> [CDataCon] -> CDeclMeta
- Agda.Compiler.UHC.Bridge: mkMetaDataCon :: HsName -> Int -> Int -> CDataCon
- Agda.Compiler.UHC.Bridge: mkMetaDataConFromCTag :: CTag -> Maybe CDataCon
- Agda.Compiler.UHC.Bridge: mkModule :: HsName -> [CExport] -> [CImport] -> [CDeclMeta] -> CExpr -> CModule
- Agda.Compiler.UHC.Bridge: mkPatCon :: CTag -> CPatRest -> [CPatFld] -> CPat
- Agda.Compiler.UHC.Bridge: mkPatFldBind :: (HsName, CExpr) -> CBind -> CPatFld
- Agda.Compiler.UHC.Bridge: mkPatRestEmpty :: CPatRest
- Agda.Compiler.UHC.Bridge: mkString :: EHCOpts -> String -> CExpr
- Agda.Compiler.UHC.Bridge: mkTagTup :: CTag -> [CExpr] -> CExpr
- Agda.Compiler.UHC.Bridge: mkUndefined :: EHCOpts -> CExpr
- Agda.Compiler.UHC.Bridge: mkUniqueHsName :: String -> [String] -> String -> HsName
- Agda.Compiler.UHC.Bridge: mkUnit :: EHCOpts -> CExpr
- Agda.Compiler.UHC.Bridge: mkVar :: HsName -> CExpr
- Agda.Compiler.UHC.Bridge: parseExpr :: EHCOpts -> String -> Either [String] CExpr
- Agda.Compiler.UHC.Bridge: pp :: PP a => a -> PP_Doc
- Agda.Compiler.UHC.Bridge: printModule :: EHCOpts -> CModule -> PP_Doc
- Agda.Compiler.UHC.Bridge: putPPFile :: String -> PP_Doc -> Int -> IO ()
- Agda.Compiler.UHC.Bridge: putSerializeFile :: FilePath -> a -> IO ()
- Agda.Compiler.UHC.Bridge: serialize :: x -> Put
- Agda.Compiler.UHC.Bridge: type PP_Doc = String
- Agda.Compiler.UHC.Bridge: uhcBackendEnabled :: Bool
- Agda.Compiler.UHC.Bridge: unserialize :: Get x
- Agda.Compiler.UHC.CompileState: addExports :: Monad m => [HsName] -> CompileT m ()
- Agda.Compiler.UHC.CompileState: addMetaCon :: QName -> CDataCon -> Compile ()
- Agda.Compiler.UHC.CompileState: addMetaData :: QName -> ([CDataCon] -> CDeclMeta) -> Compile ()
- Agda.Compiler.UHC.CompileState: conArityAndPars :: QName -> TCM (Nat, Nat)
- Agda.Compiler.UHC.CompileState: data CompileT m a
- Agda.Compiler.UHC.CompileState: data CoreMeta
- Agda.Compiler.UHC.CompileState: dataRecCons :: Defn -> [QName]
- Agda.Compiler.UHC.CompileState: freshLocalName :: Monad m => CompileT m HsName
- Agda.Compiler.UHC.CompileState: getConstrCTag :: QName -> Compile CTag
- Agda.Compiler.UHC.CompileState: getConstrFun :: QName -> Compile HsName
- Agda.Compiler.UHC.CompileState: getCoreName :: QName -> Compile HsName
- Agda.Compiler.UHC.CompileState: getCoreName1 :: QName -> TCM HsName
- Agda.Compiler.UHC.CompileState: getDeclMetas :: Compile [CDeclMeta]
- Agda.Compiler.UHC.CompileState: getExports :: Compile [CExport]
- Agda.Compiler.UHC.CompileState: instance Agda.TypeChecking.Monad.Base.MonadTCM m => Agda.TypeChecking.Monad.Base.MonadTCM (Agda.Compiler.UHC.CompileState.CompileT m)
- Agda.Compiler.UHC.CompileState: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Agda.Compiler.UHC.CompileState.CompileT m)
- Agda.Compiler.UHC.CompileState: instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (Agda.Compiler.UHC.CompileState.CompileT m)
- Agda.Compiler.UHC.CompileState: instance Control.Monad.State.Class.MonadState s m => Control.Monad.State.Class.MonadState s (Agda.Compiler.UHC.CompileState.CompileT m)
- Agda.Compiler.UHC.CompileState: instance Control.Monad.Trans.Class.MonadTrans Agda.Compiler.UHC.CompileState.CompileT
- Agda.Compiler.UHC.CompileState: instance Data.Semigroup.Semigroup Agda.Compiler.UHC.CompileState.CoreMeta
- Agda.Compiler.UHC.CompileState: instance GHC.Base.Functor m => GHC.Base.Functor (Agda.Compiler.UHC.CompileState.CompileT m)
- Agda.Compiler.UHC.CompileState: instance GHC.Base.Monad m => GHC.Base.Applicative (Agda.Compiler.UHC.CompileState.CompileT m)
- Agda.Compiler.UHC.CompileState: instance GHC.Base.Monad m => GHC.Base.Monad (Agda.Compiler.UHC.CompileState.CompileT m)
- Agda.Compiler.UHC.CompileState: instance GHC.Base.Monoid Agda.Compiler.UHC.CompileState.CoreMeta
- Agda.Compiler.UHC.CompileState: moduleNameToCoreName :: ModuleName -> HsName
- Agda.Compiler.UHC.CompileState: moduleNameToCoreNameParts :: ModuleName -> [String]
- Agda.Compiler.UHC.CompileState: runCompileT :: MonadIO m => ModuleName -> CompileT m a -> m a
- Agda.Compiler.UHC.CompileState: type Compile = CompileT TCM
- Agda.Compiler.UHC.Compiler: compilerMain :: IsMain -> Interface -> TCM ()
- Agda.Compiler.UHC.FromAgda: BuiltinKit :: (QName -> Bool) -> (QName -> Bool) -> BuiltinKit
- Agda.Compiler.UHC.FromAgda: TTEnv :: [HsName] -> TTEnv
- Agda.Compiler.UHC.FromAgda: [isInt] :: BuiltinKit -> QName -> Bool
- Agda.Compiler.UHC.FromAgda: [isNat] :: BuiltinKit -> QName -> Bool
- Agda.Compiler.UHC.FromAgda: [nmEnv] :: TTEnv -> [HsName]
- Agda.Compiler.UHC.FromAgda: addToEnv :: [HsName] -> TT a -> TT a
- Agda.Compiler.UHC.FromAgda: buildPrimCases :: CExpr -> CExpr -> [TAlt] -> CExpr -> TT CExpr
- Agda.Compiler.UHC.FromAgda: builtinKit :: TCM BuiltinKit
- Agda.Compiler.UHC.FromAgda: compileConAlt :: TAlt -> TT CAlt
- Agda.Compiler.UHC.FromAgda: compilePrim :: TPrim -> CExpr
- Agda.Compiler.UHC.FromAgda: compileTerm :: TTerm -> TT CExpr
- Agda.Compiler.UHC.FromAgda: coreError :: String -> CExpr
- Agda.Compiler.UHC.FromAgda: createMainModule :: ModuleName -> HsName -> CModule
- Agda.Compiler.UHC.FromAgda: data BuiltinKit
- Agda.Compiler.UHC.FromAgda: data TTEnv
- Agda.Compiler.UHC.FromAgda: defaultBranches :: QName -> [TAlt] -> CExpr -> TT [CAlt]
- Agda.Compiler.UHC.FromAgda: fromAgdaModule :: ModuleName -> [ModuleName] -> Interface -> TCM CModule
- Agda.Compiler.UHC.FromAgda: getCTagArity :: CTag -> Int
- Agda.Compiler.UHC.FromAgda: litToCore :: Literal -> CExpr
- Agda.Compiler.UHC.FromAgda: makeConAlt :: QName -> ([HsName] -> TT CExpr) -> TT CAlt
- Agda.Compiler.UHC.FromAgda: mkIfThenElse :: CExpr -> CExpr -> CExpr -> CExpr
- Agda.Compiler.UHC.FromAgda: opts :: EHCOpts
- Agda.Compiler.UHC.FromAgda: runTT :: TT a -> Compile a
- Agda.Compiler.UHC.FromAgda: translateDefn :: (QName, Definition) -> Compile [CBind]
- Agda.Compiler.UHC.FromAgda: type TT = ReaderT TTEnv Compile
- Agda.Compiler.UHC.MagicTypes: HsDataType :: HsName -> HsDataType
- Agda.Compiler.UHC.MagicTypes: HsUnit :: HsDataType
- Agda.Compiler.UHC.MagicTypes: builtinUnitCtor :: HsName
- Agda.Compiler.UHC.MagicTypes: data HsDataType
- Agda.Compiler.UHC.MagicTypes: getMagicTypes :: MagicTypeInfo
- Agda.Compiler.UHC.MagicTypes: type MagicConstrInfo = Map MagicName CTag
- Agda.Compiler.UHC.MagicTypes: type MagicName = String
- Agda.Compiler.UHC.MagicTypes: type MagicTypeInfo = Map MagicName (HsDataType, MagicConstrInfo)
- Agda.Compiler.UHC.Pragmas.Base: CCMagic :: MagicName -> MagicName -> CoreConstr
- Agda.Compiler.UHC.Pragmas.Base: CCNormal :: HsName -> HsName -> Int -> CoreConstr
- Agda.Compiler.UHC.Pragmas.Base: CTMagic :: MagicName -> CoreType
- Agda.Compiler.UHC.Pragmas.Base: CTNormal :: String -> CoreType
- Agda.Compiler.UHC.Pragmas.Base: coreConstrToCTag :: CoreConstr -> Int -> CTag
- Agda.Compiler.UHC.Pragmas.Base: data CoreConstr
- Agda.Compiler.UHC.Pragmas.Base: data CoreType
- Agda.Compiler.UHC.Pragmas.Base: data HsName
- Agda.Compiler.UHC.Pragmas.Base: instance GHC.Classes.Eq Agda.Compiler.UHC.Pragmas.Base.CoreConstr
- Agda.Compiler.UHC.Pragmas.Base: instance GHC.Classes.Eq Agda.Compiler.UHC.Pragmas.Base.CoreType
- Agda.Compiler.UHC.Pragmas.Base: instance GHC.Show.Show Agda.Compiler.UHC.Pragmas.Base.CoreConstr
- Agda.Compiler.UHC.Pragmas.Base: instance GHC.Show.Show Agda.Compiler.UHC.Pragmas.Base.CoreType
- Agda.Compiler.UHC.Pragmas.Base: setTag :: CoreConstr -> Int -> CoreConstr
- Agda.Compiler.UHC.Pragmas.Base: type CoreExpr = String
- Agda.Compiler.UHC.Pragmas.Parse: coreExprToCExpr :: CoreExpr -> Either String CExpr
- Agda.Compiler.UHC.Pragmas.Parse: parseCoreConstrs :: MonadTCM m => CoreType -> [String] -> m [CoreConstr]
- Agda.Compiler.UHC.Pragmas.Parse: parseCoreData :: MonadTCM m => String -> m CoreType
- Agda.Compiler.UHC.Pragmas.Parse: parseCoreExpr :: String -> Either String CoreExpr
- Agda.Compiler.UHC.Primitives: primFunNm :: String -> HsName
- Agda.Compiler.UHC.Primitives: primFunctions :: Map String ((CompileT TCM) CExpr)
- Agda.Interaction.Imports: AllWarnings :: WhichWarnings
- Agda.Interaction.Imports: ErrorWarnings :: WhichWarnings
- Agda.Interaction.Imports: classifyWarning :: Warning -> WhichWarnings
- Agda.Interaction.Imports: classifyWarnings :: [TCWarning] -> ([TCWarning], [TCWarning])
- Agda.Interaction.Imports: data WhichWarnings
- Agda.Interaction.Imports: instance GHC.Classes.Eq Agda.Interaction.Imports.WhichWarnings
- Agda.Interaction.Imports: instance GHC.Classes.Ord Agda.Interaction.Imports.WhichWarnings
- Agda.Interaction.InteractionTop: GHC :: Backend
- Agda.Interaction.InteractionTop: GHCNoMain :: Backend
- Agda.Interaction.InteractionTop: JS :: Backend
- Agda.Interaction.InteractionTop: data Backend
- Agda.Interaction.InteractionTop: instance GHC.Classes.Eq Agda.Interaction.InteractionTop.Backend
- Agda.Interaction.InteractionTop: instance GHC.Read.Read Agda.Interaction.InteractionTop.Backend
- Agda.Interaction.InteractionTop: instance GHC.Show.Show Agda.Interaction.InteractionTop.Backend
- Agda.Interaction.Library.Parse: stripComments :: String -> String
- Agda.Interaction.Options: [optEpicCompile] :: CommandLineOptions -> Bool
- Agda.Interaction.Options: [optEpicFlags] :: CommandLineOptions -> [String]
- Agda.Interaction.Options: [optGhcCallGhc] :: CommandLineOptions -> Bool
- Agda.Interaction.Options: [optGhcCompile] :: CommandLineOptions -> Bool
- Agda.Interaction.Options: [optGhcFlags] :: CommandLineOptions -> [String]
- Agda.Interaction.Options: [optJSCompile] :: CommandLineOptions -> Bool
- Agda.Interaction.Options: [optUHCBin] :: CommandLineOptions -> Maybe FilePath
- Agda.Interaction.Options: [optUHCCallUHC] :: CommandLineOptions -> Bool
- Agda.Interaction.Options: [optUHCCompile] :: CommandLineOptions -> Bool
- Agda.Interaction.Options: [optUHCFlags] :: CommandLineOptions -> [String]
- Agda.Interaction.Options: [optUHCTextualCore] :: CommandLineOptions -> Bool
- Agda.Interaction.Options: [optUHCTraceLevel] :: CommandLineOptions -> Int
- Agda.Syntax.Abstract: CompiledDeclareDataPragma :: QName -> String -> Pragma
- Agda.Syntax.Abstract: CompiledEpicPragma :: QName -> String -> Pragma
- Agda.Syntax.Common: UnusedArg :: Relevance
- Agda.Syntax.Common: [argInfoOverlappable] :: ArgInfo -> Bool
- Agda.Syntax.Common: irrelevantOrUnused :: Relevance -> Bool
- Agda.Syntax.Common: notHidden :: LensHiding a => a -> Bool
- Agda.Syntax.Concrete: CompiledDeclareDataPragma :: Range -> QName -> String -> Pragma
- Agda.Syntax.Concrete: CompiledEpicPragma :: Range -> QName -> String -> Pragma
- Agda.Syntax.Concrete.Definitions: instance Agda.Utils.Except.Error Agda.Syntax.Concrete.Definitions.DeclarationException
- Agda.Syntax.Concrete.Definitions: type Nice = StateT NiceEnv (Either DeclarationException)
- Agda.Syntax.Concrete.Name: fromTopLevelModuleName :: TopLevelModuleName -> QName
- Agda.Syntax.Concrete.Name: newtype TopLevelModuleName
- Agda.Syntax.Concrete.Operators.Parser: notPlaceholder :: Parser e e
- Agda.Syntax.Concrete.Operators.Parser: sat' :: (e -> Bool) -> Parser e e
- Agda.Syntax.Concrete.Operators.Parser.Monad: annotate :: (Doc -> Doc) -> Parser tok a -> Parser tok a
- Agda.Syntax.Concrete.Operators.Parser.Monad: tok :: (Eq tok, Show tok) => MaybePlaceholder tok -> Parser tok (MaybePlaceholder tok)
- Agda.Syntax.Concrete.Operators.Parser.Monad: token :: Parser tok (MaybePlaceholder tok)
- Agda.Syntax.Concrete.Pretty: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Notation.Notation
- Agda.Syntax.Concrete.Pretty: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Positivity.Occurrence.Occurrence
- Agda.Syntax.Concrete.Pretty: instance Agda.Utils.Pretty.Pretty [Agda.Syntax.Concrete.Declaration]
- Agda.Syntax.Concrete.Pretty: instance Agda.Utils.Pretty.Pretty [Agda.Syntax.Concrete.Pattern]
- Agda.Syntax.Info: instance (GHC.Show.Show Agda.Syntax.Concrete.OpenShortHand, GHC.Show.Show Agda.Syntax.Concrete.ImportDirective) => GHC.Show.Show Agda.Syntax.Info.ModuleInfo
- Agda.Syntax.Internal: [clauseRange] :: Clause -> Range
- Agda.Syntax.Internal: [eqtLevel] :: EqualityView -> Arg Term
- Agda.Syntax.Internal: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Internal.Elim
- Agda.Syntax.Internal.Generic: traverseTerm :: TermLike a => (Term -> Term) -> a -> a
- Agda.Syntax.Internal.Names: namesInFoldable :: (Foldable f, NamesIn a) => f a -> Set QName
- Agda.Syntax.Parser.Lexer: instance GHC.Base.Functor Agda.Syntax.Parser.Lexer.AlexLastAcc
- Agda.Syntax.Parser.Literate: [layerType] :: Layer -> LayerType
- Agda.Syntax.Parser.Literate: data LayerType
- Agda.Syntax.Parser.Literate: instance GHC.Classes.Eq Agda.Syntax.Parser.Literate.LayerType
- Agda.Syntax.Parser.Literate: instance GHC.Show.Show Agda.Syntax.Parser.Literate.LayerType
- Agda.Syntax.Parser.Tokens: KwCOMPILED_DECLARE_DATA :: Keyword
- Agda.Syntax.Parser.Tokens: KwCOMPILED_EPIC :: Keyword
- Agda.Syntax.Position: instance (GHC.Classes.Ord a, Agda.Syntax.Position.KillRange a) => Agda.Syntax.Position.KillRange (Data.Set.Base.Set a)
- Agda.Syntax.Position: instance Agda.Syntax.Position.KillRange a => Agda.Syntax.Position.KillRange (Data.Map.Base.Map k a)
- Agda.Syntax.Scope.Base: ShadowedVar :: Name -> [AbstractName] -> LocalVar
- Agda.Syntax.Scope.Monad: getContextPrecedence :: ScopeM Precedence
- Agda.Syntax.Scope.Monad: setContextPrecedence :: Precedence -> ScopeM ()
- Agda.Syntax.Translation.ConcreteToAbstract: instance Agda.Syntax.Translation.ConcreteToAbstract.PatternVars (Agda.Syntax.Abstract.Pattern' e)
- Agda.Syntax.Translation.ConcreteToAbstract: instance Agda.Syntax.Translation.ConcreteToAbstract.PatternVars a => Agda.Syntax.Translation.ConcreteToAbstract.PatternVars (Agda.Syntax.Common.Arg a)
- Agda.Syntax.Translation.ConcreteToAbstract: instance Agda.Syntax.Translation.ConcreteToAbstract.PatternVars a => Agda.Syntax.Translation.ConcreteToAbstract.PatternVars (Agda.Syntax.Common.Named n a)
- Agda.Syntax.Translation.ConcreteToAbstract: instance Agda.Syntax.Translation.ConcreteToAbstract.PatternVars a => Agda.Syntax.Translation.ConcreteToAbstract.PatternVars (Agda.Syntax.Concrete.FieldAssignment' a)
- Agda.Syntax.Translation.ConcreteToAbstract: instance Agda.Syntax.Translation.ConcreteToAbstract.PatternVars a => Agda.Syntax.Translation.ConcreteToAbstract.PatternVars [a]
- Agda.Syntax.Translation.InternalToAbstract: instance (Agda.TypeChecking.Free.Free i, Agda.Syntax.Translation.InternalToAbstract.Reify i a) => Agda.Syntax.Translation.InternalToAbstract.Reify (Agda.Syntax.Internal.Abs i) (Agda.Syntax.Abstract.Name.Name, a)
- Agda.Syntax.Translation.InternalToAbstract: instance Agda.Syntax.Translation.InternalToAbstract.BlankVars Agda.Syntax.Abstract.Pattern
- Agda.Termination.Monad: ConDBP :: QName -> [DeBruijnPat' a] -> DeBruijnPat' a
- Agda.Termination.Monad: LitDBP :: Literal -> DeBruijnPat' a
- Agda.Termination.Monad: ProjDBP :: ProjOrigin -> QName -> DeBruijnPat' a
- Agda.Termination.Monad: TermDBP :: Term -> DeBruijnPat' a
- Agda.Termination.Monad: VarDBP :: a -> DeBruijnPat' a
- Agda.Termination.Monad: data DeBruijnPat' a
- Agda.Termination.Monad: instance Agda.Syntax.Abstract.Name.IsProjP (Agda.Termination.Monad.DeBruijnPat' a)
- Agda.Termination.Monad: instance Agda.Termination.Monad.UsableSizeVars (Agda.Termination.Monad.Masked Agda.Termination.Monad.DeBruijnPat)
- Agda.Termination.Monad: instance Agda.Termination.Monad.UsableSizeVars Agda.Termination.Monad.DeBruijnPat
- Agda.Termination.Monad: instance Agda.Termination.Monad.UsableSizeVars Agda.Termination.Monad.DeBruijnPats
- Agda.Termination.Monad: instance Agda.Termination.Monad.UsableSizeVars Agda.Termination.Monad.MaskedDeBruijnPats
- Agda.Termination.Monad: instance Agda.TypeChecking.Pretty.PrettyTCM Agda.Termination.Monad.DeBruijnPat
- Agda.Termination.Monad: instance GHC.Base.Functor Agda.Termination.Monad.DeBruijnPat'
- Agda.Termination.Monad: instance GHC.Show.Show a => GHC.Show.Show (Agda.Termination.Monad.DeBruijnPat' a)
- Agda.Termination.Monad: raiseDBP :: Int -> DeBruijnPats -> DeBruijnPats
- Agda.Termination.Monad: type DeBruijnPat = DeBruijnPat' Int
- Agda.Termination.Monad: type DeBruijnPats = [DeBruijnPat]
- Agda.Termination.Monad: type MaskedDeBruijnPats = [Masked DeBruijnPat]
- Agda.Termination.TermCheck: type DeBruijnPat = DeBruijnPat' Int
- Agda.TypeChecking.CompiledClause: data CompiledClauses
- Agda.TypeChecking.CompiledClause: instance Agda.Utils.Pretty.Pretty a => GHC.Show.Show (Agda.TypeChecking.CompiledClause.Case a)
- Agda.TypeChecking.CompiledClause: instance GHC.Base.Monoid c => Data.Semigroup.Semigroup (Agda.TypeChecking.CompiledClause.WithArity c)
- Agda.TypeChecking.CompiledClause: instance GHC.Base.Monoid c => GHC.Base.Monoid (Agda.TypeChecking.CompiledClause.WithArity c)
- Agda.TypeChecking.CompiledClause: instance GHC.Base.Monoid m => Data.Semigroup.Semigroup (Agda.TypeChecking.CompiledClause.Case m)
- Agda.TypeChecking.CompiledClause: instance GHC.Base.Monoid m => GHC.Base.Monoid (Agda.TypeChecking.CompiledClause.Case m)
- Agda.TypeChecking.CompiledClause: instance GHC.Show.Show Agda.TypeChecking.CompiledClause.CompiledClauses
- Agda.TypeChecking.Coverage.Match: instance GHC.Base.Monoid a => Data.Semigroup.Semigroup (Agda.TypeChecking.Coverage.Match.Match a)
- Agda.TypeChecking.Coverage.Match: instance GHC.Base.Monoid a => GHC.Base.Monoid (Agda.TypeChecking.Coverage.Match.Match a)
- Agda.TypeChecking.Coverage.SplitTree: instance GHC.Show.Show a => GHC.Show.Show (Agda.TypeChecking.Coverage.SplitTree.SplitTree' a)
- Agda.TypeChecking.Coverage.SplitTree: instance GHC.Show.Show a => GHC.Show.Show (Agda.TypeChecking.Coverage.SplitTree.SplitTreeLabel a)
- Agda.TypeChecking.Datatypes: IsData :: DataOrRecord
- Agda.TypeChecking.Datatypes: IsRecord :: DataOrRecord
- Agda.TypeChecking.Datatypes: data DataOrRecord
- Agda.TypeChecking.Datatypes: getConstructorArity :: QName -> TCM Nat
- Agda.TypeChecking.Datatypes: instance GHC.Classes.Eq Agda.TypeChecking.Datatypes.DataOrRecord
- Agda.TypeChecking.Datatypes: instance GHC.Classes.Ord Agda.TypeChecking.Datatypes.DataOrRecord
- Agda.TypeChecking.Datatypes: instance GHC.Show.Show Agda.TypeChecking.Datatypes.DataOrRecord
- Agda.TypeChecking.Free: allRelevantOrUnusedVars :: Free' a VarSet => a -> VarSet
- Agda.TypeChecking.Free: allRelevantOrUnusedVarsIgnoring :: Free' a VarSet => IgnoreSorts -> a -> VarSet
- Agda.TypeChecking.Free: class Free' a c
- Agda.TypeChecking.Free: type Free a = Free' a Any
- Agda.TypeChecking.Free: type FreeV a = Free' a FreeVars
- Agda.TypeChecking.Free: type FreeVS a = Free' a VarSet
- Agda.TypeChecking.Free.Lazy: [feBinders] :: FreeEnv c -> !Int
- Agda.TypeChecking.Free.Lazy: class Free' a c
- Agda.TypeChecking.Free.Lazy: instance (Agda.TypeChecking.Free.Lazy.Free' a c, Agda.TypeChecking.Free.Lazy.Free' b c) => Agda.TypeChecking.Free.Lazy.Free' (a, b) c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' Agda.Syntax.Internal.Clause c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' Agda.Syntax.Internal.EqualityView c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' Agda.Syntax.Internal.Level c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' Agda.Syntax.Internal.LevelAtom c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' Agda.Syntax.Internal.PlusLevel c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' Agda.Syntax.Internal.Sort c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' Agda.Syntax.Internal.Term c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' a c => Agda.TypeChecking.Free.Lazy.Free' (Agda.Syntax.Common.Arg a) c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' a c => Agda.TypeChecking.Free.Lazy.Free' (Agda.Syntax.Common.Dom a) c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' a c => Agda.TypeChecking.Free.Lazy.Free' (Agda.Syntax.Internal.Abs a) c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' a c => Agda.TypeChecking.Free.Lazy.Free' (Agda.Syntax.Internal.Elim' a) c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' a c => Agda.TypeChecking.Free.Lazy.Free' (Agda.Syntax.Internal.Tele a) c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' a c => Agda.TypeChecking.Free.Lazy.Free' (Agda.Syntax.Internal.Type' a) c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' a c => Agda.TypeChecking.Free.Lazy.Free' (GHC.Base.Maybe a) c
- Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free' a c => Agda.TypeChecking.Free.Lazy.Free' [a] c
- Agda.TypeChecking.Free.Lazy: instance GHC.Base.Monoid c => Data.Semigroup.Semigroup (Agda.TypeChecking.Free.Lazy.FreeM c)
- Agda.TypeChecking.Free.Lazy: instance GHC.Base.Monoid c => GHC.Base.Monoid (Agda.TypeChecking.Free.Lazy.FreeM c)
- Agda.TypeChecking.Monad.Base: CantSplit :: QName -> Telescope -> Args -> Args -> SplitError
- Agda.TypeChecking.Monad.Base: CompiledRep :: Maybe HaskellRepresentation -> Maybe HaskellExport -> Maybe EpicCode -> Maybe JSCode -> Maybe CoreRepresentation -> CompiledRepresentation
- Agda.TypeChecking.Monad.Base: CoverageCantSplitIrrelevantType :: Type -> TypeError
- Agda.TypeChecking.Monad.Base: CoverageCantSplitOn :: QName -> Telescope -> Args -> Args -> TypeError
- Agda.TypeChecking.Monad.Base: CoverageCantSplitType :: Type -> TypeError
- Agda.TypeChecking.Monad.Base: CoverageFailure :: QName -> [[NamedArg DeBruijnPattern]] -> TypeError
- Agda.TypeChecking.Monad.Base: CrConstr :: CoreConstr -> CoreRepresentation
- Agda.TypeChecking.Monad.Base: CrDefn :: CoreExpr -> CoreRepresentation
- Agda.TypeChecking.Monad.Base: CrType :: CoreType -> CoreRepresentation
- Agda.TypeChecking.Monad.Base: HeterogeneousEquality :: Term -> Type -> Term -> Type -> TypeError
- Agda.TypeChecking.Monad.Base: HsDefn :: HaskellType -> HaskellCode -> HaskellRepresentation
- Agda.TypeChecking.Monad.Base: HsExport :: HaskellType -> String -> HaskellExport
- Agda.TypeChecking.Monad.Base: HsType :: HaskellType -> HaskellRepresentation
- Agda.TypeChecking.Monad.Base: IncompletePatternMatching :: Term -> [Elim] -> TypeError
- Agda.TypeChecking.Monad.Base: IndexVariablesNotDistinct :: [Nat] -> [Arg Term] -> TypeError
- Agda.TypeChecking.Monad.Base: IndicesFreeInParameters :: [Nat] -> [Arg Term] -> [Arg Term] -> TypeError
- Agda.TypeChecking.Monad.Base: IndicesNotConstructorApplications :: [Arg Term] -> TypeError
- Agda.TypeChecking.Monad.Base: NotInductive :: Term -> TypeError
- Agda.TypeChecking.Monad.Base: OperatorChangeMessage :: TypeError -> TypeError
- Agda.TypeChecking.Monad.Base: UnificationRecursiveEq :: Type -> Int -> Term -> TypeError
- Agda.TypeChecking.Monad.Base: WithoutKError :: Type -> Term -> Term -> TypeError
- Agda.TypeChecking.Monad.Base: [compiledCore] :: CompiledRepresentation -> Maybe CoreRepresentation
- Agda.TypeChecking.Monad.Base: [compiledEpic] :: CompiledRepresentation -> Maybe EpicCode
- Agda.TypeChecking.Monad.Base: [compiledHaskell] :: CompiledRepresentation -> Maybe HaskellRepresentation
- Agda.TypeChecking.Monad.Base: [compiledJS] :: CompiledRepresentation -> Maybe JSCode
- Agda.TypeChecking.Monad.Base: [exportHaskell] :: CompiledRepresentation -> Maybe HaskellExport
- Agda.TypeChecking.Monad.Base: [iHaskellCode] :: Interface -> [String]
- Agda.TypeChecking.Monad.Base: [iHaskellImportsUHC] :: Interface -> Set String
- Agda.TypeChecking.Monad.Base: [iHaskellImports] :: Interface -> Set String
- Agda.TypeChecking.Monad.Base: [recRecursive] :: Defn -> Bool
- Agda.TypeChecking.Monad.Base: [stPostSolvedInteractionPoints] :: PostScopeState -> !InteractionPoints
- Agda.TypeChecking.Monad.Base: [stPreHaskellCode] :: PreScopeState -> ![String]
- Agda.TypeChecking.Monad.Base: [stPreHaskellImportsUHC] :: PreScopeState -> !(Set String)
- Agda.TypeChecking.Monad.Base: [stPreHaskellImports] :: PreScopeState -> !(Set String)
- Agda.TypeChecking.Monad.Base: [tcWarningClosure] :: TCWarning -> Closure Warning
- Agda.TypeChecking.Monad.Base: [tcWarningState] :: TCWarning -> TCState
- Agda.TypeChecking.Monad.Base: data CompiledRepresentation
- Agda.TypeChecking.Monad.Base: data CoreRepresentation
- Agda.TypeChecking.Monad.Base: data HaskellExport
- Agda.TypeChecking.Monad.Base: data HaskellRepresentation
- Agda.TypeChecking.Monad.Base: data Section
- Agda.TypeChecking.Monad.Base: defCoreDef :: Definition -> Maybe CoreRepresentation
- Agda.TypeChecking.Monad.Base: defEpicDef :: Definition -> Maybe EpicCode
- Agda.TypeChecking.Monad.Base: defJSDef :: Definition -> Maybe JSCode
- Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Free.Lazy.Free' Agda.TypeChecking.Monad.Base.Candidate c
- Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Free.Lazy.Free' Agda.TypeChecking.Monad.Base.Constraint c
- Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Free.Lazy.Free' Agda.TypeChecking.Monad.Base.DisplayForm c
- Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Free.Lazy.Free' Agda.TypeChecking.Monad.Base.DisplayTerm c
- Agda.TypeChecking.Monad.Base: instance Agda.Utils.Except.Error Agda.TypeChecking.Monad.Base.SplitError
- Agda.TypeChecking.Monad.Base: instance Agda.Utils.Except.Error Agda.TypeChecking.Monad.Base.UnquoteError
- Agda.TypeChecking.Monad.Base: instance GHC.Show.Show Agda.TypeChecking.Monad.Base.CompiledRepresentation
- Agda.TypeChecking.Monad.Base: instance GHC.Show.Show Agda.TypeChecking.Monad.Base.CoreRepresentation
- Agda.TypeChecking.Monad.Base: instance GHC.Show.Show Agda.TypeChecking.Monad.Base.HaskellExport
- Agda.TypeChecking.Monad.Base: instance GHC.Show.Show Agda.TypeChecking.Monad.Base.HaskellRepresentation
- Agda.TypeChecking.Monad.Base: runPM :: PM a -> TCM a
- Agda.TypeChecking.Monad.Base: stHaskellCode :: Lens' [String] TCState
- Agda.TypeChecking.Monad.Base: stHaskellImports :: Lens' (Set String) TCState
- Agda.TypeChecking.Monad.Base: stHaskellImportsUHC :: Lens' (Set String) TCState
- Agda.TypeChecking.Monad.Base: stSolvedInteractionPoints :: Lens' InteractionPoints TCState
- Agda.TypeChecking.Monad.Base: tcWarning :: TCWarning -> Warning
- Agda.TypeChecking.Monad.Base: type EpicCode = String
- Agda.TypeChecking.Monad.Base: type HaskellCode = String
- Agda.TypeChecking.Monad.Base: type HaskellType = String
- Agda.TypeChecking.Monad.Base: type JSCode = String
- Agda.TypeChecking.Monad.Base: warning :: MonadTCM tcm => Warning -> tcm ()
- Agda.TypeChecking.Monad.Base: warning_ :: MonadTCM tcm => Warning -> tcm TCWarning
- Agda.TypeChecking.Monad.Constraints: currentProblem :: TCM ProblemId
- Agda.TypeChecking.Monad.Exception: ExceptionT :: m (Either err a) -> ExceptionT err m a
- Agda.TypeChecking.Monad.Exception: [runExceptionT] :: ExceptionT err m a -> m (Either err a)
- Agda.TypeChecking.Monad.Exception: catchException :: MonadException err m => m a -> (err -> m a) -> m a
- Agda.TypeChecking.Monad.Exception: class Error err => MonadException err m | m -> err
- Agda.TypeChecking.Monad.Exception: instance (Agda.Utils.Except.Error err, Agda.TypeChecking.Monad.Base.MonadTCM tcm) => Agda.TypeChecking.Monad.Base.MonadTCM (Agda.TypeChecking.Monad.Exception.ExceptionT err tcm)
- Agda.TypeChecking.Monad.Exception: instance (Agda.Utils.Except.Error err, Control.Monad.Error.Class.MonadError err' m) => Control.Monad.Error.Class.MonadError err' (Agda.TypeChecking.Monad.Exception.ExceptionT err m)
- Agda.TypeChecking.Monad.Exception: instance (Agda.Utils.Except.Error err, Control.Monad.IO.Class.MonadIO m) => Control.Monad.IO.Class.MonadIO (Agda.TypeChecking.Monad.Exception.ExceptionT err m)
- Agda.TypeChecking.Monad.Exception: instance (Agda.Utils.Except.Error err, Control.Monad.Reader.Class.MonadReader r m) => Control.Monad.Reader.Class.MonadReader r (Agda.TypeChecking.Monad.Exception.ExceptionT err m)
- Agda.TypeChecking.Monad.Exception: instance (Agda.Utils.Except.Error err, Control.Monad.State.Class.MonadState s m) => Control.Monad.State.Class.MonadState s (Agda.TypeChecking.Monad.Exception.ExceptionT err m)
- Agda.TypeChecking.Monad.Exception: instance (Agda.Utils.Except.Error err, GHC.Base.Applicative m, GHC.Base.Monad m) => GHC.Base.Applicative (Agda.TypeChecking.Monad.Exception.ExceptionT err m)
- Agda.TypeChecking.Monad.Exception: instance (GHC.Base.Monad m, Agda.TypeChecking.Monad.Exception.MonadException err m) => Agda.TypeChecking.Monad.Exception.MonadException err (Control.Monad.Trans.Reader.ReaderT r m)
- Agda.TypeChecking.Monad.Exception: instance (GHC.Base.Monad m, Agda.TypeChecking.Monad.Exception.MonadException err m) => Agda.TypeChecking.Monad.Exception.MonadException err (Control.Monad.Trans.State.Lazy.StateT s m)
- Agda.TypeChecking.Monad.Exception: instance (GHC.Base.Monad m, Agda.TypeChecking.Monad.Exception.MonadException err m, GHC.Base.Monoid w) => Agda.TypeChecking.Monad.Exception.MonadException err (Control.Monad.Trans.Writer.Lazy.WriterT w m)
- Agda.TypeChecking.Monad.Exception: instance (GHC.Base.Monad m, Agda.Utils.Except.Error err) => Agda.TypeChecking.Monad.Exception.MonadException err (Agda.TypeChecking.Monad.Exception.ExceptionT err m)
- Agda.TypeChecking.Monad.Exception: instance (GHC.Base.Monad m, Agda.Utils.Except.Error err) => GHC.Base.Monad (Agda.TypeChecking.Monad.Exception.ExceptionT err m)
- Agda.TypeChecking.Monad.Exception: instance Control.Monad.Trans.Class.MonadTrans (Agda.TypeChecking.Monad.Exception.ExceptionT err)
- Agda.TypeChecking.Monad.Exception: instance GHC.Base.Functor f => GHC.Base.Functor (Agda.TypeChecking.Monad.Exception.ExceptionT err f)
- Agda.TypeChecking.Monad.Exception: newtype ExceptionT err m a
- Agda.TypeChecking.Monad.Exception: throwException :: MonadException err m => err -> m a
- Agda.TypeChecking.Monad.Options: class (Functor m, Applicative m, Monad m) => HasOptions m
- Agda.TypeChecking.Monad.Options: commandLineOptions :: HasOptions m => m CommandLineOptions
- Agda.TypeChecking.Monad.Options: displayDebugMessage :: MonadTCM tcm => Int -> String -> tcm ()
- Agda.TypeChecking.Monad.Options: instance Control.Monad.IO.Class.MonadIO m => Agda.TypeChecking.Monad.Options.HasOptions (Agda.TypeChecking.Monad.Base.TCMT m)
- Agda.TypeChecking.Monad.Options: pragmaOptions :: HasOptions m => m PragmaOptions
- Agda.TypeChecking.Monad.Options: reportS :: MonadTCM tcm => VerboseKey -> Int -> String -> tcm ()
- Agda.TypeChecking.Monad.Options: reportSDoc :: MonadTCM tcm => VerboseKey -> Int -> TCM Doc -> tcm ()
- Agda.TypeChecking.Monad.Options: reportSLn :: MonadTCM tcm => VerboseKey -> Int -> String -> tcm ()
- Agda.TypeChecking.Monad.Options: verboseBracket :: MonadTCM tcm => VerboseKey -> Int -> String -> TCM a -> tcm a
- Agda.TypeChecking.Monad.Signature: addCoreConstr :: QName -> CoreConstr -> TCM ()
- Agda.TypeChecking.Monad.Signature: addEpicCode :: QName -> EpicCode -> TCM ()
- Agda.TypeChecking.Monad.Signature: ensureNoCompiledHaskell :: QName -> TCM ()
- Agda.TypeChecking.Monad.Signature: instance (Agda.TypeChecking.Monad.Signature.HasConstInfo m, Agda.Utils.Except.Error err) => Agda.TypeChecking.Monad.Signature.HasConstInfo (Agda.TypeChecking.Monad.Exception.ExceptionT err m)
- Agda.TypeChecking.Monad.Signature: sortOfConst :: QName -> TCM Sort
- Agda.TypeChecking.Monad.State: getHaskellImports :: TCM (Set String)
- Agda.TypeChecking.Monad.State: getHaskellImportsUHC :: TCM (Set String)
- Agda.TypeChecking.Polarity: mkUnused :: Relevance -> Relevance
- Agda.TypeChecking.Polarity: nonvariantToUnusedArg :: [Polarity] -> Type -> TCM Type
- Agda.TypeChecking.Polarity: nonvariantToUnusedArgInClause :: [Polarity] -> Clause -> Clause
- Agda.TypeChecking.Polarity: nonvariantToUnusedArgInDef :: [Polarity] -> Defn -> Defn
- Agda.TypeChecking.Positivity: etaExpandClause :: Nat -> Clause -> Clause
- Agda.TypeChecking.Positivity: instance GHC.Show.Show Agda.TypeChecking.Positivity.Node
- Agda.TypeChecking.Pretty: instance (Agda.TypeChecking.Pretty.PrettyTCM k, Agda.TypeChecking.Pretty.PrettyTCM v) => Agda.TypeChecking.Pretty.PrettyTCM (Data.Map.Base.Map k v)
- Agda.TypeChecking.Pretty: instance (GHC.Show.Show a, Agda.TypeChecking.Pretty.PrettyTCM a, Agda.TypeChecking.Substitute.Class.Subst a a) => Agda.TypeChecking.Pretty.PrettyTCM (Agda.Syntax.Internal.Substitution' a)
- Agda.TypeChecking.Pretty: raisePatVars :: Int -> NLPat -> NLPat
- Agda.TypeChecking.Pretty: raisePatVarsInType :: Int -> NLPType -> NLPType
- Agda.TypeChecking.Records: recRecursive_ :: Defn -> Bool
- Agda.TypeChecking.Reduce: instance Agda.TypeChecking.Reduce.Instantiate e => Agda.TypeChecking.Reduce.Instantiate (Data.Map.Base.Map k e)
- Agda.TypeChecking.Reduce: instance Agda.TypeChecking.Reduce.InstantiateFull e => Agda.TypeChecking.Reduce.InstantiateFull (Data.Map.Base.Map k e)
- Agda.TypeChecking.Reduce: instance Agda.TypeChecking.Reduce.Normalise e => Agda.TypeChecking.Reduce.Normalise (Data.Map.Base.Map k e)
- Agda.TypeChecking.Reduce: instance Agda.TypeChecking.Reduce.Reduce e => Agda.TypeChecking.Reduce.Reduce (Data.Map.Base.Map k e)
- Agda.TypeChecking.Reduce: instance Agda.TypeChecking.Reduce.Simplify e => Agda.TypeChecking.Reduce.Simplify (Data.Map.Base.Map k e)
- Agda.TypeChecking.Reduce.Monad: instance Agda.TypeChecking.Monad.Options.HasOptions Agda.TypeChecking.Monad.Base.ReduceM
- Agda.TypeChecking.Reduce.Monad: traceSDoc :: VerboseKey -> Int -> TCM Doc -> ReduceM a -> ReduceM a
- Agda.TypeChecking.Reduce.Monad: traceSLn :: HasOptions m => VerboseKey -> Int -> String -> m a -> m a
- Agda.TypeChecking.Rewriting: class KillCtxId a
- Agda.TypeChecking.Rewriting: instance (GHC.Base.Functor f, Agda.TypeChecking.Rewriting.KillCtxId a) => Agda.TypeChecking.Rewriting.KillCtxId (f a)
- Agda.TypeChecking.Rewriting: instance Agda.TypeChecking.Free.Lazy.Free' Agda.TypeChecking.Monad.Base.NLPType c
- Agda.TypeChecking.Rewriting: instance Agda.TypeChecking.Free.Lazy.Free' Agda.TypeChecking.Monad.Base.NLPat c
- Agda.TypeChecking.Rewriting: instance Agda.TypeChecking.Rewriting.KillCtxId Agda.TypeChecking.Monad.Base.NLPType
- Agda.TypeChecking.Rewriting: instance Agda.TypeChecking.Rewriting.KillCtxId Agda.TypeChecking.Monad.Base.NLPat
- Agda.TypeChecking.Rewriting: instance Agda.TypeChecking.Rewriting.KillCtxId Agda.TypeChecking.Monad.Base.RewriteRule
- Agda.TypeChecking.Rewriting: killCtxId :: KillCtxId a => a -> a
- Agda.TypeChecking.Rewriting: rebindLocalRewriteRules :: TCM ()
- Agda.TypeChecking.Rewriting.NonLinMatch: class RaiseNLP a where raiseNLP = raiseNLPFrom 0
- Agda.TypeChecking.Rewriting.NonLinMatch: instance (Agda.TypeChecking.Rewriting.NonLinMatch.Match a b, Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP a, Agda.TypeChecking.Substitute.Class.Subst t2 b) => Agda.TypeChecking.Rewriting.NonLinMatch.Match (Agda.Syntax.Internal.Abs a) (Agda.Syntax.Internal.Abs b)
- Agda.TypeChecking.Rewriting.NonLinMatch: instance Agda.TypeChecking.Monad.Options.HasOptions Agda.TypeChecking.Rewriting.NonLinMatch.NLM
- Agda.TypeChecking.Rewriting.NonLinMatch: instance Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP Agda.TypeChecking.Monad.Base.NLPType
- Agda.TypeChecking.Rewriting.NonLinMatch: instance Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP Agda.TypeChecking.Monad.Base.NLPat
- Agda.TypeChecking.Rewriting.NonLinMatch: instance Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP a => Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP (Agda.Syntax.Common.Arg a)
- Agda.TypeChecking.Rewriting.NonLinMatch: instance Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP a => Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP (Agda.Syntax.Common.Dom a)
- Agda.TypeChecking.Rewriting.NonLinMatch: instance Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP a => Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP (Agda.Syntax.Internal.Abs a)
- Agda.TypeChecking.Rewriting.NonLinMatch: instance Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP a => Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP (Agda.Syntax.Internal.Elim' a)
- Agda.TypeChecking.Rewriting.NonLinMatch: instance Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP a => Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP (GHC.Base.Maybe a)
- Agda.TypeChecking.Rewriting.NonLinMatch: instance Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP a => Agda.TypeChecking.Rewriting.NonLinMatch.RaiseNLP [a]
- Agda.TypeChecking.Rewriting.NonLinMatch: raiseNLP :: RaiseNLP a => Int -> a -> a
- Agda.TypeChecking.Rewriting.NonLinMatch: raiseNLPFrom :: RaiseNLP a => Int -> Int -> a -> a
- Agda.TypeChecking.Rewriting.NonLinMatch: traceSDocNLM :: VerboseKey -> Int -> TCM Doc -> NLM a -> NLM a
- Agda.TypeChecking.Rules.Def: containsAbsurdPattern :: Pattern -> Bool
- Agda.TypeChecking.Rules.LHS.AsPatterns: instance Agda.TypeChecking.Pretty.PrettyTCM Agda.TypeChecking.Rules.LHS.AsPatterns.ElimType
- Agda.TypeChecking.Rules.LHS.Problem: defaultFlexibleVar :: a -> FlexibleVar a
- Agda.TypeChecking.Rules.LHS.Problem: flexibleVarFromHiding :: Hiding -> a -> FlexibleVar a
- Agda.TypeChecking.Rules.LHS.Unify: unifyIndices_ :: MonadTCM tcm => Telescope -> FlexibleVars -> Type -> Args -> Args -> tcm (Telescope, PatternSubstitution, [NamedArg DeBruijnPattern])
- Agda.TypeChecking.Serialise.Base: icode0 :: Int32 -> S Int32
- Agda.TypeChecking.Serialise.Base: icode0' :: S Int32
- Agda.TypeChecking.Serialise.Base: icode1 :: EmbPrj a => Int32 -> a -> S Int32
- Agda.TypeChecking.Serialise.Base: icode1' :: EmbPrj a => a -> S Int32
- Agda.TypeChecking.Serialise.Base: icode10 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j) => Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> S Int32
- Agda.TypeChecking.Serialise.Base: icode10' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j) => a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> S Int32
- Agda.TypeChecking.Serialise.Base: icode11 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k) => Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> S Int32
- Agda.TypeChecking.Serialise.Base: icode11' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k) => a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> S Int32
- Agda.TypeChecking.Serialise.Base: icode12 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l) => Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> S Int32
- Agda.TypeChecking.Serialise.Base: icode12' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l) => a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> S Int32
- Agda.TypeChecking.Serialise.Base: icode13 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l, EmbPrj m) => Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> S Int32
- Agda.TypeChecking.Serialise.Base: icode13' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l, EmbPrj m) => a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> S Int32
- Agda.TypeChecking.Serialise.Base: icode14 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l, EmbPrj m, EmbPrj n) => Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n -> S Int32
- Agda.TypeChecking.Serialise.Base: icode14' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l, EmbPrj m, EmbPrj n) => a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n -> S Int32
- Agda.TypeChecking.Serialise.Base: icode15 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l, EmbPrj m, EmbPrj n, EmbPrj o) => Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n -> o -> S Int32
- Agda.TypeChecking.Serialise.Base: icode2 :: (EmbPrj a, EmbPrj b) => Int32 -> a -> b -> S Int32
- Agda.TypeChecking.Serialise.Base: icode2' :: (EmbPrj a, EmbPrj b) => a -> b -> S Int32
- Agda.TypeChecking.Serialise.Base: icode3 :: (EmbPrj a, EmbPrj b, EmbPrj c) => Int32 -> a -> b -> c -> S Int32
- Agda.TypeChecking.Serialise.Base: icode3' :: (EmbPrj a, EmbPrj b, EmbPrj c) => a -> b -> c -> S Int32
- Agda.TypeChecking.Serialise.Base: icode4 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d) => Int32 -> a -> b -> c -> d -> S Int32
- Agda.TypeChecking.Serialise.Base: icode4' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d) => a -> b -> c -> d -> S Int32
- Agda.TypeChecking.Serialise.Base: icode5 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e) => Int32 -> a -> b -> c -> d -> e -> S Int32
- Agda.TypeChecking.Serialise.Base: icode5' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e) => a -> b -> c -> d -> e -> S Int32
- Agda.TypeChecking.Serialise.Base: icode6 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f) => Int32 -> a -> b -> c -> d -> e -> f -> S Int32
- Agda.TypeChecking.Serialise.Base: icode6' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f) => a -> b -> c -> d -> e -> f -> S Int32
- Agda.TypeChecking.Serialise.Base: icode7 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g) => Int32 -> a -> b -> c -> d -> e -> f -> g -> S Int32
- Agda.TypeChecking.Serialise.Base: icode7' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g) => a -> b -> c -> d -> e -> f -> g -> S Int32
- Agda.TypeChecking.Serialise.Base: icode8 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h) => Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> S Int32
- Agda.TypeChecking.Serialise.Base: icode8' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h) => a -> b -> c -> d -> e -> f -> g -> h -> S Int32
- Agda.TypeChecking.Serialise.Base: icode9 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i) => Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> S Int32
- Agda.TypeChecking.Serialise.Base: icode9' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i) => a -> b -> c -> d -> e -> f -> g -> h -> i -> S Int32
- Agda.TypeChecking.Serialise.Base: valu0 :: a -> R a
- Agda.TypeChecking.Serialise.Base: valu1 :: EmbPrj a => (a -> b) -> Int32 -> R b
- Agda.TypeChecking.Serialise.Base: valu10 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j) => (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k) -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> R k
- Agda.TypeChecking.Serialise.Base: valu11 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k) => (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l) -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> R l
- Agda.TypeChecking.Serialise.Base: valu12 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l) => (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m) -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> R m
- Agda.TypeChecking.Serialise.Base: valu13 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l, EmbPrj m) => (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n) -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> R n
- Agda.TypeChecking.Serialise.Base: valu14 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l, EmbPrj m, EmbPrj n) => (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n -> o) -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> R o
- Agda.TypeChecking.Serialise.Base: valu15 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l, EmbPrj m, EmbPrj n, EmbPrj o) => (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n -> o -> p) -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> R p
- Agda.TypeChecking.Serialise.Base: valu2 :: (EmbPrj a, EmbPrj b) => (a -> b -> c) -> Int32 -> Int32 -> R c
- Agda.TypeChecking.Serialise.Base: valu3 :: (EmbPrj a, EmbPrj b, EmbPrj c) => (a -> b -> c -> d) -> Int32 -> Int32 -> Int32 -> R d
- Agda.TypeChecking.Serialise.Base: valu4 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d) => (a -> b -> c -> d -> e) -> Int32 -> Int32 -> Int32 -> Int32 -> R e
- Agda.TypeChecking.Serialise.Base: valu5 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e) => (a -> b -> c -> d -> e -> f) -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> R f
- Agda.TypeChecking.Serialise.Base: valu6 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f) => (a -> b -> c -> d -> e -> f -> g) -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> R g
- Agda.TypeChecking.Serialise.Base: valu7 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g) => (a -> b -> c -> d -> e -> f -> g -> h) -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> R h
- Agda.TypeChecking.Serialise.Base: valu8 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h) => (a -> b -> c -> d -> e -> f -> g -> h -> i) -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> R i
- Agda.TypeChecking.Serialise.Base: valu9 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f, EmbPrj g, EmbPrj h, EmbPrj i) => (a -> b -> c -> d -> e -> f -> g -> h -> i -> j) -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> R j
- Agda.TypeChecking.Serialise.Instances.Common: instance (GHC.Classes.Ord a, Agda.TypeChecking.Serialise.Base.EmbPrj a) => Agda.TypeChecking.Serialise.Base.EmbPrj (Data.Set.Base.Set a)
- Agda.TypeChecking.Serialise.Instances.Common: instance (GHC.Classes.Ord a, Agda.TypeChecking.Serialise.Base.EmbPrj a, Agda.TypeChecking.Serialise.Base.EmbPrj b) => Agda.TypeChecking.Serialise.Base.EmbPrj (Data.Map.Base.Map a b)
- Agda.TypeChecking.Serialise.Instances.Common: instance Agda.TypeChecking.Serialise.Base.EmbPrj a => Agda.TypeChecking.Serialise.Base.EmbPrj (Data.Sequence.Seq a)
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Compiler.Epic.Interface.EInterface
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Compiler.Epic.Interface.Forced
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Compiler.Epic.Interface.InjectiveFun
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Compiler.Epic.Interface.Relevance
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Compiler.Epic.Interface.Tag
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Compiler.JS.Syntax.Exp
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Compiler.JS.Syntax.GlobalId
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Compiler.JS.Syntax.LocalId
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Compiler.JS.Syntax.MemberId
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Compiler.UHC.Bridge.HsName
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Compiler.UHC.Pragmas.Base.CoreConstr
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Compiler.UHC.Pragmas.Base.CoreType
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.TypeChecking.Monad.Base.CompiledRepresentation
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.TypeChecking.Monad.Base.CoreRepresentation
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.TypeChecking.Monad.Base.HaskellExport
- Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.TypeChecking.Monad.Base.HaskellRepresentation
- Agda.TypeChecking.SizedTypes.Syntax: instance (GHC.Show.Show r, GHC.Show.Show f) => GHC.Show.Show (Agda.TypeChecking.SizedTypes.Syntax.Constraint' r f)
- Agda.TypeChecking.SizedTypes.Syntax: instance (GHC.Show.Show r, GHC.Show.Show f) => GHC.Show.Show (Agda.TypeChecking.SizedTypes.Syntax.SizeExpr' r f)
- Agda.TypeChecking.SizedTypes.Syntax: instance Agda.TypeChecking.SizedTypes.Syntax.Substitute r f a => Agda.TypeChecking.SizedTypes.Syntax.Substitute r f (Data.Map.Base.Map k a)
- Agda.TypeChecking.SizedTypes.Syntax: instance GHC.Show.Show Agda.TypeChecking.SizedTypes.Syntax.Polarity
- Agda.TypeChecking.SizedTypes.Syntax: instance GHC.Show.Show flex => GHC.Show.Show (Agda.TypeChecking.SizedTypes.Syntax.PolarityAssignment flex)
- Agda.TypeChecking.SizedTypes.Syntax: type Solution rigid flex = Map flex (SizeExpr' rigid flex)
- Agda.TypeChecking.SizedTypes.WarshallSolver: instance (GHC.Show.Show rigid, GHC.Show.Show flex) => GHC.Show.Show (Agda.TypeChecking.SizedTypes.WarshallSolver.Node rigid flex)
- Agda.TypeChecking.Substitute: instance (GHC.Classes.Ord k, Agda.TypeChecking.Substitute.Class.Subst t a) => Agda.TypeChecking.Substitute.Class.Subst t (Data.Map.Base.Map k a)
- Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.Class.Abstract v => Agda.TypeChecking.Substitute.Class.Abstract (Data.Map.Base.Map k v)
- Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.Class.Apply v => Agda.TypeChecking.Substitute.Class.Apply (Data.Map.Base.Map k v)
- Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.Class.Subst Agda.Syntax.Internal.Term Agda.TypeChecking.Monad.Base.NLPType
- Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.Class.Subst Agda.Syntax.Internal.Term Agda.TypeChecking.Monad.Base.NLPat
- Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.Class.Subst Agda.Syntax.Internal.Term Agda.TypeChecking.Monad.Base.RewriteRule
- Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.TeleNoAbs Agda.TypeChecking.Substitute.ListTel
- Agda.TypeChecking.Substitute: telFromList :: ListTel -> Telescope
- Agda.TypeChecking.Substitute: telFromList' :: (a -> ArgName) -> ListTel' a -> Telescope
- Agda.TypeChecking.Substitute: telToArgs :: Telescope -> [Arg ArgName]
- Agda.TypeChecking.Substitute: telToList :: Telescope -> ListTel
- Agda.TypeChecking.Substitute: type ListTel = ListTel' ArgName
- Agda.TypeChecking.Substitute: type ListTel' a = [Dom (a, Type)]
- Agda.TypeChecking.Telescope: intro1 :: (MonadTCM tcm) => Type -> (Type -> tcm a) -> tcm a
- Agda.Utils.Maybe: allJustsOrNothings :: [Maybe a] -> Maybe (Maybe [a])
- Agda.Utils.Maybe.Strict: instance GHC.Base.Monoid a => Data.Semigroup.Semigroup (Data.Strict.Maybe.Maybe a)
- Agda.Utils.Maybe.Strict: instance GHC.Base.Monoid a => GHC.Base.Monoid (Data.Strict.Maybe.Maybe a)
- Agda.Utils.Monad: modify' :: MonadState s m => (s -> s) -> m ()
- Agda.Utils.Monad: thread :: (a -> Cont r b) -> [a] -> Cont r [b]
- Agda.Utils.Monad: type Cont r a = (a -> r) -> r
- Agda.Utils.Monad: unless_ :: Monad m => Bool -> m a -> m ()
- Agda.Utils.Monad: when_ :: Monad m => Bool -> m a -> m ()
- Agda.Utils.Monad: zipWithM' :: Monad m => (a -> b -> m c) -> [a] -> [b] -> m [c]
- Agda.Utils.Null: instance Agda.Utils.Null.Null (Data.IntMap.Base.IntMap a)
- Agda.Utils.Null: instance Agda.Utils.Null.Null (Data.Map.Base.Map k a)
- Agda.Utils.Null: instance Agda.Utils.Null.Null (Data.Sequence.Seq a)
- Agda.Utils.Null: instance Agda.Utils.Null.Null (Data.Set.Base.Set a)
- Agda.Utils.Null: instance Agda.Utils.Null.Null Data.IntSet.Base.IntSet
- Agda.Utils.PartialOrd: instance GHC.Classes.Ord a => Agda.Utils.PartialOrd.PartialOrd (Agda.Utils.PartialOrd.Inclusion (Data.Set.Base.Set a))
- Agda.Utils.Permutation: instance Agda.Utils.Permutation.InversePermute [GHC.Base.Maybe a] (Data.IntMap.Base.IntMap a)
- Agda.Utils.Pretty: instance Agda.Utils.Pretty.Pretty GHC.Base.String
- Agda.Utils.Singleton: instance Agda.Utils.Singleton.Singleton (GHC.Types.Int, a) (Data.IntMap.Base.IntMap a)
- Agda.Utils.Singleton: instance Agda.Utils.Singleton.Singleton (k, a) (Data.Map.Base.Map k a)
- Agda.Utils.Singleton: instance Agda.Utils.Singleton.Singleton GHC.Types.Int Data.IntSet.Base.IntSet
- Agda.Utils.Singleton: instance Agda.Utils.Singleton.Singleton a (Data.Sequence.Seq a)
- Agda.Utils.Singleton: instance Agda.Utils.Singleton.Singleton a (Data.Set.Base.Set a)
- Agda.Utils.Size: instance Agda.Utils.Size.Sized (Data.IntMap.Base.IntMap a)
- Agda.Utils.Size: instance Agda.Utils.Size.Sized (Data.Map.Base.Map k a)
- Agda.Utils.Size: instance Agda.Utils.Size.Sized (Data.Sequence.Seq a)
- Agda.Utils.Size: instance Agda.Utils.Size.Sized (Data.Set.Base.Set a)
- Agda.Utils.Size: instance Agda.Utils.Size.Sized Data.IntSet.Base.IntSet
+ Agda.Auto.Auto: AutoResult :: AutoProgress -> Maybe String -> AutoResult
+ Agda.Auto.Auto: FunClauses :: [String] -> AutoProgress
+ Agda.Auto.Auto: Refinement :: String -> AutoProgress
+ Agda.Auto.Auto: Solutions :: [(InteractionId, String)] -> AutoProgress
+ Agda.Auto.Auto: [autoMessage] :: AutoResult -> Maybe String
+ Agda.Auto.Auto: [autoProgress] :: AutoResult -> AutoProgress
+ Agda.Auto.Auto: data AutoProgress
+ Agda.Auto.Auto: data AutoResult
+ Agda.Auto.CaseSplit: class Lift t
+ Agda.Auto.CaseSplit: class LocalTerminationEnv a
+ Agda.Auto.CaseSplit: class Replace o t u | t u -> o
+ Agda.Auto.CaseSplit: class Unify o t | t -> o
+ Agda.Auto.CaseSplit: instance (Agda.Auto.CaseSplit.LocalTerminationEnv a, Agda.Auto.CaseSplit.LocalTerminationEnv b) => Agda.Auto.CaseSplit.LocalTerminationEnv (a, b)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.Lift (Agda.Auto.Syntax.ArgList o)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.Lift (Agda.Auto.Syntax.Exp o)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.Lift t => Agda.Auto.CaseSplit.Lift (Agda.Auto.NarrowingSearch.MM t r)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.Lift t => Agda.Auto.CaseSplit.Lift (Agda.Auto.Syntax.Abs t)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.LocalTerminationEnv (Agda.Auto.CaseSplit.CSPatI o)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.LocalTerminationEnv (Agda.Auto.Syntax.MArgList o)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.LocalTerminationEnv (Agda.Auto.Syntax.MExp o)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.LocalTerminationEnv a => Agda.Auto.CaseSplit.LocalTerminationEnv (Agda.Auto.CaseSplit.HI a)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.LocalTerminationEnv a => Agda.Auto.CaseSplit.LocalTerminationEnv [a]
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.Replace o (Agda.Auto.Syntax.ArgList o) (Agda.Auto.Syntax.ArgList o)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.Replace o (Agda.Auto.Syntax.Exp o) (Agda.Auto.Syntax.MExp o)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.Replace o t u => Agda.Auto.CaseSplit.Replace o (Agda.Auto.NarrowingSearch.MM t (Agda.Auto.Syntax.RefInfo o)) u
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.Replace o t u => Agda.Auto.CaseSplit.Replace o (Agda.Auto.Syntax.Abs t) (Agda.Auto.Syntax.Abs u)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.Unify o (Agda.Auto.Syntax.ArgList o)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.Unify o (Agda.Auto.Syntax.Exp o)
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.Unify o t => Agda.Auto.CaseSplit.Unify o (Agda.Auto.NarrowingSearch.MM t (Agda.Auto.Syntax.RefInfo o))
+ Agda.Auto.CaseSplit: instance Agda.Auto.CaseSplit.Unify o t => Agda.Auto.CaseSplit.Unify o (Agda.Auto.Syntax.Abs t)
+ Agda.Auto.CaseSplit: instance Agda.Auto.Syntax.Renaming (Agda.Auto.CaseSplit.CSPatI o)
+ Agda.Auto.CaseSplit: instance Agda.Auto.Syntax.Renaming t => Agda.Auto.Syntax.Renaming (Agda.Auto.CaseSplit.HI t)
+ Agda.Auto.CaseSplit: lift' :: Lift t => Nat -> Nat -> t -> t
+ Agda.Auto.CaseSplit: notequal' :: Unify o t => t -> t -> ReaderT (Nat, Nat) (StateT (Assignments o) IO) Bool
+ Agda.Auto.CaseSplit: replace' :: Replace o t u => Nat -> MExp o -> t -> Reader (Nat, Nat) u
+ Agda.Auto.CaseSplit: sizeAndBoundVars :: LocalTerminationEnv a => a -> (Sum Nat, [Nat])
+ Agda.Auto.CaseSplit: type Assignments o = [(Nat, Exp o)]
+ Agda.Auto.CaseSplit: unify :: Unify o t => t -> t -> Maybe (Assignments o)
+ Agda.Auto.CaseSplit: unify' :: Unify o t => t -> t -> StateT (Assignments o) Maybe ()
+ Agda.Auto.CaseSplit: unifyVar :: Nat -> Exp o -> StateT (Assignments o) Maybe ()
+ Agda.Auto.Convert: Hint :: Bool -> QName -> Hint
+ Agda.Auto.Convert: [hintIsConstructor] :: Hint -> Bool
+ Agda.Auto.Convert: [hintQName] :: Hint -> QName
+ Agda.Auto.Convert: class Conversion m a b
+ Agda.Auto.Convert: convert :: Conversion m a b => a -> m b
+ Agda.Auto.Convert: data Hint
+ Agda.Auto.Convert: instance Agda.Auto.Convert.Conversion Agda.Auto.Convert.MOT (Agda.Auto.Syntax.Exp Agda.Auto.Convert.O) Agda.Syntax.Internal.Term
+ Agda.Auto.Convert: instance Agda.Auto.Convert.Conversion Agda.Auto.Convert.MOT (Agda.Auto.Syntax.Exp Agda.Auto.Convert.O) Agda.Syntax.Internal.Type
+ Agda.Auto.Convert: instance Agda.Auto.Convert.Conversion Agda.Auto.Convert.MOT a b => Agda.Auto.Convert.Conversion Agda.Auto.Convert.MOT (Agda.Auto.NarrowingSearch.MM a (Agda.Auto.Syntax.RefInfo Agda.Auto.Convert.O)) b
+ Agda.Auto.Convert: instance Agda.Auto.Convert.Conversion Agda.Auto.Convert.MOT a b => Agda.Auto.Convert.Conversion Agda.Auto.Convert.MOT (Agda.Auto.Syntax.Abs a) (Agda.Syntax.Internal.Abs b)
+ Agda.Auto.Convert: instance Agda.Auto.Convert.Conversion Agda.Auto.Convert.TOM (Agda.Syntax.Common.Arg Agda.Syntax.Internal.Pattern) (Agda.Auto.Syntax.Pat Agda.Auto.Convert.O)
+ Agda.Auto.Convert: instance Agda.Auto.Convert.Conversion Agda.Auto.Convert.TOM Agda.Syntax.Internal.Args (Agda.Auto.NarrowingSearch.MM (Agda.Auto.Syntax.ArgList Agda.Auto.Convert.O) (Agda.Auto.Syntax.RefInfo Agda.Auto.Convert.O))
+ Agda.Auto.Convert: instance Agda.Auto.Convert.Conversion Agda.Auto.Convert.TOM Agda.Syntax.Internal.Clause (GHC.Base.Maybe ([Agda.Auto.Syntax.Pat Agda.Auto.Convert.O], Agda.Auto.Syntax.MExp Agda.Auto.Convert.O))
+ Agda.Auto.Convert: instance Agda.Auto.Convert.Conversion Agda.Auto.Convert.TOM Agda.Syntax.Internal.Term (Agda.Auto.Syntax.MExp Agda.Auto.Convert.O)
+ Agda.Auto.Convert: instance Agda.Auto.Convert.Conversion Agda.Auto.Convert.TOM Agda.Syntax.Internal.Type (Agda.Auto.Syntax.MExp Agda.Auto.Convert.O)
+ Agda.Auto.Convert: instance Agda.Auto.Convert.Conversion Agda.Auto.Convert.TOM [Agda.Syntax.Internal.Clause] [([Agda.Auto.Syntax.Pat Agda.Auto.Convert.O], Agda.Auto.Syntax.MExp Agda.Auto.Convert.O)]
+ Agda.Auto.Convert: instance Agda.Auto.Convert.Conversion Agda.Auto.Convert.TOM a b => Agda.Auto.Convert.Conversion Agda.Auto.Convert.TOM (Agda.Syntax.Common.Arg a) (Agda.Syntax.Common.Hiding, b)
+ Agda.Auto.Convert: literalsNotImplemented :: TCM a
+ Agda.Auto.Convert: type MOT = ExceptT String IO
+ Agda.Auto.NarrowingSearch: Cost :: Int -> Cost
+ Agda.Auto.NarrowingSearch: Move :: Cost -> RefCreateEnv blk a -> Move' blk a
+ Agda.Auto.NarrowingSearch: Prio :: Int -> Prio
+ Agda.Auto.NarrowingSearch: RefCreateEnv :: StateT ((IORef [SubConstraints blk]), Int) IO a -> RefCreateEnv blk a
+ Agda.Auto.NarrowingSearch: [getCost] :: Cost -> Int
+ Agda.Auto.NarrowingSearch: [getPrio] :: Prio -> Int
+ Agda.Auto.NarrowingSearch: [moveCost] :: Move' blk a -> Cost
+ Agda.Auto.NarrowingSearch: [moveNext] :: Move' blk a -> RefCreateEnv blk a
+ Agda.Auto.NarrowingSearch: [runRefCreateEnv] :: RefCreateEnv blk a -> StateT ((IORef [SubConstraints blk]), Int) IO a
+ Agda.Auto.NarrowingSearch: data Move' blk a
+ Agda.Auto.NarrowingSearch: instance GHC.Base.Applicative (Agda.Auto.NarrowingSearch.RefCreateEnv blk)
+ Agda.Auto.NarrowingSearch: instance GHC.Base.Functor (Agda.Auto.NarrowingSearch.RefCreateEnv blk)
+ Agda.Auto.NarrowingSearch: instance GHC.Base.Monad (Agda.Auto.NarrowingSearch.RefCreateEnv blk)
+ Agda.Auto.NarrowingSearch: instance GHC.Classes.Eq Agda.Auto.NarrowingSearch.Cost
+ Agda.Auto.NarrowingSearch: instance GHC.Classes.Eq Agda.Auto.NarrowingSearch.Prio
+ Agda.Auto.NarrowingSearch: instance GHC.Classes.Ord Agda.Auto.NarrowingSearch.Cost
+ Agda.Auto.NarrowingSearch: instance GHC.Classes.Ord Agda.Auto.NarrowingSearch.Prio
+ Agda.Auto.NarrowingSearch: instance GHC.Num.Num Agda.Auto.NarrowingSearch.Cost
+ Agda.Auto.NarrowingSearch: instance GHC.Num.Num Agda.Auto.NarrowingSearch.Prio
+ Agda.Auto.NarrowingSearch: newtype Cost
+ Agda.Auto.NarrowingSearch: newtype Prio
+ Agda.Auto.NarrowingSearch: newtype RefCreateEnv blk a
+ Agda.Auto.NarrowingSearch: rm :: Empty -> MM a b -> a
+ Agda.Auto.Options: AHMModule :: AutoHintMode
+ Agda.Auto.Options: AHMNone :: AutoHintMode
+ Agda.Auto.Options: AutoOptions :: Hints -> TimeOut -> Int -> Mode -> AutoHintMode -> AutoOptions
+ Agda.Auto.Options: C :: AutoToken
+ Agda.Auto.Options: D :: AutoToken
+ Agda.Auto.Options: H :: String -> AutoToken
+ Agda.Auto.Options: L :: AutoToken
+ Agda.Auto.Options: M :: AutoToken
+ Agda.Auto.Options: MCaseSplit :: Mode
+ Agda.Auto.Options: MNormal :: Bool -> Bool -> Mode
+ Agda.Auto.Options: MRefine :: Bool -> Mode
+ Agda.Auto.Options: R :: AutoToken
+ Agda.Auto.Options: S :: Int -> AutoToken
+ Agda.Auto.Options: T :: Int -> AutoToken
+ Agda.Auto.Options: TimeOut :: Int -> TimeOut
+ Agda.Auto.Options: [autoHintMode] :: AutoOptions -> AutoHintMode
+ Agda.Auto.Options: [autoHints] :: AutoOptions -> Hints
+ Agda.Auto.Options: [autoMode] :: AutoOptions -> Mode
+ Agda.Auto.Options: [autoPick] :: AutoOptions -> Int
+ Agda.Auto.Options: [autoTimeOut] :: AutoOptions -> TimeOut
+ Agda.Auto.Options: [getTimeOut] :: TimeOut -> Int
+ Agda.Auto.Options: aoHintMode :: Lens' AutoHintMode AutoOptions
+ Agda.Auto.Options: aoHints :: Lens' Hints AutoOptions
+ Agda.Auto.Options: aoMode :: Lens' Mode AutoOptions
+ Agda.Auto.Options: aoPick :: Lens' Int AutoOptions
+ Agda.Auto.Options: aoTimeOut :: Lens' TimeOut AutoOptions
+ Agda.Auto.Options: autoTokens :: [String] -> [AutoToken]
+ Agda.Auto.Options: data AutoHintMode
+ Agda.Auto.Options: data AutoOptions
+ Agda.Auto.Options: data AutoToken
+ Agda.Auto.Options: data Mode
+ Agda.Auto.Options: initAutoOptions :: AutoOptions
+ Agda.Auto.Options: instance GHC.Show.Show Agda.Auto.Options.TimeOut
+ Agda.Auto.Options: newtype TimeOut
+ Agda.Auto.Options: parseArgs :: String -> AutoOptions
+ Agda.Auto.Options: type Hints = [String]
+ Agda.Auto.SearchControl: [eriInfTypeUnknown] :: ExpRefInfo o -> Bool
+ Agda.Auto.SearchControl: [eriIsEliminand] :: ExpRefInfo o -> Bool
+ Agda.Auto.SearchControl: costUnificationIf :: Bool -> Cost
+ Agda.Auto.SearchControl: eqBeginStep2 :: UId o -> EqReasoningConsts o -> Move o
+ Agda.Auto.SearchControl: eqCong :: UId o -> EqReasoningConsts o -> Move o
+ Agda.Auto.SearchControl: eqEnd :: UId o -> EqReasoningConsts o -> Move o
+ Agda.Auto.SearchControl: eqStep :: UId o -> EqReasoningConsts o -> Move o
+ Agda.Auto.SearchControl: eqSym :: UId o -> EqReasoningConsts o -> Move o
+ Agda.Auto.SearchControl: foldArgs :: [(Hiding, MExp o)] -> MArgList o
+ Agda.Auto.SearchControl: initExpRefInfo :: ExpRefInfo o
+ Agda.Auto.SearchControl: newAbs :: MId -> RefCreateEnv blk (Abs (MM a blk))
+ Agda.Auto.SearchControl: newApp :: UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
+ Agda.Auto.SearchControl: newApp' :: UId o -> ConstRef o -> [Hiding] -> [MExp o] -> RefCreateEnv (RefInfo o) (Exp o)
+ Agda.Auto.SearchControl: newArgs :: [Hiding] -> RefCreateEnv (RefInfo o) (MArgList o)
+ Agda.Auto.SearchControl: newArgs' :: [Hiding] -> [MExp o] -> RefCreateEnv (RefInfo o) (MArgList o)
+ Agda.Auto.SearchControl: newLam :: Hiding -> MId -> RefCreateEnv (RefInfo o) (Exp o)
+ Agda.Auto.SearchControl: newPi :: UId o -> Bool -> Hiding -> RefCreateEnv (RefInfo o) (Exp o)
+ Agda.Auto.SearchControl: pickUid :: forall o. [UId o] -> [Maybe (UId o)] -> (Maybe (UId o), Bool)
+ Agda.Auto.SearchControl: type Move o = Move' (RefInfo o) (Exp o)
+ Agda.Auto.Syntax: WithSeenUIds :: [Maybe (UId o)] -> a -> WithSeenUIds a o
+ Agda.Auto.Syntax: [rawValue] :: WithSeenUIds a o -> a
+ Agda.Auto.Syntax: [seenUIds] :: WithSeenUIds a o -> [Maybe (UId o)]
+ Agda.Auto.Syntax: class ExpandMetas t
+ Agda.Auto.Syntax: class FreeVars t
+ Agda.Auto.Syntax: class MetaliseOKH t
+ Agda.Auto.Syntax: class Renaming t
+ Agda.Auto.Syntax: class Weakening t
+ Agda.Auto.Syntax: data HNExp' o
+ Agda.Auto.Syntax: data WithSeenUIds a o
+ Agda.Auto.Syntax: expandMetas :: ExpandMetas t => t -> IO t
+ Agda.Auto.Syntax: freeVars :: FreeVars t => t -> Set Nat
+ Agda.Auto.Syntax: freeVarsOffset :: FreeVars t => Nat -> t -> Set Nat
+ Agda.Auto.Syntax: getConst :: Elr o -> Maybe (ConstRef o)
+ Agda.Auto.Syntax: getVar :: Elr o -> Maybe Nat
+ Agda.Auto.Syntax: instance (Agda.Auto.Syntax.FreeVars a, Agda.Auto.Syntax.FreeVars b) => Agda.Auto.Syntax.FreeVars (a, b)
+ Agda.Auto.Syntax: instance (Agda.Auto.Syntax.Renaming a, Agda.Auto.Syntax.Renaming b) => Agda.Auto.Syntax.Renaming (a, b)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.ExpandMetas (Agda.Auto.Syntax.ArgList o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.ExpandMetas (Agda.Auto.Syntax.Exp o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.ExpandMetas t => Agda.Auto.Syntax.ExpandMetas (Agda.Auto.NarrowingSearch.MM t a)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.ExpandMetas t => Agda.Auto.Syntax.ExpandMetas (Agda.Auto.Syntax.Abs t)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.FreeVars (Agda.Auto.Syntax.ArgList o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.FreeVars (Agda.Auto.Syntax.Elr o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.FreeVars (Agda.Auto.Syntax.Exp o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.FreeVars t => Agda.Auto.Syntax.FreeVars (Agda.Auto.NarrowingSearch.MM t a)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.FreeVars t => Agda.Auto.Syntax.FreeVars (Agda.Auto.Syntax.Abs t)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.MetaliseOKH (Agda.Auto.Syntax.ArgList o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.MetaliseOKH (Agda.Auto.Syntax.Exp o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.MetaliseOKH t => Agda.Auto.Syntax.MetaliseOKH (Agda.Auto.NarrowingSearch.MM t a)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.MetaliseOKH t => Agda.Auto.Syntax.MetaliseOKH (Agda.Auto.Syntax.Abs t)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.Renaming (Agda.Auto.Syntax.ArgList o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.Renaming (Agda.Auto.Syntax.Elr o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.Renaming (Agda.Auto.Syntax.Exp o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.Renaming t => Agda.Auto.Syntax.Renaming (Agda.Auto.NarrowingSearch.MM t a)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.Renaming t => Agda.Auto.Syntax.Renaming (Agda.Auto.Syntax.Abs t)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.Weakening (Agda.Auto.Syntax.Clos a o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.Weakening (Agda.Auto.Syntax.Elr o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.Weakening (Agda.Auto.Syntax.ICArgList o)
+ Agda.Auto.Syntax: instance Agda.Auto.Syntax.Weakening a => Agda.Auto.Syntax.Weakening (Agda.Auto.Syntax.TrBr a o)
+ Agda.Auto.Syntax: instance GHC.Classes.Eq (Agda.Auto.Syntax.Elr o)
+ Agda.Auto.Syntax: metaliseOKH :: MetaliseOKH t => t -> IO t
+ Agda.Auto.Syntax: rename :: Renaming t => (Nat -> Nat) -> t -> t
+ Agda.Auto.Syntax: renameOffset :: Renaming t => Nat -> (Nat -> Nat) -> t -> t
+ Agda.Auto.Syntax: type HNExp o = WithSeenUIds (HNExp' o) o
+ Agda.Auto.Syntax: weak' :: Weakening t => Nat -> t -> t
+ Agda.Benchmarking: Definition :: QName -> Phase
+ Agda.Benchmarking: OperatorsExpr :: Phase
+ Agda.Benchmarking: OperatorsPattern :: Phase
+ Agda.Benchmarking: TopModule :: TopLevelModuleName -> Phase
+ Agda.Benchmarking: isDefAccount :: Account -> Bool
+ Agda.Benchmarking: isInternalAccount :: Account -> Bool
+ Agda.Benchmarking: isModuleAccount :: Account -> Bool
+ Agda.Compiler.Backend: Backend' :: String -> Maybe String -> opts -> [OptDescr (Flag opts)] -> (opts -> Bool) -> (opts -> TCM env) -> (env -> IsMain -> Map ModuleName mod -> TCM ()) -> (env -> ModuleName -> FilePath -> TCM (Recompile menv mod)) -> (env -> menv -> IsMain -> ModuleName -> [def] -> TCM mod) -> (env -> menv -> Definition -> TCM def) -> Bool -> Backend' opts env menv mod def
+ Agda.Compiler.Backend: IsMain :: IsMain
+ Agda.Compiler.Backend: NotMain :: IsMain
+ Agda.Compiler.Backend: Recompile :: menv -> Recompile menv mod
+ Agda.Compiler.Backend: Skip :: mod -> Recompile menv mod
+ Agda.Compiler.Backend: [Backend] :: Backend' opts env menv mod def -> Backend
+ Agda.Compiler.Backend: [backendName] :: Backend' opts env menv mod def -> String
+ Agda.Compiler.Backend: [backendVersion] :: Backend' opts env menv mod def -> Maybe String
+ Agda.Compiler.Backend: [commandLineFlags] :: Backend' opts env menv mod def -> [OptDescr (Flag opts)]
+ Agda.Compiler.Backend: [compileDef] :: Backend' opts env menv mod def -> env -> menv -> Definition -> TCM def
+ Agda.Compiler.Backend: [isEnabled] :: Backend' opts env menv mod def -> opts -> Bool
+ Agda.Compiler.Backend: [options] :: Backend' opts env menv mod def -> opts
+ Agda.Compiler.Backend: [postCompile] :: Backend' opts env menv mod def -> env -> IsMain -> Map ModuleName mod -> TCM ()
+ Agda.Compiler.Backend: [postModule] :: Backend' opts env menv mod def -> env -> menv -> IsMain -> ModuleName -> [def] -> TCM mod
+ Agda.Compiler.Backend: [preCompile] :: Backend' opts env menv mod def -> opts -> TCM env
+ Agda.Compiler.Backend: [preModule] :: Backend' opts env menv mod def -> env -> ModuleName -> FilePath -> TCM (Recompile menv mod)
+ Agda.Compiler.Backend: [scopeCheckingSuffices] :: Backend' opts env menv mod def -> Bool
+ Agda.Compiler.Backend: backendInteraction :: [Backend] -> (TCM (Maybe Interface) -> TCM ()) -> TCM (Maybe Interface) -> TCM ()
+ Agda.Compiler.Backend: callBackend :: String -> IsMain -> Interface -> TCM ()
+ Agda.Compiler.Backend: data Backend
+ Agda.Compiler.Backend: data Backend' opts env menv mod def
+ Agda.Compiler.Backend: data IsMain
+ Agda.Compiler.Backend: data Recompile menv mod
+ Agda.Compiler.Backend: parseBackendOptions :: [Backend] -> [String] -> OptM ([Backend], CommandLineOptions)
+ Agda.Compiler.Backend: toTreeless :: QName -> TCM (Maybe TTerm)
+ Agda.Compiler.Backend: type Flag opts = opts -> OptM opts
+ Agda.Compiler.Common: instance Data.Semigroup.Semigroup Agda.Compiler.Common.IsMain
+ Agda.Compiler.Common: instance GHC.Base.Monoid Agda.Compiler.Common.IsMain
+ Agda.Compiler.JS.Compiler: JSOptions :: Bool -> JSOptions
+ Agda.Compiler.JS.Compiler: [optJSCompile] :: JSOptions -> Bool
+ Agda.Compiler.JS.Compiler: checkCompilerPragmas :: QName -> TCM ()
+ Agda.Compiler.JS.Compiler: compileTerm' :: Maybe CoinductionKit -> TTerm -> TCM Exp
+ Agda.Compiler.JS.Compiler: data JSOptions
+ Agda.Compiler.JS.Compiler: defJSDef :: Definition -> Maybe String
+ Agda.Compiler.JS.Compiler: defaultJSOptions :: JSOptions
+ Agda.Compiler.JS.Compiler: flatName :: MemberId
+ Agda.Compiler.JS.Compiler: jsBackend :: Backend
+ Agda.Compiler.JS.Compiler: jsBackend' :: Backend' JSOptions JSOptions JSModuleEnv () (Maybe Export)
+ Agda.Compiler.JS.Compiler: jsCommandLineFlags :: [OptDescr (Flag JSOptions)]
+ Agda.Compiler.JS.Compiler: jsCompileDef :: JSOptions -> JSModuleEnv -> Definition -> TCM (Maybe Export)
+ Agda.Compiler.JS.Compiler: jsPostCompile :: JSOptions -> IsMain -> a -> TCM ()
+ Agda.Compiler.JS.Compiler: jsPostModule :: JSOptions -> JSModuleEnv -> IsMain -> ModuleName -> [Maybe Export] -> TCM ()
+ Agda.Compiler.JS.Compiler: jsPreCompile :: JSOptions -> TCM JSOptions
+ Agda.Compiler.JS.Compiler: jsPreModule :: JSOptions -> ModuleName -> FilePath -> TCM (Recompile JSModuleEnv ())
+ Agda.Compiler.JS.Compiler: type JSModuleEnv = Maybe CoinductionKit
+ Agda.Compiler.JS.Pretty: instance (Agda.Compiler.JS.Pretty.Pretty a, Agda.Compiler.JS.Pretty.Pretty b) => Agda.Compiler.JS.Pretty.Pretties (Data.Map.Internal.Map a b)
+ Agda.Compiler.JS.Pretty: isValidJSIdent :: String -> Bool
+ Agda.Compiler.JS.Pretty: variableName :: String -> String
+ Agda.Compiler.JS.Syntax: instance Agda.Compiler.JS.Syntax.Globals a => Agda.Compiler.JS.Syntax.Globals (Data.Map.Internal.Map k a)
+ Agda.Compiler.JS.Syntax: instance Agda.Compiler.JS.Syntax.Uses a => Agda.Compiler.JS.Syntax.Uses (Data.Map.Internal.Map k a)
+ Agda.Compiler.MAlonzo.Compiler: GHCOptions :: Bool -> Bool -> [String] -> GHCOptions
+ Agda.Compiler.MAlonzo.Compiler: [optGhcCallGhc] :: GHCOptions -> Bool
+ Agda.Compiler.MAlonzo.Compiler: [optGhcCompile] :: GHCOptions -> Bool
+ Agda.Compiler.MAlonzo.Compiler: [optGhcFlags] :: GHCOptions -> [String]
+ Agda.Compiler.MAlonzo.Compiler: compiledTypeSynonym :: QName -> String -> Nat -> Decl
+ Agda.Compiler.MAlonzo.Compiler: compiledcondecl :: QName -> TCM Decl
+ Agda.Compiler.MAlonzo.Compiler: constructorCoverageCode :: QName -> Int -> [QName] -> HaskellType -> [HaskellCode] -> TCM [Decl]
+ Agda.Compiler.MAlonzo.Compiler: data GHCOptions
+ Agda.Compiler.MAlonzo.Compiler: defaultGHCOptions :: GHCOptions
+ Agda.Compiler.MAlonzo.Compiler: ghcBackend :: Backend
+ Agda.Compiler.MAlonzo.Compiler: ghcBackend' :: Backend' GHCOptions GHCOptions GHCModuleEnv IsMain [Decl]
+ Agda.Compiler.MAlonzo.Compiler: ghcCommandLineFlags :: [OptDescr (Flag GHCOptions)]
+ Agda.Compiler.MAlonzo.Compiler: ghcCompileDef :: GHCOptions -> GHCModuleEnv -> Definition -> TCM [Decl]
+ Agda.Compiler.MAlonzo.Compiler: ghcPostCompile :: GHCOptions -> IsMain -> Map ModuleName IsMain -> TCM ()
+ Agda.Compiler.MAlonzo.Compiler: ghcPostModule :: GHCOptions -> GHCModuleEnv -> IsMain -> ModuleName -> [[Decl]] -> TCM IsMain
+ Agda.Compiler.MAlonzo.Compiler: ghcPreCompile :: GHCOptions -> TCM GHCOptions
+ Agda.Compiler.MAlonzo.Compiler: ghcPreModule :: GHCOptions -> ModuleName -> FilePath -> TCM (Recompile GHCModuleEnv IsMain)
+ Agda.Compiler.MAlonzo.Compiler: type GHCModuleEnv = Maybe CoinductionKit
+ Agda.Compiler.MAlonzo.HaskellTypes: checkConstructorCount :: QName -> [QName] -> [HaskellCode] -> TCM ()
+ Agda.Compiler.MAlonzo.HaskellTypes: getHsType :: QName -> TCM HaskellType
+ Agda.Compiler.MAlonzo.HaskellTypes: getHsVar :: Nat -> TCM HaskellCode
+ Agda.Compiler.MAlonzo.HaskellTypes: haskellType :: QName -> TCM HaskellType
+ Agda.Compiler.MAlonzo.HaskellTypes: haskellType' :: Type -> TCM HaskellType
+ Agda.Compiler.MAlonzo.HaskellTypes: hsApp :: String -> [HaskellType] -> HaskellType
+ Agda.Compiler.MAlonzo.HaskellTypes: hsForall :: String -> HaskellType -> HaskellType
+ Agda.Compiler.MAlonzo.HaskellTypes: hsFun :: HaskellKind -> HaskellKind -> HaskellKind
+ Agda.Compiler.MAlonzo.HaskellTypes: hsKFun :: HaskellKind -> HaskellKind -> HaskellKind
+ Agda.Compiler.MAlonzo.HaskellTypes: hsStar :: HaskellKind
+ Agda.Compiler.MAlonzo.HaskellTypes: hsUnit :: HaskellType
+ Agda.Compiler.MAlonzo.HaskellTypes: hsVar :: Name -> HaskellType
+ Agda.Compiler.MAlonzo.HaskellTypes: notAHaskellType :: Type -> TCM a
+ Agda.Compiler.MAlonzo.HaskellTypes: type HaskellKind = String
+ Agda.Compiler.MAlonzo.Pragmas: ForeignFileHeaderPragma :: KindOfForeignCode
+ Agda.Compiler.MAlonzo.Pragmas: ForeignImport :: KindOfForeignCode
+ Agda.Compiler.MAlonzo.Pragmas: ForeignOther :: KindOfForeignCode
+ Agda.Compiler.MAlonzo.Pragmas: HsData :: Range -> HaskellType -> [HaskellCode] -> HaskellPragma
+ Agda.Compiler.MAlonzo.Pragmas: HsDefn :: Range -> HaskellCode -> HaskellPragma
+ Agda.Compiler.MAlonzo.Pragmas: HsExport :: Range -> HaskellCode -> HaskellPragma
+ Agda.Compiler.MAlonzo.Pragmas: HsType :: Range -> HaskellType -> HaskellPragma
+ Agda.Compiler.MAlonzo.Pragmas: classifyForeign :: String -> KindOfForeignCode
+ Agda.Compiler.MAlonzo.Pragmas: classifyPragma :: String -> KindOfForeignCode
+ Agda.Compiler.MAlonzo.Pragmas: data HaskellPragma
+ Agda.Compiler.MAlonzo.Pragmas: data KindOfForeignCode
+ Agda.Compiler.MAlonzo.Pragmas: foreignHaskell :: TCM ([String], [String], [String])
+ Agda.Compiler.MAlonzo.Pragmas: getHaskellConstructor :: QName -> TCM (Maybe HaskellCode)
+ Agda.Compiler.MAlonzo.Pragmas: getHaskellPragma :: QName -> TCM (Maybe HaskellPragma)
+ Agda.Compiler.MAlonzo.Pragmas: instance Agda.Syntax.Position.HasRange Agda.Compiler.MAlonzo.Pragmas.HaskellPragma
+ Agda.Compiler.MAlonzo.Pragmas: instance GHC.Classes.Eq Agda.Compiler.MAlonzo.Pragmas.HaskellPragma
+ Agda.Compiler.MAlonzo.Pragmas: instance GHC.Show.Show Agda.Compiler.MAlonzo.Pragmas.HaskellPragma
+ Agda.Compiler.MAlonzo.Pragmas: parseHaskellPragma :: CompilerPragma -> TCM HaskellPragma
+ Agda.Compiler.MAlonzo.Pragmas: parsePragma :: CompilerPragma -> Either String HaskellPragma
+ Agda.Compiler.MAlonzo.Pragmas: partitionByKindOfForeignCode :: (a -> KindOfForeignCode) -> [a] -> ([a], [a], [a])
+ Agda.Compiler.MAlonzo.Pragmas: sanityCheckPragma :: Definition -> Maybe HaskellPragma -> TCM ()
+ Agda.Compiler.MAlonzo.Primitives: hasMainFunction :: Interface -> IsMain
+ Agda.Compiler.MAlonzo.Primitives: isMainFunction :: QName -> Bool
+ Agda.Compiler.Treeless.EliminateDefaults: eliminateCaseDefaults :: TTerm -> TCM TTerm
+ Agda.Interaction.BasicOps: WithForce :: UseForce
+ Agda.Interaction.BasicOps: WithoutForce :: UseForce
+ Agda.Interaction.BasicOps: data UseForce
+ Agda.Interaction.BasicOps: instance GHC.Classes.Eq Agda.Interaction.BasicOps.UseForce
+ Agda.Interaction.BasicOps: instance GHC.Read.Read Agda.Interaction.BasicOps.UseForce
+ Agda.Interaction.BasicOps: instance GHC.Show.Show Agda.Interaction.BasicOps.ComputeMode
+ Agda.Interaction.BasicOps: instance GHC.Show.Show Agda.Interaction.BasicOps.Rewrite
+ Agda.Interaction.BasicOps: instance GHC.Show.Show Agda.Interaction.BasicOps.UseForce
+ Agda.Interaction.Highlighting.LaTeX: instance GHC.Classes.Eq Agda.Interaction.Highlighting.LaTeX.Kind
+ Agda.Interaction.Highlighting.LaTeX: instance GHC.Show.Show Agda.Interaction.Highlighting.LaTeX.AlignmentColumn
+ Agda.Interaction.Highlighting.LaTeX: instance GHC.Show.Show Agda.Interaction.Highlighting.LaTeX.Kind
+ Agda.Interaction.Highlighting.LaTeX: instance GHC.Show.Show Agda.Interaction.Highlighting.LaTeX.Output
+ Agda.Interaction.Highlighting.Precise: CatchallClause :: OtherAspect
+ Agda.Interaction.Highlighting.Precise: CoverageProblem :: OtherAspect
+ Agda.Interaction.Highlighting.Precise: DefinitionSite :: TopLevelModuleName -> Int -> Bool -> Maybe String -> DefinitionSite
+ Agda.Interaction.Highlighting.Precise: Option :: Aspect
+ Agda.Interaction.Highlighting.Precise: ReachabilityProblem :: OtherAspect
+ Agda.Interaction.Highlighting.Precise: [defSiteAnchor] :: DefinitionSite -> Maybe String
+ Agda.Interaction.Highlighting.Precise: [defSiteHere] :: DefinitionSite -> Bool
+ Agda.Interaction.Highlighting.Precise: [defSiteModule] :: DefinitionSite -> TopLevelModuleName
+ Agda.Interaction.Highlighting.Precise: [defSitePos] :: DefinitionSite -> Int
+ Agda.Interaction.Highlighting.Precise: data DefinitionSite
+ Agda.Interaction.Highlighting.Precise: instance GHC.Classes.Eq Agda.Interaction.Highlighting.Precise.DefinitionSite
+ Agda.Interaction.Highlighting.Precise: instance GHC.Show.Show Agda.Interaction.Highlighting.Precise.DefinitionSite
+ Agda.Interaction.Imports: ScopeCheck :: Mode
+ Agda.Interaction.Imports: TypeCheck :: Mode
+ Agda.Interaction.Imports: data Mode
+ Agda.Interaction.Imports: errorWarningsOfTCErr :: TCErr -> TCM [TCWarning]
+ Agda.Interaction.Imports: includeStateChanges :: MainInterface -> Bool
+ Agda.Interaction.Imports: instance GHC.Classes.Eq Agda.Interaction.Imports.Mode
+ Agda.Interaction.Imports: instance GHC.Show.Show Agda.Interaction.Imports.Mode
+ Agda.Interaction.InteractionTop: Cmd_abort :: Interaction' range
+ Agda.Interaction.InteractionTop: Cmd_goal_type_context_check :: Rewrite -> InteractionId -> range -> String -> Interaction' range
+ Agda.Interaction.InteractionTop: Command :: IOTCM -> Command
+ Agda.Interaction.InteractionTop: Done :: Command
+ Agda.Interaction.InteractionTop: Error :: String -> Command
+ Agda.Interaction.InteractionTop: OtherBackend :: String -> CompilerBackend
+ Agda.Interaction.InteractionTop: QuickLaTeX :: CompilerBackend
+ Agda.Interaction.InteractionTop: [commandQueue] :: CommandState -> CommandQueue
+ Agda.Interaction.InteractionTop: data Command
+ Agda.Interaction.InteractionTop: data CompilerBackend
+ Agda.Interaction.InteractionTop: initialiseCommandQueue :: IO Command -> IO CommandQueue
+ Agda.Interaction.InteractionTop: instance GHC.Classes.Eq Agda.Interaction.InteractionTop.CompilerBackend
+ Agda.Interaction.InteractionTop: instance GHC.Read.Read Agda.Interaction.InteractionTop.CompilerBackend
+ Agda.Interaction.InteractionTop: instance GHC.Show.Show Agda.Interaction.InteractionTop.Command
+ Agda.Interaction.InteractionTop: instance GHC.Show.Show Agda.Interaction.InteractionTop.CompilerBackend
+ Agda.Interaction.InteractionTop: instance GHC.Show.Show range => GHC.Show.Show (Agda.Interaction.InteractionTop.IOTCM' range)
+ Agda.Interaction.InteractionTop: instance GHC.Show.Show range => GHC.Show.Show (Agda.Interaction.InteractionTop.Interaction' range)
+ Agda.Interaction.InteractionTop: maybeAbort :: CommandM () -> CommandM ()
+ Agda.Interaction.InteractionTop: nextCommand :: CommandM Command
+ Agda.Interaction.InteractionTop: type CommandQueue = TChan Command
+ Agda.Interaction.Library: VersionView :: LibName -> [Integer] -> VersionView
+ Agda.Interaction.Library: [vvBase] :: VersionView -> LibName
+ Agda.Interaction.Library: [vvNumbers] :: VersionView -> [Integer]
+ Agda.Interaction.Library: data VersionView
+ Agda.Interaction.Library: findLib' :: (a -> LibName) -> LibName -> [a] -> [a]
+ Agda.Interaction.Library: instance GHC.Classes.Eq Agda.Interaction.Library.VersionView
+ Agda.Interaction.Library: instance GHC.Show.Show Agda.Interaction.Library.VersionView
+ Agda.Interaction.Library: unVersionView :: VersionView -> LibName
+ Agda.Interaction.Library: versionView :: LibName -> VersionView
+ Agda.Interaction.Library.Base: emptyLibFile :: AgdaLibFile
+ Agda.Interaction.Library.Base: libNameForCurrentDir :: LibName
+ Agda.Interaction.Library.Parse: trimLineComment :: String -> String
+ Agda.Interaction.Library.Parse: type LineNumber = Int
+ Agda.Interaction.Options: IgnoreAllWarnings :: WarningMode
+ Agda.Interaction.Options: LeaveAlone :: WarningMode
+ Agda.Interaction.Options: NoArg :: a -> ArgDescr a
+ Agda.Interaction.Options: OptArg :: (Maybe String -> a) -> String -> ArgDescr a
+ Agda.Interaction.Options: Option :: [Char] -> [String] -> ArgDescr a -> String -> OptDescr a
+ Agda.Interaction.Options: ReqArg :: (String -> a) -> String -> ArgDescr a
+ Agda.Interaction.Options: TurnIntoErrors :: WarningMode
+ Agda.Interaction.Options: [optCountClusters] :: CommandLineOptions -> Bool
+ Agda.Interaction.Options: [optOnlyScopeChecking] :: CommandLineOptions -> Bool
+ Agda.Interaction.Options: [optWarningMode] :: PragmaOptions -> WarningMode
+ Agda.Interaction.Options: data ArgDescr a :: * -> *
+ Agda.Interaction.Options: data OptDescr a :: * -> *
+ Agda.Interaction.Options: data WarningMode
+ Agda.Interaction.Options: instance GHC.Classes.Eq Agda.Interaction.Options.WarningMode
+ Agda.Interaction.Options: instance GHC.Show.Show Agda.Interaction.Options.WarningMode
+ Agda.Interaction.Options.Lenses: instance Agda.Interaction.Options.Lenses.LensSafeMode Agda.Interaction.Options.PragmaOptions
+ Agda.Interaction.Response: Resp_DoneAborting :: Response
+ Agda.Main: backendUsage :: Backend -> String
+ Agda.Main: builtinBackends :: [Backend]
+ Agda.Main: defaultInteraction :: CommandLineOptions -> TCM (Maybe Interface) -> TCM ()
+ Agda.Main: runAgda' :: [Backend] -> IO ()
+ Agda.Syntax.Abstract: CompilePragma :: String -> QName -> String -> Pragma
+ Agda.Syntax.Abstract: EtaPragma :: QName -> Pragma
+ Agda.Syntax.Abstract: InjectivePragma :: QName -> Pragma
+ Agda.Syntax.Abstract: StrippedDot :: Expr -> Term -> Type -> StrippedDotPattern
+ Agda.Syntax.Abstract: [clauseStrippedDots] :: Clause' lhs -> [StrippedDotPattern]
+ Agda.Syntax.Abstract: data StrippedDotPattern
+ Agda.Syntax.Abstract: instance Agda.Syntax.Position.KillRange Agda.Syntax.Abstract.StrippedDotPattern
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.Axiom
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.Declaration
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.Expr
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.LHS
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.LamBinding
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.LetBinding
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.ModuleApplication
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.NamedDotPattern
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.Pragma
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.RHS
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.ScopeCopyInfo
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.SpineLHS
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.StrippedDotPattern
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.TypedBinding
+ Agda.Syntax.Abstract: instance Data.Data.Data Agda.Syntax.Abstract.TypedBindings
+ Agda.Syntax.Abstract: instance Data.Data.Data e => Data.Data.Data (Agda.Syntax.Abstract.LHSCore' e)
+ Agda.Syntax.Abstract: instance Data.Data.Data e => Data.Data.Data (Agda.Syntax.Abstract.Pattern' e)
+ Agda.Syntax.Abstract: instance Data.Data.Data lhs => Data.Data.Data (Agda.Syntax.Abstract.Clause' lhs)
+ Agda.Syntax.Abstract: instance GHC.Classes.Eq Agda.Syntax.Abstract.StrippedDotPattern
+ Agda.Syntax.Abstract: instance GHC.Show.Show Agda.Syntax.Abstract.StrippedDotPattern
+ Agda.Syntax.Abstract.Copatterns: instance Agda.Syntax.Abstract.Copatterns.Rename Agda.Syntax.Abstract.StrippedDotPattern
+ Agda.Syntax.Abstract.Name: instance Data.Data.Data Agda.Syntax.Abstract.Name.AmbiguousQName
+ Agda.Syntax.Abstract.Name: instance Data.Data.Data Agda.Syntax.Abstract.Name.ModuleName
+ Agda.Syntax.Abstract.Name: instance Data.Data.Data Agda.Syntax.Abstract.Name.Name
+ Agda.Syntax.Abstract.Name: instance Data.Data.Data Agda.Syntax.Abstract.Name.QName
+ Agda.Syntax.Abstract.Pattern: class APatternLike a p | p -> a
+ Agda.Syntax.Abstract.Pattern: class MapNamedArgPattern a
+ Agda.Syntax.Abstract.Pattern: containsAPattern :: APatternLike a p => (Pattern' a -> Bool) -> p -> Bool
+ Agda.Syntax.Abstract.Pattern: containsAbsurdPattern :: APatternLike a p => p -> Bool
+ Agda.Syntax.Abstract.Pattern: containsAsPattern :: APatternLike a p => p -> Bool
+ Agda.Syntax.Abstract.Pattern: foldAPattern :: (APatternLike a p, Monoid m) => (Pattern' a -> m) -> p -> m
+ Agda.Syntax.Abstract.Pattern: foldrAPattern :: (APatternLike a p, Monoid m, Foldable f, APatternLike a b, f b ~ p) => (Pattern' a -> m -> m) -> p -> m
+ Agda.Syntax.Abstract.Pattern: instance Agda.Syntax.Abstract.Pattern.APatternLike a (Agda.Syntax.Abstract.Pattern' a)
+ Agda.Syntax.Abstract.Pattern: instance Agda.Syntax.Abstract.Pattern.APatternLike a b => Agda.Syntax.Abstract.Pattern.APatternLike a (Agda.Syntax.Common.Arg b)
+ Agda.Syntax.Abstract.Pattern: instance Agda.Syntax.Abstract.Pattern.APatternLike a b => Agda.Syntax.Abstract.Pattern.APatternLike a (Agda.Syntax.Common.Named n b)
+ Agda.Syntax.Abstract.Pattern: instance Agda.Syntax.Abstract.Pattern.APatternLike a b => Agda.Syntax.Abstract.Pattern.APatternLike a (Agda.Syntax.Concrete.FieldAssignment' b)
+ Agda.Syntax.Abstract.Pattern: instance Agda.Syntax.Abstract.Pattern.APatternLike a b => Agda.Syntax.Abstract.Pattern.APatternLike a (GHC.Base.Maybe b)
+ Agda.Syntax.Abstract.Pattern: instance Agda.Syntax.Abstract.Pattern.APatternLike a b => Agda.Syntax.Abstract.Pattern.APatternLike a [b]
+ Agda.Syntax.Abstract.Pattern: instance Agda.Syntax.Abstract.Pattern.MapNamedArgPattern Agda.Syntax.Abstract.Pattern.NAP
+ Agda.Syntax.Abstract.Pattern: instance Agda.Syntax.Abstract.Pattern.MapNamedArgPattern a => Agda.Syntax.Abstract.Pattern.MapNamedArgPattern (Agda.Syntax.Concrete.FieldAssignment' a)
+ Agda.Syntax.Abstract.Pattern: instance Agda.Syntax.Abstract.Pattern.MapNamedArgPattern a => Agda.Syntax.Abstract.Pattern.MapNamedArgPattern (GHC.Base.Maybe a)
+ Agda.Syntax.Abstract.Pattern: instance Agda.Syntax.Abstract.Pattern.MapNamedArgPattern a => Agda.Syntax.Abstract.Pattern.MapNamedArgPattern [a]
+ Agda.Syntax.Abstract.Pattern: mapNamedArgPattern :: (MapNamedArgPattern a, Functor f, MapNamedArgPattern a', a ~ f a') => (NAP -> NAP) -> a -> a
+ Agda.Syntax.Abstract.Pattern: patternVars :: forall a p. APatternLike a p => p -> [Name]
+ Agda.Syntax.Abstract.Pattern: postTraverseAPatternM :: (APatternLike a b, Monad m) => (Pattern' a -> m (Pattern' a)) -> b -> m b
+ Agda.Syntax.Abstract.Pattern: preTraverseAPatternM :: (APatternLike a b, Monad m) => (Pattern' a -> m (Pattern' a)) -> b -> m b
+ Agda.Syntax.Abstract.Pattern: traverseAPatternM :: (APatternLike a p, Traversable f, APatternLike a q, f q ~ p, Monad m) => (Pattern' a -> m (Pattern' a)) -> (Pattern' a -> m (Pattern' a)) -> p -> m p
+ Agda.Syntax.Abstract.Pattern: type NAP = NamedArg Pattern
+ Agda.Syntax.Abstract.Views: LamView :: [(LamInfo, LamBinding)] -> Expr -> LamView
+ Agda.Syntax.Abstract.Views: data LamView
+ Agda.Syntax.Abstract.Views: lamView :: Expr -> LamView
+ Agda.Syntax.Common: CaseSplit :: Origin
+ Agda.Syntax.Common: ConOSplit :: ConOrigin
+ Agda.Syntax.Common: IsData :: DataOrRecord
+ Agda.Syntax.Common: IsRecord :: DataOrRecord
+ Agda.Syntax.Common: NoOverlap :: Overlappable
+ Agda.Syntax.Common: WithOrigin :: !Origin -> a -> WithOrigin a
+ Agda.Syntax.Common: YesOverlap :: Overlappable
+ Agda.Syntax.Common: [whHiding] :: WithHiding a -> !Hiding
+ Agda.Syntax.Common: [whThing] :: WithHiding a -> a
+ Agda.Syntax.Common: [woOrigin] :: WithOrigin a -> !Origin
+ Agda.Syntax.Common: [woThing] :: WithOrigin a -> a
+ Agda.Syntax.Common: data DataOrRecord
+ Agda.Syntax.Common: data Overlappable
+ Agda.Syntax.Common: data WithOrigin a
+ Agda.Syntax.Common: hidden :: LensHiding a => a -> Bool
+ Agda.Syntax.Common: instance (Data.Data.Data a, Data.Data.Data name) => Data.Data.Data (Agda.Syntax.Common.Named name a)
+ Agda.Syntax.Common: instance (Data.Data.Data b, Data.Data.Data a) => Data.Data.Data (Agda.Syntax.Common.ImportDirective' a b)
+ Agda.Syntax.Common: instance (Data.Data.Data b, Data.Data.Data a) => Data.Data.Data (Agda.Syntax.Common.ImportedName' a b)
+ Agda.Syntax.Common: instance (Data.Data.Data b, Data.Data.Data a) => Data.Data.Data (Agda.Syntax.Common.Renaming' a b)
+ Agda.Syntax.Common: instance (Data.Data.Data b, Data.Data.Data a) => Data.Data.Data (Agda.Syntax.Common.Using' a b)
+ Agda.Syntax.Common: instance Agda.Syntax.Common.LensOrigin (Agda.Syntax.Common.Dom e)
+ Agda.Syntax.Common: instance Agda.Syntax.Common.LensOrigin (Agda.Syntax.Common.WithOrigin a)
+ Agda.Syntax.Common: instance Agda.Syntax.Position.HasRange a => Agda.Syntax.Position.HasRange (Agda.Syntax.Common.WithOrigin a)
+ Agda.Syntax.Common: instance Agda.Syntax.Position.KillRange a => Agda.Syntax.Position.KillRange (Agda.Syntax.Common.WithOrigin a)
+ Agda.Syntax.Common: instance Agda.Syntax.Position.SetRange a => Agda.Syntax.Position.SetRange (Agda.Syntax.Common.WithOrigin a)
+ Agda.Syntax.Common: instance Agda.Utils.Functor.Decoration Agda.Syntax.Common.WithOrigin
+ Agda.Syntax.Common: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Common.Access
+ Agda.Syntax.Common: instance Control.DeepSeq.NFData Agda.Syntax.Common.Overlappable
+ Agda.Syntax.Common: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Agda.Syntax.Common.WithOrigin a)
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.Access
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.ArgInfo
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.Big
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.ConOrigin
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.DataOrRecord
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.Delayed
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.Hiding
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.Induction
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.InteractionId
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.IsAbstract
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.IsInfix
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.IsInstance
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.IsMacro
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.MetaId
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.NameId
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.Origin
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.Overlappable
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.PositionInName
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.ProjOrigin
+ Agda.Syntax.Common: instance Data.Data.Data Agda.Syntax.Common.Relevance
+ Agda.Syntax.Common: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Common.Ranged a)
+ Agda.Syntax.Common: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Common.WithHiding a)
+ Agda.Syntax.Common: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Common.WithOrigin a)
+ Agda.Syntax.Common: instance Data.Data.Data e => Data.Data.Data (Agda.Syntax.Common.Arg e)
+ Agda.Syntax.Common: instance Data.Data.Data e => Data.Data.Data (Agda.Syntax.Common.Dom e)
+ Agda.Syntax.Common: instance Data.Data.Data e => Data.Data.Data (Agda.Syntax.Common.MaybePlaceholder e)
+ Agda.Syntax.Common: instance Data.Data.Data m => Data.Data.Data (Agda.Syntax.Common.TerminationCheck m)
+ Agda.Syntax.Common: instance Data.Foldable.Foldable Agda.Syntax.Common.WithOrigin
+ Agda.Syntax.Common: instance Data.Semigroup.Semigroup Agda.Syntax.Common.Overlappable
+ Agda.Syntax.Common: instance Data.Traversable.Traversable Agda.Syntax.Common.WithOrigin
+ Agda.Syntax.Common: instance GHC.Base.Functor Agda.Syntax.Common.WithOrigin
+ Agda.Syntax.Common: instance GHC.Base.Monoid Agda.Syntax.Common.Overlappable
+ Agda.Syntax.Common: instance GHC.Classes.Eq Agda.Syntax.Common.DataOrRecord
+ Agda.Syntax.Common: instance GHC.Classes.Eq Agda.Syntax.Common.Overlappable
+ Agda.Syntax.Common: instance GHC.Classes.Eq a => GHC.Classes.Eq (Agda.Syntax.Common.WithOrigin a)
+ Agda.Syntax.Common: instance GHC.Classes.Ord Agda.Syntax.Common.DataOrRecord
+ Agda.Syntax.Common: instance GHC.Classes.Ord Agda.Syntax.Common.Overlappable
+ Agda.Syntax.Common: instance GHC.Classes.Ord a => GHC.Classes.Ord (Agda.Syntax.Common.WithOrigin a)
+ Agda.Syntax.Common: instance GHC.Show.Show Agda.Syntax.Common.DataOrRecord
+ Agda.Syntax.Common: instance GHC.Show.Show Agda.Syntax.Common.Overlappable
+ Agda.Syntax.Common: instance GHC.Show.Show a => GHC.Show.Show (Agda.Syntax.Common.WithOrigin a)
+ Agda.Syntax.Common: irrelevant :: Relevance -> Bool
+ Agda.Syntax.Common: isInstance :: LensHiding a => a -> Bool
+ Agda.Syntax.Common: isOverlappable :: LensHiding a => a -> Bool
+ Agda.Syntax.Common: makeInstance' :: LensHiding a => Overlappable -> a -> a
+ Agda.Syntax.Common: sameHiding :: (LensHiding a, LensHiding b) => a -> b -> Bool
+ Agda.Syntax.Common: setNamedArg :: NamedArg a -> b -> NamedArg b
+ Agda.Syntax.Concrete: CompilePragma :: Range -> String -> QName -> String -> Pragma
+ Agda.Syntax.Concrete: EtaPragma :: Range -> QName -> Pragma
+ Agda.Syntax.Concrete: ForeignPragma :: Range -> String -> String -> Pragma
+ Agda.Syntax.Concrete: InjectivePragma :: Range -> QName -> Pragma
+ Agda.Syntax.Concrete: instance Data.Data.Data Agda.Syntax.Concrete.AsName
+ Agda.Syntax.Concrete: instance Data.Data.Data Agda.Syntax.Concrete.BoundName
+ Agda.Syntax.Concrete: instance Data.Data.Data Agda.Syntax.Concrete.Declaration
+ Agda.Syntax.Concrete: instance Data.Data.Data Agda.Syntax.Concrete.Expr
+ Agda.Syntax.Concrete: instance Data.Data.Data Agda.Syntax.Concrete.LHS
+ Agda.Syntax.Concrete: instance Data.Data.Data Agda.Syntax.Concrete.ModuleApplication
+ Agda.Syntax.Concrete: instance Data.Data.Data Agda.Syntax.Concrete.ModuleAssignment
+ Agda.Syntax.Concrete: instance Data.Data.Data Agda.Syntax.Concrete.OpenShortHand
+ Agda.Syntax.Concrete: instance Data.Data.Data Agda.Syntax.Concrete.Pattern
+ Agda.Syntax.Concrete: instance Data.Data.Data Agda.Syntax.Concrete.Pragma
+ Agda.Syntax.Concrete: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Concrete.FieldAssignment' a)
+ Agda.Syntax.Concrete: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Concrete.LamBinding' a)
+ Agda.Syntax.Concrete: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Concrete.TypedBindings' a)
+ Agda.Syntax.Concrete: instance Data.Data.Data decls => Data.Data.Data (Agda.Syntax.Concrete.WhereClause' decls)
+ Agda.Syntax.Concrete: instance Data.Data.Data e => Data.Data.Data (Agda.Syntax.Concrete.OpApp e)
+ Agda.Syntax.Concrete: instance Data.Data.Data e => Data.Data.Data (Agda.Syntax.Concrete.RHS' e)
+ Agda.Syntax.Concrete: instance Data.Data.Data e => Data.Data.Data (Agda.Syntax.Concrete.TypedBinding' e)
+ Agda.Syntax.Concrete: instance GHC.Classes.Eq Agda.Syntax.Concrete.BoundName
+ Agda.Syntax.Concrete: instance GHC.Show.Show Agda.Syntax.Concrete.BoundName
+ Agda.Syntax.Concrete.Definitions: data DeclarationWarning
+ Agda.Syntax.Concrete.Definitions: data Nice a
+ Agda.Syntax.Concrete.Definitions: instance Agda.Syntax.Position.HasRange Agda.Syntax.Concrete.Definitions.DeclarationWarning
+ Agda.Syntax.Concrete.Definitions: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Concrete.Definitions.DeclarationWarning
+ Agda.Syntax.Concrete.Definitions: instance Control.Monad.Error.Class.MonadError Agda.Syntax.Concrete.Definitions.DeclarationException Agda.Syntax.Concrete.Definitions.Nice
+ Agda.Syntax.Concrete.Definitions: instance Control.Monad.State.Class.MonadState Agda.Syntax.Concrete.Definitions.NiceEnv Agda.Syntax.Concrete.Definitions.Nice
+ Agda.Syntax.Concrete.Definitions: instance Data.Data.Data Agda.Syntax.Concrete.Definitions.Clause
+ Agda.Syntax.Concrete.Definitions: instance Data.Data.Data Agda.Syntax.Concrete.Definitions.DataRecOrFun
+ Agda.Syntax.Concrete.Definitions: instance Data.Data.Data Agda.Syntax.Concrete.Definitions.DeclarationException
+ Agda.Syntax.Concrete.Definitions: instance Data.Data.Data Agda.Syntax.Concrete.Definitions.DeclarationWarning
+ Agda.Syntax.Concrete.Definitions: instance Data.Data.Data Agda.Syntax.Concrete.Definitions.KindOfBlock
+ Agda.Syntax.Concrete.Definitions: instance Data.Data.Data Agda.Syntax.Concrete.Definitions.NiceDeclaration
+ Agda.Syntax.Concrete.Definitions: instance GHC.Base.Applicative Agda.Syntax.Concrete.Definitions.Nice
+ Agda.Syntax.Concrete.Definitions: instance GHC.Base.Functor Agda.Syntax.Concrete.Definitions.Nice
+ Agda.Syntax.Concrete.Definitions: instance GHC.Base.Monad Agda.Syntax.Concrete.Definitions.Nice
+ Agda.Syntax.Concrete.Definitions: instance GHC.Show.Show Agda.Syntax.Concrete.Definitions.DeclarationException
+ Agda.Syntax.Concrete.Definitions: instance GHC.Show.Show Agda.Syntax.Concrete.Definitions.DeclarationWarning
+ Agda.Syntax.Concrete.Name: [moduleNameRange] :: TopLevelModuleName -> Range
+ Agda.Syntax.Concrete.Name: data TopLevelModuleName
+ Agda.Syntax.Concrete.Name: instance Agda.Syntax.Position.HasRange Agda.Syntax.Concrete.Name.TopLevelModuleName
+ Agda.Syntax.Concrete.Name: instance Agda.Syntax.Position.KillRange Agda.Syntax.Concrete.Name.TopLevelModuleName
+ Agda.Syntax.Concrete.Name: instance Agda.Syntax.Position.SetRange Agda.Syntax.Concrete.Name.TopLevelModuleName
+ Agda.Syntax.Concrete.Name: instance Data.Data.Data Agda.Syntax.Concrete.Name.Name
+ Agda.Syntax.Concrete.Name: instance Data.Data.Data Agda.Syntax.Concrete.Name.NamePart
+ Agda.Syntax.Concrete.Name: instance Data.Data.Data Agda.Syntax.Concrete.Name.QName
+ Agda.Syntax.Concrete.Name: instance Data.Data.Data Agda.Syntax.Concrete.Name.TopLevelModuleName
+ Agda.Syntax.Concrete.Name: isQualified :: QName -> Bool
+ Agda.Syntax.Concrete.Operators.Parser: satNoPlaceholder :: (e -> Maybe a) -> Parser e a
+ Agda.Syntax.Concrete.Operators.Parser.Monad: doc :: Doc -> Parser tok a -> Parser tok a
+ Agda.Syntax.Concrete.Operators.Parser.Monad: sat' :: (MaybePlaceholder tok -> Maybe a) -> Parser tok a
+ Agda.Syntax.Fixity: appBrackets' :: Bool -> PrecedenceStack -> Bool
+ Agda.Syntax.Fixity: headPrecedence :: PrecedenceStack -> Precedence
+ Agda.Syntax.Fixity: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Fixity.Precedence
+ Agda.Syntax.Fixity: instance Data.Data.Data Agda.Syntax.Fixity.Associativity
+ Agda.Syntax.Fixity: instance Data.Data.Data Agda.Syntax.Fixity.Fixity
+ Agda.Syntax.Fixity: instance Data.Data.Data Agda.Syntax.Fixity.Fixity'
+ Agda.Syntax.Fixity: instance Data.Data.Data Agda.Syntax.Fixity.Precedence
+ Agda.Syntax.Fixity: instance Data.Data.Data Agda.Syntax.Fixity.PrecedenceLevel
+ Agda.Syntax.Fixity: instance Data.Data.Data x => Data.Data.Data (Agda.Syntax.Fixity.ThingWithFixity x)
+ Agda.Syntax.Fixity: lamBrackets' :: Bool -> PrecedenceStack -> Bool
+ Agda.Syntax.Fixity: opBrackets' :: Bool -> Fixity -> PrecedenceStack -> Bool
+ Agda.Syntax.Fixity: pushPrecedence :: Precedence -> PrecedenceStack -> PrecedenceStack
+ Agda.Syntax.Fixity: type PrecedenceStack = [Precedence]
+ Agda.Syntax.Info: LamInfo :: Range -> Origin -> Bool -> LamInfo
+ Agda.Syntax.Info: [lamOrigin] :: LamInfo -> Origin
+ Agda.Syntax.Info: [lamParens] :: LamInfo -> Bool
+ Agda.Syntax.Info: [lamRange] :: LamInfo -> Range
+ Agda.Syntax.Info: data LamInfo
+ Agda.Syntax.Info: defaultLamInfo :: Range -> LamInfo
+ Agda.Syntax.Info: defaultLamInfo_ :: LamInfo
+ Agda.Syntax.Info: instance Agda.Syntax.Common.LensOrigin Agda.Syntax.Info.LamInfo
+ Agda.Syntax.Info: instance Agda.Syntax.Position.HasRange Agda.Syntax.Info.LamInfo
+ Agda.Syntax.Info: instance Agda.Syntax.Position.KillRange Agda.Syntax.Info.LamInfo
+ Agda.Syntax.Info: instance Data.Data.Data Agda.Syntax.Info.ConPatInfo
+ Agda.Syntax.Info: instance Data.Data.Data Agda.Syntax.Info.DeclInfo
+ Agda.Syntax.Info: instance Data.Data.Data Agda.Syntax.Info.DefInfo
+ Agda.Syntax.Info: instance Data.Data.Data Agda.Syntax.Info.ExprInfo
+ Agda.Syntax.Info: instance Data.Data.Data Agda.Syntax.Info.LHSInfo
+ Agda.Syntax.Info: instance Data.Data.Data Agda.Syntax.Info.LamInfo
+ Agda.Syntax.Info: instance Data.Data.Data Agda.Syntax.Info.LetInfo
+ Agda.Syntax.Info: instance Data.Data.Data Agda.Syntax.Info.MetaInfo
+ Agda.Syntax.Info: instance Data.Data.Data Agda.Syntax.Info.ModuleInfo
+ Agda.Syntax.Info: instance Data.Data.Data Agda.Syntax.Info.MutualInfo
+ Agda.Syntax.Info: instance Data.Data.Data Agda.Syntax.Info.PatInfo
+ Agda.Syntax.Info: instance GHC.Classes.Eq Agda.Syntax.Info.LamInfo
+ Agda.Syntax.Info: instance GHC.Classes.Ord Agda.Syntax.Info.LamInfo
+ Agda.Syntax.Info: instance GHC.Show.Show Agda.Syntax.Info.LamInfo
+ Agda.Syntax.Info: instance GHC.Show.Show Agda.Syntax.Info.ModuleInfo
+ Agda.Syntax.Internal: AbsurdP :: (Pattern' x) -> Pattern' x
+ Agda.Syntax.Internal: [clauseFullRange] :: Clause -> Range
+ Agda.Syntax.Internal: [clauseLHSRange] :: Clause -> Range
+ Agda.Syntax.Internal: [clauseUnreachable] :: Clause -> Maybe Bool
+ Agda.Syntax.Internal: [eqtParams] :: EqualityView -> [Arg Term]
+ Agda.Syntax.Internal: class PatternVars a b | b -> a
+ Agda.Syntax.Internal: class TelToArgs a
+ Agda.Syntax.Internal: instance Agda.Syntax.Common.LensOrigin (Agda.Syntax.Internal.Elim' a)
+ Agda.Syntax.Internal: instance Agda.Syntax.Internal.PatternVars a (Agda.Syntax.Common.Arg (Agda.Syntax.Internal.Pattern' a))
+ Agda.Syntax.Internal: instance Agda.Syntax.Internal.PatternVars a (Agda.Syntax.Common.NamedArg (Agda.Syntax.Internal.Pattern' a))
+ Agda.Syntax.Internal: instance Agda.Syntax.Internal.PatternVars a b => Agda.Syntax.Internal.PatternVars a [b]
+ Agda.Syntax.Internal: instance Agda.Syntax.Internal.TelToArgs Agda.Syntax.Internal.ListTel
+ Agda.Syntax.Internal: instance Agda.Syntax.Internal.TelToArgs Agda.Syntax.Internal.Telescope
+ Agda.Syntax.Internal: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Internal.ConHead
+ Agda.Syntax.Internal: instance Agda.Utils.Pretty.Pretty tm => Agda.Utils.Pretty.Pretty (Agda.Syntax.Internal.Elim' tm)
+ Agda.Syntax.Internal: instance Data.Data.Data Agda.Syntax.Internal.Clause
+ Agda.Syntax.Internal: instance Data.Data.Data Agda.Syntax.Internal.ConHead
+ Agda.Syntax.Internal: instance Data.Data.Data Agda.Syntax.Internal.ConPatternInfo
+ Agda.Syntax.Internal: instance Data.Data.Data Agda.Syntax.Internal.DBPatVar
+ Agda.Syntax.Internal: instance Data.Data.Data Agda.Syntax.Internal.Level
+ Agda.Syntax.Internal: instance Data.Data.Data Agda.Syntax.Internal.LevelAtom
+ Agda.Syntax.Internal: instance Data.Data.Data Agda.Syntax.Internal.NotBlocked
+ Agda.Syntax.Internal: instance Data.Data.Data Agda.Syntax.Internal.PlusLevel
+ Agda.Syntax.Internal: instance Data.Data.Data Agda.Syntax.Internal.Sort
+ Agda.Syntax.Internal: instance Data.Data.Data Agda.Syntax.Internal.Term
+ Agda.Syntax.Internal: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Internal.Abs a)
+ Agda.Syntax.Internal: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Internal.Elim' a)
+ Agda.Syntax.Internal: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Internal.Substitution' a)
+ Agda.Syntax.Internal: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Internal.Tele a)
+ Agda.Syntax.Internal: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Internal.Type' a)
+ Agda.Syntax.Internal: instance Data.Data.Data x => Data.Data.Data (Agda.Syntax.Internal.Pattern' x)
+ Agda.Syntax.Internal: isSort :: Term -> Maybe Sort
+ Agda.Syntax.Internal: telFromList :: ListTel -> Telescope
+ Agda.Syntax.Internal: telFromList' :: (a -> ArgName) -> ListTel' a -> Telescope
+ Agda.Syntax.Internal: telToArgs :: TelToArgs a => a -> [Arg ArgName]
+ Agda.Syntax.Internal: telToList :: Telescope -> ListTel
+ Agda.Syntax.Internal: type ListTel = ListTel' ArgName
+ Agda.Syntax.Internal: type ListTel' a = [Dom (a, Type)]
+ Agda.Syntax.Internal.Pattern: class PatternLike a b
+ Agda.Syntax.Internal.Pattern: foldPattern :: (PatternLike a b, Monoid m) => (Pattern' a -> m) -> b -> m
+ Agda.Syntax.Internal.Pattern: foldrPattern :: (PatternLike a b, Monoid m, Foldable f, PatternLike a p, f p ~ b) => (Pattern' a -> m -> m) -> b -> m
+ Agda.Syntax.Internal.Pattern: instance Agda.Syntax.Internal.Pattern.PatternLike a (Agda.Syntax.Internal.Pattern' a)
+ Agda.Syntax.Internal.Pattern: instance Agda.Syntax.Internal.Pattern.PatternLike a b => Agda.Syntax.Internal.Pattern.PatternLike a (Agda.Syntax.Common.Arg b)
+ Agda.Syntax.Internal.Pattern: instance Agda.Syntax.Internal.Pattern.PatternLike a b => Agda.Syntax.Internal.Pattern.PatternLike a (Agda.Syntax.Common.Named x b)
+ Agda.Syntax.Internal.Pattern: instance Agda.Syntax.Internal.Pattern.PatternLike a b => Agda.Syntax.Internal.Pattern.PatternLike a [b]
+ Agda.Syntax.Internal.Pattern: postTraversePatternM :: (PatternLike a b, Monad m) => (Pattern' a -> m (Pattern' a)) -> b -> m b
+ Agda.Syntax.Internal.Pattern: preTraversePatternM :: (PatternLike a b, Monad m) => (Pattern' a -> m (Pattern' a)) -> b -> m b
+ Agda.Syntax.Internal.Pattern: traversePatternM :: (PatternLike a b, Traversable f, PatternLike a p, f p ~ b, Monad m) => (Pattern' a -> m (Pattern' a)) -> (Pattern' a -> m (Pattern' a)) -> b -> m b
+ Agda.Syntax.Literal: instance Data.Data.Data Agda.Syntax.Literal.Literal
+ Agda.Syntax.Notation: instance Data.Data.Data Agda.Syntax.Notation.GenPart
+ Agda.Syntax.Parser.LexActions: beginWith :: LexState -> LexAction a -> LexAction a
+ Agda.Syntax.Parser.Literate: [layerRole] :: Layer -> LayerRole
+ Agda.Syntax.Parser.Literate: atomizeLayers :: Layers -> [(LayerRole, Char)]
+ Agda.Syntax.Parser.Literate: data LayerRole
+ Agda.Syntax.Parser.Literate: instance GHC.Classes.Eq Agda.Syntax.Parser.Literate.LayerRole
+ Agda.Syntax.Parser.Literate: instance GHC.Show.Show Agda.Syntax.Parser.Literate.LayerRole
+ Agda.Syntax.Parser.Literate: isCodeLayer :: Layer -> Bool
+ Agda.Syntax.Parser.Literate: literateMd :: Position -> String -> [Layer]
+ Agda.Syntax.Parser.Literate: type Layers = [Layer]
+ Agda.Syntax.Parser.Monad: instance Data.Data.Data Agda.Syntax.Parser.Monad.ParseWarning
+ Agda.Syntax.Parser.Tokens: KwCOMPILE :: Keyword
+ Agda.Syntax.Parser.Tokens: KwETA :: Keyword
+ Agda.Syntax.Parser.Tokens: KwFOREIGN :: Keyword
+ Agda.Syntax.Parser.Tokens: KwINJECTIVE :: Keyword
+ Agda.Syntax.Position: instance (GHC.Classes.Ord a, Agda.Syntax.Position.KillRange a) => Agda.Syntax.Position.KillRange (Data.Set.Internal.Set a)
+ Agda.Syntax.Position: instance Agda.Syntax.Position.KillRange a => Agda.Syntax.Position.KillRange (Data.Map.Internal.Map k a)
+ Agda.Syntax.Position: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Position.Interval' a)
+ Agda.Syntax.Position: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Position.Position' a)
+ Agda.Syntax.Position: instance Data.Data.Data a => Data.Data.Data (Agda.Syntax.Position.Range' a)
+ Agda.Syntax.Scope.Base: [localLetBound] :: LocalVar -> Bool
+ Agda.Syntax.Scope.Base: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Scope.Base.AbstractModule
+ Agda.Syntax.Scope.Base: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Scope.Base.AbstractName
+ Agda.Syntax.Scope.Base: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Scope.Base.LocalVar
+ Agda.Syntax.Scope.Base: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Scope.Base.NameSpace
+ Agda.Syntax.Scope.Base: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Scope.Base.NameSpaceId
+ Agda.Syntax.Scope.Base: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Scope.Base.Scope
+ Agda.Syntax.Scope.Base: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Scope.Base.ScopeInfo
+ Agda.Syntax.Scope.Base: instance Data.Data.Data Agda.Syntax.Scope.Base.AbstractModule
+ Agda.Syntax.Scope.Base: instance Data.Data.Data Agda.Syntax.Scope.Base.AbstractName
+ Agda.Syntax.Scope.Base: instance Data.Data.Data Agda.Syntax.Scope.Base.KindOfName
+ Agda.Syntax.Scope.Base: instance Data.Data.Data Agda.Syntax.Scope.Base.LocalVar
+ Agda.Syntax.Scope.Base: instance Data.Data.Data Agda.Syntax.Scope.Base.NameSpace
+ Agda.Syntax.Scope.Base: instance Data.Data.Data Agda.Syntax.Scope.Base.NameSpaceId
+ Agda.Syntax.Scope.Base: instance Data.Data.Data Agda.Syntax.Scope.Base.Scope
+ Agda.Syntax.Scope.Base: instance Data.Data.Data Agda.Syntax.Scope.Base.ScopeInfo
+ Agda.Syntax.Scope.Base: instance Data.Data.Data Agda.Syntax.Scope.Base.WhyInScope
+ Agda.Syntax.Scope.Base: instance GHC.Show.Show Agda.Syntax.Scope.Base.WhyInScope
+ Agda.Syntax.Scope.Base: prettyNameSpace :: NameSpace -> [Doc]
+ Agda.Syntax.Scope.Monad: [resolvedLetBound] :: ResolvedName -> Bool
+ Agda.Syntax.Scope.Monad: [resolvedVar] :: ResolvedName -> Name
+ Agda.Syntax.Scope.Monad: instance Agda.Utils.Pretty.Pretty Agda.Syntax.Scope.Monad.ResolvedName
+ Agda.Syntax.Scope.Monad: popContextPrecedence :: ScopeM ()
+ Agda.Syntax.Scope.Monad: pushContextPrecedence :: Precedence -> ScopeM ()
+ Agda.Syntax.Translation.AbstractToConcrete: instance Agda.Syntax.Translation.AbstractToConcrete.ToConcrete (Agda.Syntax.Translation.AbstractToConcrete.SplitPattern (Agda.Syntax.Common.NamedArg Agda.Syntax.Abstract.Pattern)) (Agda.Syntax.Common.NamedArg Agda.Syntax.Abstract.Pattern)
+ Agda.Syntax.Translation.AbstractToConcrete: instance Agda.Syntax.Translation.AbstractToConcrete.ToConcrete (Agda.Syntax.Translation.AbstractToConcrete.SplitPattern Agda.Syntax.Abstract.Pattern) Agda.Syntax.Abstract.Pattern
+ Agda.Syntax.Translation.AbstractToConcrete: instance Agda.Syntax.Translation.AbstractToConcrete.ToConcrete (Agda.Syntax.Translation.AbstractToConcrete.UserPattern (Agda.Syntax.Common.NamedArg Agda.Syntax.Abstract.Pattern)) (Agda.Syntax.Common.NamedArg Agda.Syntax.Abstract.Pattern)
+ Agda.Syntax.Translation.AbstractToConcrete: instance Agda.Syntax.Translation.AbstractToConcrete.ToConcrete (Agda.Syntax.Translation.AbstractToConcrete.UserPattern Agda.Syntax.Abstract.Pattern) Agda.Syntax.Abstract.Pattern
+ Agda.Syntax.Translation.InternalToAbstract: instance (Agda.TypeChecking.Free.Lazy.Free i, Agda.Syntax.Translation.InternalToAbstract.Reify i a) => Agda.Syntax.Translation.InternalToAbstract.Reify (Agda.Syntax.Internal.Abs i) (Agda.Syntax.Abstract.Name.Name, a)
+ Agda.Syntax.Translation.InternalToAbstract: instance Agda.Syntax.Translation.InternalToAbstract.BlankVars Agda.Syntax.Abstract.StrippedDotPattern
+ Agda.Syntax.Translation.InternalToAbstract: instance Agda.Syntax.Translation.InternalToAbstract.BlankVars a => Agda.Syntax.Translation.InternalToAbstract.BlankVars (Agda.Syntax.Abstract.Pattern' a)
+ Agda.Syntax.Treeless: instance Data.Data.Data Agda.Syntax.Treeless.CaseType
+ Agda.Syntax.Treeless: instance Data.Data.Data Agda.Syntax.Treeless.Compiled
+ Agda.Syntax.Treeless: instance Data.Data.Data Agda.Syntax.Treeless.TAlt
+ Agda.Syntax.Treeless: instance Data.Data.Data Agda.Syntax.Treeless.TError
+ Agda.Syntax.Treeless: instance Data.Data.Data Agda.Syntax.Treeless.TPrim
+ Agda.Syntax.Treeless: instance Data.Data.Data Agda.Syntax.Treeless.TTerm
+ Agda.Termination.Monad: [terHaveInlinedWith] :: TerEnv -> Bool
+ Agda.Termination.Monad: instance (Data.Semigroup.Semigroup m, GHC.Base.Monoid m) => GHC.Base.Monoid (Agda.Termination.Monad.TerM m)
+ Agda.Termination.Monad: instance Agda.Termination.Monad.UsableSizeVars (Agda.Termination.Monad.Masked Agda.Syntax.Internal.DeBruijnPattern)
+ Agda.Termination.Monad: instance Agda.Termination.Monad.UsableSizeVars Agda.Syntax.Internal.DeBruijnPattern
+ Agda.Termination.Monad: instance Agda.Termination.Monad.UsableSizeVars Agda.Termination.Monad.MaskedDeBruijnPatterns
+ Agda.Termination.Monad: instance Agda.Termination.Monad.UsableSizeVars [Agda.Syntax.Internal.DeBruijnPattern]
+ Agda.Termination.Monad: instance Agda.TypeChecking.Monad.Base.HasOptions Agda.Termination.Monad.TerM
+ Agda.Termination.Monad: instance Agda.TypeChecking.Monad.Debug.MonadDebug Agda.Termination.Monad.TerM
+ Agda.Termination.Monad: instance Data.Semigroup.Semigroup m => Data.Semigroup.Semigroup (Agda.Termination.Monad.TerM m)
+ Agda.Termination.Monad: terGetHaveInlinedWith :: TerM Bool
+ Agda.Termination.Monad: terSetHaveInlinedWith :: TerM a -> TerM a
+ Agda.Termination.Monad: type MaskedDeBruijnPatterns = [Masked DeBruijnPattern]
+ Agda.Termination.Order: setUsability :: Bool -> Order -> Order
+ Agda.Termination.SparseMatrix: zipAssocWith :: (Ord i) => ([(i, a)] -> [(i, c)]) -> ([(i, b)] -> [(i, c)]) -> (a -> Maybe c) -> (b -> Maybe c) -> (a -> b -> Maybe c) -> [(i, a)] -> [(i, b)] -> [(i, c)]
+ Agda.Termination.TermCheck: instance Agda.Termination.TermCheck.TermToPattern Agda.Syntax.Internal.Term Agda.Syntax.Internal.DeBruijnPattern
+ Agda.Termination.TermCheck: instance Agda.Termination.TermCheck.TermToPattern a b => Agda.Termination.TermCheck.TermToPattern (Agda.Syntax.Common.Arg a) (Agda.Syntax.Common.Arg b)
+ Agda.Termination.TermCheck: instance Agda.Termination.TermCheck.TermToPattern a b => Agda.Termination.TermCheck.TermToPattern (Agda.Syntax.Common.Named c a) (Agda.Syntax.Common.Named c b)
+ Agda.Termination.TermCheck: instance Agda.Termination.TermCheck.TermToPattern a b => Agda.Termination.TermCheck.TermToPattern [a] [b]
+ Agda.TypeChecking.CheckInternal: [relevanceAction] :: Action -> Relevance -> Relevance -> Relevance
+ Agda.TypeChecking.CheckInternal: eraseUnusedAction :: Action
+ Agda.TypeChecking.CheckInternal: inferSort :: Term -> TCM Sort
+ Agda.TypeChecking.CompiledClause: data CompiledClauses' a
+ Agda.TypeChecking.CompiledClause: instance (Data.Semigroup.Semigroup c, GHC.Base.Monoid c) => GHC.Base.Monoid (Agda.TypeChecking.CompiledClause.WithArity c)
+ Agda.TypeChecking.CompiledClause: instance (Data.Semigroup.Semigroup m, GHC.Base.Monoid m) => GHC.Base.Monoid (Agda.TypeChecking.CompiledClause.Case m)
+ Agda.TypeChecking.CompiledClause: instance Agda.Syntax.Internal.Generic.TermLike a => Agda.Syntax.Internal.Generic.TermLike (Agda.TypeChecking.CompiledClause.Case a)
+ Agda.TypeChecking.CompiledClause: instance Agda.Syntax.Internal.Generic.TermLike a => Agda.Syntax.Internal.Generic.TermLike (Agda.TypeChecking.CompiledClause.CompiledClauses' a)
+ Agda.TypeChecking.CompiledClause: instance Agda.Syntax.Internal.Generic.TermLike a => Agda.Syntax.Internal.Generic.TermLike (Agda.TypeChecking.CompiledClause.WithArity a)
+ Agda.TypeChecking.CompiledClause: instance Data.Data.Data a => Data.Data.Data (Agda.TypeChecking.CompiledClause.CompiledClauses' a)
+ Agda.TypeChecking.CompiledClause: instance Data.Data.Data c => Data.Data.Data (Agda.TypeChecking.CompiledClause.Case c)
+ Agda.TypeChecking.CompiledClause: instance Data.Data.Data c => Data.Data.Data (Agda.TypeChecking.CompiledClause.WithArity c)
+ Agda.TypeChecking.CompiledClause: instance Data.Foldable.Foldable Agda.TypeChecking.CompiledClause.CompiledClauses'
+ Agda.TypeChecking.CompiledClause: instance Data.Semigroup.Semigroup c => Data.Semigroup.Semigroup (Agda.TypeChecking.CompiledClause.WithArity c)
+ Agda.TypeChecking.CompiledClause: instance Data.Semigroup.Semigroup m => Data.Semigroup.Semigroup (Agda.TypeChecking.CompiledClause.Case m)
+ Agda.TypeChecking.CompiledClause: instance Data.Traversable.Traversable Agda.TypeChecking.CompiledClause.CompiledClauses'
+ Agda.TypeChecking.CompiledClause: instance GHC.Base.Functor Agda.TypeChecking.CompiledClause.CompiledClauses'
+ Agda.TypeChecking.CompiledClause: instance GHC.Show.Show a => GHC.Show.Show (Agda.TypeChecking.CompiledClause.CompiledClauses' a)
+ Agda.TypeChecking.CompiledClause: instance GHC.Show.Show c => GHC.Show.Show (Agda.TypeChecking.CompiledClause.Case c)
+ Agda.TypeChecking.CompiledClause: instance GHC.Show.Show c => GHC.Show.Show (Agda.TypeChecking.CompiledClause.WithArity c)
+ Agda.TypeChecking.CompiledClause: type CompiledClauses = CompiledClauses' Term
+ Agda.TypeChecking.Conversion: antiUnify :: ProblemId -> Type -> Term -> Term -> TCM Term
+ Agda.TypeChecking.Conversion: antiUnifyElims :: ProblemId -> Type -> Term -> Elims -> Elims -> TCM Term
+ Agda.TypeChecking.Conversion: antiUnifyType :: ProblemId -> Type -> Type -> TCM Type
+ Agda.TypeChecking.Conversion: computeElimHeadType :: QName -> Elims -> Elims -> TCM Type
+ Agda.TypeChecking.Coverage.Match: instance (Data.Semigroup.Semigroup a, GHC.Base.Monoid a) => GHC.Base.Monoid (Agda.TypeChecking.Coverage.Match.Match a)
+ Agda.TypeChecking.Coverage.Match: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Coverage.Match.BlockingVar
+ Agda.TypeChecking.Coverage.Match: instance Data.Semigroup.Semigroup a => Data.Semigroup.Semigroup (Agda.TypeChecking.Coverage.Match.Match a)
+ Agda.TypeChecking.Coverage.SplitTree: instance Agda.Utils.Pretty.Pretty a => Agda.Utils.Pretty.Pretty (Agda.TypeChecking.Coverage.SplitTree.SplitTree' a)
+ Agda.TypeChecking.Coverage.SplitTree: instance Agda.Utils.Pretty.Pretty a => Agda.Utils.Pretty.Pretty (Agda.TypeChecking.Coverage.SplitTree.SplitTreeLabel a)
+ Agda.TypeChecking.Datatypes: getFullyAppliedConType :: ConHead -> Type -> TCM (Maybe ((QName, Type, Args), Type))
+ Agda.TypeChecking.DisplayForm: class SubstWithOrigin a
+ Agda.TypeChecking.DisplayForm: instance Agda.TypeChecking.DisplayForm.SubstWithOrigin (Agda.Syntax.Common.Arg Agda.Syntax.Internal.Term)
+ Agda.TypeChecking.DisplayForm: instance Agda.TypeChecking.DisplayForm.SubstWithOrigin (Agda.Syntax.Common.Arg Agda.TypeChecking.Monad.Base.DisplayTerm)
+ Agda.TypeChecking.DisplayForm: instance Agda.TypeChecking.DisplayForm.SubstWithOrigin (Agda.Syntax.Common.Arg a) => Agda.TypeChecking.DisplayForm.SubstWithOrigin (Agda.Syntax.Internal.Elim' a)
+ Agda.TypeChecking.DisplayForm: instance Agda.TypeChecking.DisplayForm.SubstWithOrigin Agda.Syntax.Internal.Term
+ Agda.TypeChecking.DisplayForm: instance Agda.TypeChecking.DisplayForm.SubstWithOrigin Agda.TypeChecking.Monad.Base.DisplayTerm
+ Agda.TypeChecking.DisplayForm: instance Agda.TypeChecking.DisplayForm.SubstWithOrigin a => Agda.TypeChecking.DisplayForm.SubstWithOrigin [a]
+ Agda.TypeChecking.DisplayForm: substWithOrigin :: SubstWithOrigin a => Substitution -> [WithOrigin Term] -> a -> a
+ Agda.TypeChecking.Empty: instance Data.Semigroup.Semigroup Agda.TypeChecking.Empty.ErrorNonEmpty
+ Agda.TypeChecking.Empty: instance GHC.Base.Monoid Agda.TypeChecking.Empty.ErrorNonEmpty
+ Agda.TypeChecking.Errors: dropTopLevelModule :: QName -> TCM QName
+ Agda.TypeChecking.Errors: instance Agda.TypeChecking.Pretty.PrettyTCM Agda.TypeChecking.Monad.Base.NegativeUnification
+ Agda.TypeChecking.Errors: instance Agda.TypeChecking.Pretty.PrettyTCM Agda.TypeChecking.Monad.Base.UnificationFailure
+ Agda.TypeChecking.Errors: prettyTCWarnings' :: [TCWarning] -> TCM [String]
+ Agda.TypeChecking.Errors: prettyWarning :: MonadTCM tcm => Warning -> tcm Doc
+ Agda.TypeChecking.Errors: sayWhen :: Range -> Maybe (Closure Call) -> TCM Doc -> TCM Doc
+ Agda.TypeChecking.Errors: stringTCErr :: String -> TCErr
+ Agda.TypeChecking.Free: class Free a
+ Agda.TypeChecking.Free: class (Semigroup a, Monoid a) => IsVarSet a
+ Agda.TypeChecking.Free: instance Agda.TypeChecking.Free.Lazy.IsVarSet Agda.TypeChecking.Free.FreeVars
+ Agda.TypeChecking.Free: instance Agda.TypeChecking.Free.Lazy.IsVarSet Agda.TypeChecking.Free.VarSet
+ Agda.TypeChecking.Free: instance Agda.TypeChecking.Free.Lazy.IsVarSet Data.Monoid.All
+ Agda.TypeChecking.Free: instance Agda.TypeChecking.Free.Lazy.IsVarSet Data.Monoid.Any
+ Agda.TypeChecking.Free: instance Agda.TypeChecking.Free.Lazy.IsVarSet [GHC.Types.Int]
+ Agda.TypeChecking.Free: instance Agda.TypeChecking.Free.Lazy.IsVarSet a => Agda.TypeChecking.Free.Lazy.IsVarSet (Agda.TypeChecking.Free.RelevantIn a)
+ Agda.TypeChecking.Free: instance Data.Semigroup.Semigroup a => Data.Semigroup.Semigroup (Agda.TypeChecking.Free.RelevantIn a)
+ Agda.TypeChecking.Free: instance GHC.Base.Monoid a => GHC.Base.Monoid (Agda.TypeChecking.Free.RelevantIn a)
+ Agda.TypeChecking.Free: withVarOcc :: IsVarSet a => VarOcc -> a -> a
+ Agda.TypeChecking.Free.Lazy: class Free a
+ Agda.TypeChecking.Free.Lazy: class (Semigroup a, Monoid a) => IsVarSet a
+ Agda.TypeChecking.Free.Lazy: composeVarOcc :: VarOcc -> VarOcc -> VarOcc
+ Agda.TypeChecking.Free.Lazy: instance (Agda.TypeChecking.Free.Lazy.Free a, Agda.TypeChecking.Free.Lazy.Free b) => Agda.TypeChecking.Free.Lazy.Free (a, b)
+ Agda.TypeChecking.Free.Lazy: instance (Data.Semigroup.Semigroup c, GHC.Base.Monoid c) => GHC.Base.Monoid (Agda.TypeChecking.Free.Lazy.FreeM c)
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free Agda.Syntax.Internal.Clause
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free Agda.Syntax.Internal.EqualityView
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free Agda.Syntax.Internal.Level
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free Agda.Syntax.Internal.LevelAtom
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free Agda.Syntax.Internal.PlusLevel
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free Agda.Syntax.Internal.Sort
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free Agda.Syntax.Internal.Term
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free a => Agda.TypeChecking.Free.Lazy.Free (Agda.Syntax.Common.Arg a)
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free a => Agda.TypeChecking.Free.Lazy.Free (Agda.Syntax.Common.Dom a)
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free a => Agda.TypeChecking.Free.Lazy.Free (Agda.Syntax.Internal.Abs a)
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free a => Agda.TypeChecking.Free.Lazy.Free (Agda.Syntax.Internal.Elim' a)
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free a => Agda.TypeChecking.Free.Lazy.Free (Agda.Syntax.Internal.Tele a)
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free a => Agda.TypeChecking.Free.Lazy.Free (Agda.Syntax.Internal.Type' a)
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free a => Agda.TypeChecking.Free.Lazy.Free (GHC.Base.Maybe a)
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.Free a => Agda.TypeChecking.Free.Lazy.Free [a]
+ Agda.TypeChecking.Free.Lazy: instance Agda.TypeChecking.Free.Lazy.IsVarSet Agda.TypeChecking.Free.Lazy.VarMap
+ Agda.TypeChecking.Free.Lazy: instance Data.Semigroup.Semigroup c => Data.Semigroup.Semigroup (Agda.TypeChecking.Free.Lazy.FreeM c)
+ Agda.TypeChecking.Free.Lazy: runFreeM :: IsVarSet c => SingleVar c -> IgnoreSorts -> FreeM c -> c
+ Agda.TypeChecking.Free.Lazy: subVar :: Int -> Maybe Variable -> Maybe Variable
+ Agda.TypeChecking.Free.Lazy: withVarOcc :: IsVarSet a => VarOcc -> a -> a
+ Agda.TypeChecking.Functions: etaExpandClause :: MonadTCM tcm => Clause -> tcm Clause
+ Agda.TypeChecking.Functions: getDef :: Term -> TCM (Maybe QName)
+ Agda.TypeChecking.Monad.Base: AbstractConstructorNotInScope :: QName -> TypeError
+ Agda.TypeChecking.Monad.Base: CompilerPragma :: Range -> String -> CompilerPragma
+ Agda.TypeChecking.Monad.Base: CoverageIssue :: QName -> [(Telescope, [NamedArg DeBruijnPattern])] -> Warning
+ Agda.TypeChecking.Monad.Base: DeprecationWarning :: String -> String -> String -> Warning
+ Agda.TypeChecking.Monad.Base: ForeignCode :: Range -> String -> ForeignCode
+ Agda.TypeChecking.Monad.Base: GenericNonFatalError :: Doc -> Warning
+ Agda.TypeChecking.Monad.Base: GenericWarning :: Doc -> Warning
+ Agda.TypeChecking.Monad.Base: ImpossibleConstructor :: QName -> NegativeUnification -> TypeError
+ Agda.TypeChecking.Monad.Base: NicifierIssue :: [DeclarationWarning] -> Warning
+ Agda.TypeChecking.Monad.Base: RecursiveReductions :: AllowedReduction
+ Agda.TypeChecking.Monad.Base: UnconfirmedReductions :: AllowedReduction
+ Agda.TypeChecking.Monad.Base: UnifyRecursiveEq :: Telescope -> Type -> Int -> Term -> UnificationFailure
+ Agda.TypeChecking.Monad.Base: UnifyReflexiveEq :: Telescope -> Type -> Term -> UnificationFailure
+ Agda.TypeChecking.Monad.Base: UselessInline :: QName -> Warning
+ Agda.TypeChecking.Monad.Base: UselessPublic :: Warning
+ Agda.TypeChecking.Monad.Base: [cantSplitFailures] :: SplitError -> [UnificationFailure]
+ Agda.TypeChecking.Monad.Base: [conArity] :: Defn -> Int
+ Agda.TypeChecking.Monad.Base: [defInjective] :: Definition -> Bool
+ Agda.TypeChecking.Monad.Base: [iForeignCode] :: Interface -> Map BackendName [ForeignCode]
+ Agda.TypeChecking.Monad.Base: [iWarnings] :: Interface -> [TCWarning]
+ Agda.TypeChecking.Monad.Base: [ipSolved] :: InteractionPoint -> Bool
+ Agda.TypeChecking.Monad.Base: [stPersistBackends] :: PersistentTCState -> [Backend]
+ Agda.TypeChecking.Monad.Base: [stPreForeignCode] :: PreScopeState -> !(Map BackendName [ForeignCode])
+ Agda.TypeChecking.Monad.Base: [tcWarningPrintedWarning] :: TCWarning -> Doc
+ Agda.TypeChecking.Monad.Base: [tcWarningRange] :: TCWarning -> Range
+ Agda.TypeChecking.Monad.Base: [tcWarning] :: TCWarning -> Warning
+ Agda.TypeChecking.Monad.Base: class (Functor m, Applicative m, Monad m) => HasOptions m
+ Agda.TypeChecking.Monad.Base: commandLineOptions :: HasOptions m => m CommandLineOptions
+ Agda.TypeChecking.Monad.Base: data CompilerPragma
+ Agda.TypeChecking.Monad.Base: data ForeignCode
+ Agda.TypeChecking.Monad.Base: data NegativeUnification
+ Agda.TypeChecking.Monad.Base: data UnificationFailure
+ Agda.TypeChecking.Monad.Base: defCompilerPragmas :: BackendName -> Definition -> [CompilerPragma]
+ Agda.TypeChecking.Monad.Base: defConstructors :: Defn -> [QName]
+ Agda.TypeChecking.Monad.Base: defTerminationUnconfirmed :: Definition -> Bool
+ Agda.TypeChecking.Monad.Base: equalHeadConstructors :: Warning -> Warning -> Bool
+ Agda.TypeChecking.Monad.Base: getPartialDefs :: ReadTCState tcm => tcm [QName]
+ Agda.TypeChecking.Monad.Base: ghcBackendName :: BackendName
+ Agda.TypeChecking.Monad.Base: ifTopLevelAndHighlightingLevelIsOr :: MonadTCM tcm => HighlightingLevel -> Bool -> tcm () -> tcm ()
+ Agda.TypeChecking.Monad.Base: instance (Agda.TypeChecking.Monad.Base.HasOptions m, GHC.Base.Monoid w) => Agda.TypeChecking.Monad.Base.HasOptions (Control.Monad.Trans.Writer.Lazy.WriterT w m)
+ Agda.TypeChecking.Monad.Base: instance Agda.Syntax.Position.HasRange Agda.TypeChecking.Monad.Base.CompilerPragma
+ Agda.TypeChecking.Monad.Base: instance Agda.Syntax.Position.HasRange Agda.TypeChecking.Monad.Base.TCWarning
+ Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Free.Lazy.Free Agda.TypeChecking.Monad.Base.Candidate
+ Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Free.Lazy.Free Agda.TypeChecking.Monad.Base.Constraint
+ Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Free.Lazy.Free Agda.TypeChecking.Monad.Base.DisplayForm
+ Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Free.Lazy.Free Agda.TypeChecking.Monad.Base.DisplayTerm
+ Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Monad.Base.HasOptions m => Agda.TypeChecking.Monad.Base.HasOptions (Agda.Utils.ListT.ListT m)
+ Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Monad.Base.HasOptions m => Agda.TypeChecking.Monad.Base.HasOptions (Control.Monad.Trans.Except.ExceptT e m)
+ Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Monad.Base.HasOptions m => Agda.TypeChecking.Monad.Base.HasOptions (Control.Monad.Trans.Maybe.MaybeT m)
+ Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Monad.Base.HasOptions m => Agda.TypeChecking.Monad.Base.HasOptions (Control.Monad.Trans.Reader.ReaderT r m)
+ Agda.TypeChecking.Monad.Base: instance Agda.TypeChecking.Monad.Base.HasOptions m => Agda.TypeChecking.Monad.Base.HasOptions (Control.Monad.Trans.State.Lazy.StateT s m)
+ Agda.TypeChecking.Monad.Base: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Monad.Base.CompareDirection
+ Agda.TypeChecking.Monad.Base: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Monad.Base.Definition
+ Agda.TypeChecking.Monad.Base: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Monad.Base.Defn
+ Agda.TypeChecking.Monad.Base: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Monad.Base.DisplayTerm
+ Agda.TypeChecking.Monad.Base: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Monad.Base.Polarity
+ Agda.TypeChecking.Monad.Base: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Monad.Base.Section
+ Agda.TypeChecking.Monad.Base: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Monad.Base.TermHead
+ Agda.TypeChecking.Monad.Base: instance Control.Monad.IO.Class.MonadIO m => Agda.TypeChecking.Monad.Base.HasOptions (Agda.TypeChecking.Monad.Base.TCMT m)
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.AbstractMode
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.AllowedReduction
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.Call
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.CallInfo
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.Candidate
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.Comparison
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.CompilerPragma
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.Constraint
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.ContextEntry
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.CtxId
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.Definition
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.Defn
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.DisplayForm
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.DisplayTerm
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.EtaEquality
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.ExpandHidden
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.ExplicitToInstance
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.ExtLamInfo
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.FunctionFlag
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.HighlightingLevel
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.HighlightingMethod
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.IPClause
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.ModuleParameters
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.MutualId
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.NLPType
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.NLPat
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.Polarity
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.ProblemConstraint
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.ProblemId
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.ProjLams
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.Projection
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.RewriteRule
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.Section
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.Signature
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.Simplification
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.TCEnv
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.TermHead
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.TerminationError
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.UnquoteFlags
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data Agda.TypeChecking.Monad.Base.Warning
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data a => Data.Data.Data (Agda.TypeChecking.Monad.Base.Closure a)
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data a => Data.Data.Data (Agda.TypeChecking.Monad.Base.Local a)
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data a => Data.Data.Data (Agda.TypeChecking.Monad.Base.Open a)
+ Agda.TypeChecking.Monad.Base: instance Data.Data.Data c => Data.Data.Data (Agda.TypeChecking.Monad.Base.FunctionInverse' c)
+ Agda.TypeChecking.Monad.Base: instance Data.Foldable.Foldable Agda.TypeChecking.Monad.Base.Open
+ Agda.TypeChecking.Monad.Base: instance Data.Traversable.Traversable Agda.TypeChecking.Monad.Base.Open
+ Agda.TypeChecking.Monad.Base: instance GHC.Classes.Eq Agda.TypeChecking.Monad.Base.CompilerPragma
+ Agda.TypeChecking.Monad.Base: instance GHC.Classes.Eq Agda.TypeChecking.Monad.Base.TCWarning
+ Agda.TypeChecking.Monad.Base: instance GHC.Show.Show Agda.TypeChecking.Monad.Base.CompilerPragma
+ Agda.TypeChecking.Monad.Base: instance GHC.Show.Show Agda.TypeChecking.Monad.Base.ForeignCode
+ Agda.TypeChecking.Monad.Base: instance GHC.Show.Show Agda.TypeChecking.Monad.Base.NegativeUnification
+ Agda.TypeChecking.Monad.Base: instance GHC.Show.Show Agda.TypeChecking.Monad.Base.UnificationFailure
+ Agda.TypeChecking.Monad.Base: jsBackendName :: BackendName
+ Agda.TypeChecking.Monad.Base: newtype Section
+ Agda.TypeChecking.Monad.Base: pragmaOptions :: HasOptions m => m PragmaOptions
+ Agda.TypeChecking.Monad.Base: recRecursive :: Defn -> Bool
+ Agda.TypeChecking.Monad.Base: stBackends :: Lens' [Backend] TCState
+ Agda.TypeChecking.Monad.Base: stForeignCode :: Lens' (Map BackendName [ForeignCode]) TCState
+ Agda.TypeChecking.Monad.Base: tcWarningOrigin :: TCWarning -> SrcFile
+ Agda.TypeChecking.Monad.Base: type BackendName = String
+ Agda.TypeChecking.Monad.Base: type CompiledRepresentation = Map BackendName [CompilerPragma]
+ Agda.TypeChecking.Monad.Base: uhcBackendName :: BackendName
+ Agda.TypeChecking.Monad.Builtin: builtinAgdaTCMDebugPrint :: String
+ Agda.TypeChecking.Monad.Builtin: primAgdaTCMDebugPrint :: TCM Term
+ Agda.TypeChecking.Monad.Caching: noCacheForImportedModule :: TCM a -> TCM a
+ Agda.TypeChecking.Monad.Constraints: addAwakeConstraint' :: Constraint -> TCM ()
+ Agda.TypeChecking.Monad.Constraints: addConstraintTo :: Lens' Constraints TCState -> Constraint -> TCM ()
+ Agda.TypeChecking.Monad.Context: KeepNames :: a -> KeepNames a
+ Agda.TypeChecking.Monad.Context: instance Agda.TypeChecking.Monad.Context.AddContext (Agda.TypeChecking.Monad.Context.KeepNames Agda.Syntax.Internal.Telescope)
+ Agda.TypeChecking.Monad.Context: instance Agda.TypeChecking.Monad.Context.AddContext (Agda.TypeChecking.Monad.Context.KeepNames GHC.Base.String, Agda.Syntax.Common.Dom Agda.Syntax.Internal.Type)
+ Agda.TypeChecking.Monad.Context: newtype KeepNames a
+ Agda.TypeChecking.Monad.Context: underAbstraction' :: (Subst t a, MonadTCM tcm, AddContext (name, Dom Type)) => (String -> name) -> Dom Type -> Abs a -> (a -> tcm b) -> tcm b
+ Agda.TypeChecking.Monad.Debug: class (Functor m, Applicative m, Monad m) => MonadDebug m
+ Agda.TypeChecking.Monad.Debug: displayDebugMessage :: MonadDebug m => Int -> String -> m ()
+ Agda.TypeChecking.Monad.Debug: formatDebugMessage :: MonadDebug m => VerboseKey -> Int -> TCM Doc -> m String
+ Agda.TypeChecking.Monad.Debug: instance (Agda.TypeChecking.Monad.Debug.MonadDebug m, GHC.Base.Monoid w) => Agda.TypeChecking.Monad.Debug.MonadDebug (Control.Monad.Trans.Writer.Lazy.WriterT w m)
+ Agda.TypeChecking.Monad.Debug: instance Agda.TypeChecking.Monad.Debug.MonadDebug m => Agda.TypeChecking.Monad.Debug.MonadDebug (Agda.Utils.ListT.ListT m)
+ Agda.TypeChecking.Monad.Debug: instance Agda.TypeChecking.Monad.Debug.MonadDebug m => Agda.TypeChecking.Monad.Debug.MonadDebug (Control.Monad.Trans.Except.ExceptT e m)
+ Agda.TypeChecking.Monad.Debug: instance Agda.TypeChecking.Monad.Debug.MonadDebug m => Agda.TypeChecking.Monad.Debug.MonadDebug (Control.Monad.Trans.Maybe.MaybeT m)
+ Agda.TypeChecking.Monad.Debug: instance Agda.TypeChecking.Monad.Debug.MonadDebug m => Agda.TypeChecking.Monad.Debug.MonadDebug (Control.Monad.Trans.Reader.ReaderT r m)
+ Agda.TypeChecking.Monad.Debug: instance Agda.TypeChecking.Monad.Debug.MonadDebug m => Agda.TypeChecking.Monad.Debug.MonadDebug (Control.Monad.Trans.State.Lazy.StateT s m)
+ Agda.TypeChecking.Monad.Debug: instance Control.Monad.IO.Class.MonadIO m => Agda.TypeChecking.Monad.Debug.MonadDebug (Agda.TypeChecking.Monad.Base.TCMT m)
+ Agda.TypeChecking.Monad.Debug: reportS :: (HasOptions m, MonadDebug m) => VerboseKey -> Int -> String -> m ()
+ Agda.TypeChecking.Monad.Debug: reportSDoc :: (HasOptions m, MonadDebug m) => VerboseKey -> Int -> TCM Doc -> m ()
+ Agda.TypeChecking.Monad.Debug: reportSLn :: (HasOptions m, MonadDebug m) => VerboseKey -> Int -> String -> m ()
+ Agda.TypeChecking.Monad.Debug: traceDebugMessage :: MonadDebug m => Int -> String -> m a -> m a
+ Agda.TypeChecking.Monad.Debug: traceSDoc :: (HasOptions m, MonadDebug m) => VerboseKey -> Int -> TCM Doc -> m a -> m a
+ Agda.TypeChecking.Monad.Debug: traceSLn :: (HasOptions m, MonadDebug m) => VerboseKey -> Int -> String -> m a -> m a
+ Agda.TypeChecking.Monad.Debug: verboseBracket :: (HasOptions m, MonadDebug m, MonadError err m) => VerboseKey -> Int -> String -> m a -> m a
+ Agda.TypeChecking.Monad.MetaVars: setMetaOccursCheck :: MetaId -> RunMetaOccursCheck -> TCM ()
+ Agda.TypeChecking.Monad.Options: hasExactVerbosity :: HasOptions m => VerboseKey -> Int -> m Bool
+ Agda.TypeChecking.Monad.Options: whenExactVerbosity :: MonadTCM tcm => VerboseKey -> Int -> tcm () -> tcm ()
+ Agda.TypeChecking.Monad.Options: withPragmaOptions :: (PragmaOptions -> PragmaOptions) -> TCM a -> TCM a
+ Agda.TypeChecking.Monad.Signature: SigAbstract :: SigError
+ Agda.TypeChecking.Monad.Signature: SigUnknown :: String -> SigError
+ Agda.TypeChecking.Monad.Signature: addDeprecatedPragma :: String -> BackendName -> QName -> String -> TCM ()
+ Agda.TypeChecking.Monad.Signature: addHaskellData :: QName -> HaskellType -> [HaskellCode] -> TCM ()
+ Agda.TypeChecking.Monad.Signature: addPragma :: BackendName -> QName -> String -> TCM ()
+ Agda.TypeChecking.Monad.Signature: data SigError
+ Agda.TypeChecking.Monad.Signature: dataFormat :: String -> [String] -> String
+ Agda.TypeChecking.Monad.Signature: defaultGetConstInfo :: (HasOptions m, MonadDebug m) => TCState -> TCEnv -> QName -> m (Either SigError Definition)
+ Agda.TypeChecking.Monad.Signature: definitelyNonRecursive_ :: Defn -> Bool
+ Agda.TypeChecking.Monad.Signature: getConstInfo' :: HasConstInfo m => QName -> m (Either SigError Definition)
+ Agda.TypeChecking.Monad.Signature: getMutual_ :: Defn -> Maybe [QName]
+ Agda.TypeChecking.Monad.Signature: getUniqueCompilerPragma :: BackendName -> QName -> TCM (Maybe CompilerPragma)
+ Agda.TypeChecking.Monad.Signature: instance Agda.TypeChecking.Monad.Signature.HasConstInfo m => Agda.TypeChecking.Monad.Signature.HasConstInfo (Control.Monad.Trans.Except.ExceptT err m)
+ Agda.TypeChecking.Monad.Signature: instantiateRewriteRule :: (Functor m, HasConstInfo m, HasOptions m, ReadTCState m, MonadReader TCEnv m, MonadDebug m) => RewriteRule -> m RewriteRule
+ Agda.TypeChecking.Monad.Signature: instantiateRewriteRules :: (Functor m, HasConstInfo m, HasOptions m, ReadTCState m, MonadReader TCEnv m, MonadDebug m) => RewriteRules -> m RewriteRules
+ Agda.TypeChecking.Monad.Signature: markInjective :: QName -> TCM ()
+ Agda.TypeChecking.Monad.Signature: mkPragma :: String -> TCM CompilerPragma
+ Agda.TypeChecking.Monad.Signature: sigError :: (String -> a) -> a -> SigError -> a
+ Agda.TypeChecking.Monad.Signature: type CoreCode = String
+ Agda.TypeChecking.Monad.Signature: type HaskellCode = String
+ Agda.TypeChecking.Monad.Signature: type HaskellType = String
+ Agda.TypeChecking.Monad.Signature: type JSCode = String
+ Agda.TypeChecking.Monad.SizedTypes: instance Agda.TypeChecking.Monad.SizedTypes.IsSizeType a => Agda.TypeChecking.Monad.SizedTypes.IsSizeType (Agda.Syntax.Common.Dom a)
+ Agda.TypeChecking.Monad.SizedTypes: instance Agda.TypeChecking.Monad.SizedTypes.IsSizeType a => Agda.TypeChecking.Monad.SizedTypes.IsSizeType (b, a)
+ Agda.TypeChecking.Monad.State: addCompilerPragma :: BackendName -> CompilerPragma -> Definition -> Definition
+ Agda.TypeChecking.Monad.State: addDeprecatedForeignCode :: String -> BackendName -> String -> TCM ()
+ Agda.TypeChecking.Monad.State: addForeignCode :: BackendName -> String -> TCM ()
+ Agda.TypeChecking.Monad.State: updateFunCopatternLHS :: (Bool -> Bool) -> Defn -> Defn
+ Agda.TypeChecking.Patterns.Abstract: expandPatternSynonyms' :: Pattern -> TCM Pattern
+ Agda.TypeChecking.Polarity: polarityFromPositivity :: QName -> TCM ()
+ Agda.TypeChecking.Positivity: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Positivity.Node
+ Agda.TypeChecking.Positivity.Occurrence: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Positivity.Occurrence.Occurrence
+ Agda.TypeChecking.Positivity.Occurrence: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Positivity.Occurrence.OccursWhere
+ Agda.TypeChecking.Positivity.Occurrence: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.Positivity.Occurrence.Where
+ Agda.TypeChecking.Positivity.Occurrence: instance Data.Data.Data Agda.TypeChecking.Positivity.Occurrence.Occurrence
+ Agda.TypeChecking.Positivity.Occurrence: instance Data.Data.Data Agda.TypeChecking.Positivity.Occurrence.OccursWhere
+ Agda.TypeChecking.Positivity.Occurrence: instance Data.Data.Data Agda.TypeChecking.Positivity.Occurrence.Where
+ Agda.TypeChecking.Pretty: (<?>) :: TCM Doc -> TCM Doc -> TCM Doc
+ Agda.TypeChecking.Pretty: infixl 5 $+$
+ Agda.TypeChecking.Pretty: infixl 6 <?>
+ Agda.TypeChecking.Pretty: instance (Agda.TypeChecking.Pretty.PrettyTCM k, Agda.TypeChecking.Pretty.PrettyTCM v) => Agda.TypeChecking.Pretty.PrettyTCM (Data.Map.Internal.Map k v)
+ Agda.TypeChecking.Pretty: instance (Agda.Utils.Pretty.Pretty a, Agda.TypeChecking.Pretty.PrettyTCM a, Agda.TypeChecking.Substitute.Class.Subst a a) => Agda.TypeChecking.Pretty.PrettyTCM (Agda.Syntax.Internal.Substitution' a)
+ Agda.TypeChecking.Pretty: prettyTCMPatterns :: [NamedArg DeBruijnPattern] -> TCM [Doc]
+ Agda.TypeChecking.Pretty: pshow :: Show a => a -> TCM Doc
+ Agda.TypeChecking.Primitive: getReflArgInfo :: ConHead -> TCM (Maybe ArgInfo)
+ Agda.TypeChecking.RecordPatterns: instance Agda.TypeChecking.Monad.Base.HasOptions Agda.TypeChecking.RecordPatterns.RecPatM
+ Agda.TypeChecking.RecordPatterns: instance Agda.TypeChecking.Monad.Debug.MonadDebug Agda.TypeChecking.RecordPatterns.RecPatM
+ Agda.TypeChecking.Records: ArgT :: (Dom Type) -> ElimType
+ Agda.TypeChecking.Records: ProjT :: Dom Type -> Type -> ElimType
+ Agda.TypeChecking.Records: [projTField] :: ElimType -> Type
+ Agda.TypeChecking.Records: [projTRec] :: ElimType -> Dom Type
+ Agda.TypeChecking.Records: data ElimType
+ Agda.TypeChecking.Records: instance Agda.TypeChecking.Pretty.PrettyTCM Agda.TypeChecking.Records.ElimType
+ Agda.TypeChecking.Records: typeElims :: Type -> Term -> Elims -> TCM [ElimType]
+ Agda.TypeChecking.Reduce: instance Agda.TypeChecking.Reduce.Instantiate e => Agda.TypeChecking.Reduce.Instantiate (Data.Map.Internal.Map k e)
+ Agda.TypeChecking.Reduce: instance Agda.TypeChecking.Reduce.InstantiateFull e => Agda.TypeChecking.Reduce.InstantiateFull (Data.Map.Internal.Map k e)
+ Agda.TypeChecking.Reduce: instance Agda.TypeChecking.Reduce.Normalise e => Agda.TypeChecking.Reduce.Normalise (Data.Map.Internal.Map k e)
+ Agda.TypeChecking.Reduce: instance Agda.TypeChecking.Reduce.Reduce e => Agda.TypeChecking.Reduce.Reduce (Data.Map.Internal.Map k e)
+ Agda.TypeChecking.Reduce: instance Agda.TypeChecking.Reduce.Simplify e => Agda.TypeChecking.Reduce.Simplify (Data.Map.Internal.Map k e)
+ Agda.TypeChecking.Reduce.Monad: instance Agda.TypeChecking.Monad.Base.HasOptions Agda.TypeChecking.Monad.Base.ReduceM
+ Agda.TypeChecking.Reduce.Monad: instance Agda.TypeChecking.Monad.Debug.MonadDebug Agda.TypeChecking.Monad.Base.ReduceM
+ Agda.TypeChecking.Rewriting: instance Agda.TypeChecking.Free.Lazy.Free Agda.TypeChecking.Monad.Base.NLPType
+ Agda.TypeChecking.Rewriting: instance Agda.TypeChecking.Free.Lazy.Free Agda.TypeChecking.Monad.Base.NLPat
+ Agda.TypeChecking.Rewriting: nlPatVarsUnder :: NLPatVars a => Int -> a -> IntSet
+ Agda.TypeChecking.Rewriting.NonLinMatch: instance (Agda.TypeChecking.Rewriting.NonLinMatch.Match a b, Agda.TypeChecking.Substitute.Class.Subst t1 a, Agda.TypeChecking.Substitute.Class.Subst t2 b) => Agda.TypeChecking.Rewriting.NonLinMatch.Match (Agda.Syntax.Internal.Abs a) (Agda.Syntax.Internal.Abs b)
+ Agda.TypeChecking.Rules.Data: bindParameters' :: [Type] -> [LamBinding] -> Type -> (Telescope -> Type -> TCM a) -> TCM a
+ Agda.TypeChecking.Rules.Def: [wfParentTel] :: WithFunctionProblem -> Telescope
+ Agda.TypeChecking.Rules.LHS: checkStrippedDotPattern :: StrippedDotPattern -> TCM ()
+ Agda.TypeChecking.Rules.LHS: problemAllVariables :: Problem -> Bool
+ Agda.TypeChecking.Rules.LHS.Problem: AbsurdFocus :: PatInfo -> Int -> Type -> Focus
+ Agda.TypeChecking.Rules.LHS.Problem: OtherFlex :: FlexibleVarKind
+ Agda.TypeChecking.Rules.LHS.Problem: [absurdFocusRange] :: Focus -> PatInfo
+ Agda.TypeChecking.Rules.LHS.Problem: [absurdFocusType] :: Focus -> Type
+ Agda.TypeChecking.Rules.LHS.Problem: [absurdFocusVar] :: Focus -> Int
+ Agda.TypeChecking.Rules.LHS.Problem: [flexOrigin] :: FlexibleVar a -> Origin
+ Agda.TypeChecking.Rules.LHS.Problem: [lhsShouldBeEmptyTypes] :: LHSState -> [(Range, Type)]
+ Agda.TypeChecking.Rules.LHS.Problem: instance Agda.Syntax.Common.LensOrigin (Agda.TypeChecking.Rules.LHS.Problem.FlexibleVar a)
+ Agda.TypeChecking.Rules.LHS.Problem: instance Agda.TypeChecking.Rules.LHS.Problem.ChooseFlex Agda.Syntax.Common.Origin
+ Agda.TypeChecking.Rules.Term: lambdaAddContext :: Name -> ArgName -> Dom Type -> TCM a -> TCM a
+ Agda.TypeChecking.Rules.Term: lambdaIrrelevanceCheck :: LensRelevance dom => ArgInfo -> dom -> TCM ArgInfo
+ Agda.TypeChecking.Serialise.Base: class ICODE t b
+ Agda.TypeChecking.Serialise.Base: class VALU t b
+ Agda.TypeChecking.Serialise.Base: icodeArgs :: (ICODE t b, IsBase t ~ b) => All EmbPrj (Domains t) => Proxy t -> Products (Domains t) -> S [Int32]
+ Agda.TypeChecking.Serialise.Base: icodeN' :: forall t. ICODE t (IsBase t) => Currying (Domains t) (S Int32) => All EmbPrj (Domains t) => t -> Arrows (Domains t) (S Int32)
+ Agda.TypeChecking.Serialise.Base: icodeNode :: Node -> S Int32
+ Agda.TypeChecking.Serialise.Base: instance Agda.TypeChecking.Serialise.Base.ICODE t (Agda.Utils.TypeLevel.IsBase t) => Agda.TypeChecking.Serialise.Base.ICODE (a -> t) 'GHC.Types.False
+ Agda.TypeChecking.Serialise.Base: instance Agda.TypeChecking.Serialise.Base.VALU t 'GHC.Types.True
+ Agda.TypeChecking.Serialise.Base: instance Agda.TypeChecking.Serialise.Base.VALU t (Agda.Utils.TypeLevel.IsBase t) => Agda.TypeChecking.Serialise.Base.VALU (a -> t) 'GHC.Types.False
+ Agda.TypeChecking.Serialise.Base: instance Agda.Utils.TypeLevel.IsBase t ~ 'GHC.Types.True => Agda.TypeChecking.Serialise.Base.ICODE t 'GHC.Types.True
+ Agda.TypeChecking.Serialise.Base: valuN :: forall t. VALU t (IsBase t) => Currying (Constant Int32 (Domains t)) (R (CoDomain t)) => All EmbPrj (Domains t) => t -> Arrows (Constant Int32 (Domains t)) (R (CoDomain t))
+ Agda.TypeChecking.Serialise.Base: valuN' :: (VALU t b, b ~ IsBase t) => All EmbPrj (Domains t) => t -> Products (Constant Int32 (Domains t)) -> R (CoDomain t)
+ Agda.TypeChecking.Serialise.Base: valueArgs :: (VALU t b, b ~ IsBase t) => All EmbPrj (CoDomain t : Domains t) => Proxy t -> Node -> Maybe (Products (Constant Int32 (Domains t)))
+ Agda.TypeChecking.Serialise.Base: valueN :: forall t. VALU t (IsBase t) => All EmbPrj (CoDomain t : Domains t) => t -> Int32 -> R (CoDomain t)
+ Agda.TypeChecking.Serialise.Instances.Common: SerialisedRange :: Range -> SerialisedRange
+ Agda.TypeChecking.Serialise.Instances.Common: [underlyingRange] :: SerialisedRange -> Range
+ Agda.TypeChecking.Serialise.Instances.Common: instance (GHC.Classes.Ord a, Agda.TypeChecking.Serialise.Base.EmbPrj a) => Agda.TypeChecking.Serialise.Base.EmbPrj (Data.Set.Internal.Set a)
+ Agda.TypeChecking.Serialise.Instances.Common: instance (GHC.Classes.Ord a, Agda.TypeChecking.Serialise.Base.EmbPrj a, Agda.TypeChecking.Serialise.Base.EmbPrj b) => Agda.TypeChecking.Serialise.Base.EmbPrj (Agda.Utils.Trie.Trie a b)
+ Agda.TypeChecking.Serialise.Instances.Common: instance (GHC.Classes.Ord a, Agda.TypeChecking.Serialise.Base.EmbPrj a, Agda.TypeChecking.Serialise.Base.EmbPrj b) => Agda.TypeChecking.Serialise.Base.EmbPrj (Data.Map.Internal.Map a b)
+ Agda.TypeChecking.Serialise.Instances.Common: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Syntax.Common.DataOrRecord
+ Agda.TypeChecking.Serialise.Instances.Common: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Utils.Empty.Empty
+ Agda.TypeChecking.Serialise.Instances.Common: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Utils.Impossible.Impossible
+ Agda.TypeChecking.Serialise.Instances.Common: instance Agda.TypeChecking.Serialise.Base.EmbPrj a => Agda.TypeChecking.Serialise.Base.EmbPrj (Data.Sequence.Internal.Seq a)
+ Agda.TypeChecking.Serialise.Instances.Common: newtype SerialisedRange
+ Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.TypeChecking.Monad.Base.CompilerPragma
+ Agda.TypeChecking.Serialise.Instances.Compilers: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.TypeChecking.Monad.Base.ForeignCode
+ Agda.TypeChecking.Serialise.Instances.Errors: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Syntax.Concrete.Definitions.DeclarationWarning
+ Agda.TypeChecking.Serialise.Instances.Errors: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.TypeChecking.Monad.Base.TCWarning
+ Agda.TypeChecking.Serialise.Instances.Errors: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.TypeChecking.Monad.Base.Warning
+ Agda.TypeChecking.Serialise.Instances.Errors: instance Agda.TypeChecking.Serialise.Base.EmbPrj Text.PrettyPrint.HughesPJ.Doc
+ Agda.TypeChecking.Serialise.Instances.Highlighting: instance Agda.TypeChecking.Serialise.Base.EmbPrj Agda.Interaction.Highlighting.Precise.DefinitionSite
+ Agda.TypeChecking.Serialise.Instances.Internal: instance Agda.TypeChecking.Serialise.Base.EmbPrj a => Agda.TypeChecking.Serialise.Base.EmbPrj (Agda.Syntax.Internal.Substitution' a)
+ Agda.TypeChecking.SizedTypes: takeSizeConstraints :: TCM [Closure Constraint]
+ Agda.TypeChecking.SizedTypes.Solve: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.SizedTypes.Solve.NamedRigid
+ Agda.TypeChecking.SizedTypes.Solve: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.SizedTypes.Solve.SizeMeta
+ Agda.TypeChecking.SizedTypes.Syntax: Solution :: Map flex (SizeExpr' rigid flex) -> Solution rigid flex
+ Agda.TypeChecking.SizedTypes.Syntax: [theSolution] :: Solution rigid flex -> Map flex (SizeExpr' rigid flex)
+ Agda.TypeChecking.SizedTypes.Syntax: emptySolution :: Solution r f
+ Agda.TypeChecking.SizedTypes.Syntax: instance (Agda.Utils.Pretty.Pretty r, Agda.Utils.Pretty.Pretty f) => Agda.Utils.Pretty.Pretty (Agda.TypeChecking.SizedTypes.Syntax.Constraint' r f)
+ Agda.TypeChecking.SizedTypes.Syntax: instance (Agda.Utils.Pretty.Pretty r, Agda.Utils.Pretty.Pretty f) => Agda.Utils.Pretty.Pretty (Agda.TypeChecking.SizedTypes.Syntax.SizeExpr' r f)
+ Agda.TypeChecking.SizedTypes.Syntax: instance (Agda.Utils.Pretty.Pretty r, Agda.Utils.Pretty.Pretty f) => Agda.Utils.Pretty.Pretty (Agda.TypeChecking.SizedTypes.Syntax.Solution r f)
+ Agda.TypeChecking.SizedTypes.Syntax: instance (GHC.Show.Show flex, GHC.Show.Show rigid) => GHC.Show.Show (Agda.TypeChecking.SizedTypes.Syntax.SizeExpr' rigid flex)
+ Agda.TypeChecking.SizedTypes.Syntax: instance (GHC.Show.Show rigid, GHC.Show.Show flex) => GHC.Show.Show (Agda.TypeChecking.SizedTypes.Syntax.Constraint' rigid flex)
+ Agda.TypeChecking.SizedTypes.Syntax: instance (GHC.Show.Show rigid, GHC.Show.Show flex) => GHC.Show.Show (Agda.TypeChecking.SizedTypes.Syntax.Solution rigid flex)
+ Agda.TypeChecking.SizedTypes.Syntax: instance Agda.TypeChecking.SizedTypes.Syntax.Substitute r f a => Agda.TypeChecking.SizedTypes.Syntax.Substitute r f (Data.Map.Internal.Map k a)
+ Agda.TypeChecking.SizedTypes.Syntax: instance Agda.Utils.Null.Null (Agda.TypeChecking.SizedTypes.Syntax.Solution rigid flex)
+ Agda.TypeChecking.SizedTypes.Syntax: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.SizedTypes.Syntax.Cmp
+ Agda.TypeChecking.SizedTypes.Syntax: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.SizedTypes.Syntax.Flex
+ Agda.TypeChecking.SizedTypes.Syntax: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.SizedTypes.Syntax.Offset
+ Agda.TypeChecking.SizedTypes.Syntax: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.SizedTypes.Syntax.Polarity
+ Agda.TypeChecking.SizedTypes.Syntax: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.SizedTypes.Syntax.Rigid
+ Agda.TypeChecking.SizedTypes.Syntax: instance Agda.Utils.Pretty.Pretty flex => Agda.Utils.Pretty.Pretty (Agda.TypeChecking.SizedTypes.Syntax.PolarityAssignment flex)
+ Agda.TypeChecking.SizedTypes.Syntax: instance GHC.Classes.Ord f => Agda.TypeChecking.SizedTypes.Syntax.Substitute r f (Agda.TypeChecking.SizedTypes.Syntax.Solution r f)
+ Agda.TypeChecking.SizedTypes.Syntax: newtype Solution rigid flex
+ Agda.TypeChecking.SizedTypes.Utils: setDebugging :: Bool -> IO ()
+ Agda.TypeChecking.SizedTypes.WarshallSolver: instance (Agda.Utils.Pretty.Pretty rigid, Agda.Utils.Pretty.Pretty flex) => Agda.Utils.Pretty.Pretty (Agda.TypeChecking.SizedTypes.WarshallSolver.Node rigid flex)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: instance (GHC.Show.Show flex, GHC.Show.Show rigid) => GHC.Show.Show (Agda.TypeChecking.SizedTypes.WarshallSolver.Node rigid flex)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.SizedTypes.WarshallSolver.Label
+ Agda.TypeChecking.SizedTypes.WarshallSolver: instance Agda.Utils.Pretty.Pretty Agda.TypeChecking.SizedTypes.WarshallSolver.Weight
+ Agda.TypeChecking.Substitute: applyNLPatSubst :: (Subst Term a) => Substitution' NLPat -> a -> a
+ Agda.TypeChecking.Substitute: instance (GHC.Classes.Ord k, Agda.TypeChecking.Substitute.Class.Subst t a) => Agda.TypeChecking.Substitute.Class.Subst t (Data.Map.Internal.Map k a)
+ Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.Class.Abstract v => Agda.TypeChecking.Substitute.Class.Abstract (Data.Map.Internal.Map k v)
+ Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.Class.Apply v => Agda.TypeChecking.Substitute.Class.Apply (Data.Map.Internal.Map k v)
+ Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.Class.Subst Agda.Syntax.Internal.Term Agda.Syntax.Abstract.StrippedDotPattern
+ Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.Class.Subst Agda.TypeChecking.Monad.Base.NLPat Agda.TypeChecking.Monad.Base.NLPType
+ Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.Class.Subst Agda.TypeChecking.Monad.Base.NLPat Agda.TypeChecking.Monad.Base.NLPat
+ Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.Class.Subst Agda.TypeChecking.Monad.Base.NLPat Agda.TypeChecking.Monad.Base.RewriteRule
+ Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.DeBruijn.DeBruijn Agda.TypeChecking.Monad.Base.NLPat
+ Agda.TypeChecking.Substitute: instance Agda.TypeChecking.Substitute.TeleNoAbs Agda.Syntax.Internal.ListTel
+ Agda.TypeChecking.Substitute: typeArgsWithTel :: Telescope -> [Term] -> Maybe [Dom Type]
+ Agda.TypeChecking.Substitute.Class: instance Agda.TypeChecking.Substitute.Class.Subst Agda.Syntax.Internal.Term Agda.Syntax.Abstract.Name.QName
+ Agda.TypeChecking.Telescope: typeArity :: Type -> TCM Nat
+ Agda.TypeChecking.Warnings: AllWarnings :: WhichWarnings
+ Agda.TypeChecking.Warnings: ErrorWarnings :: WhichWarnings
+ Agda.TypeChecking.Warnings: classifyWarning :: Warning -> WhichWarnings
+ Agda.TypeChecking.Warnings: classifyWarnings :: [TCWarning] -> ([TCWarning], [TCWarning])
+ Agda.TypeChecking.Warnings: data WhichWarnings
+ Agda.TypeChecking.Warnings: genericNonFatalError :: MonadTCM tcm => Doc -> tcm ()
+ Agda.TypeChecking.Warnings: genericWarning :: MonadTCM tcm => Doc -> tcm ()
+ Agda.TypeChecking.Warnings: instance GHC.Classes.Eq Agda.TypeChecking.Warnings.WhichWarnings
+ Agda.TypeChecking.Warnings: instance GHC.Classes.Ord Agda.TypeChecking.Warnings.WhichWarnings
+ Agda.TypeChecking.Warnings: isUnsolvedWarning :: Warning -> Bool
+ Agda.TypeChecking.Warnings: runPM :: PM a -> TCM a
+ Agda.TypeChecking.Warnings: warning :: MonadTCM tcm => Warning -> tcm ()
+ Agda.TypeChecking.Warnings: warning_ :: MonadTCM tcm => Warning -> tcm TCWarning
+ Agda.Utils.Benchmark: BenchmarkOff :: BenchmarkOn a
+ Agda.Utils.Benchmark: BenchmarkOn :: BenchmarkOn a
+ Agda.Utils.Benchmark: BenchmarkSome :: (Account a -> Bool) -> BenchmarkOn a
+ Agda.Utils.Benchmark: data BenchmarkOn a
+ Agda.Utils.Benchmark: isBenchmarkOn :: Account a -> BenchmarkOn a -> Bool
+ Agda.Utils.Either: fromLeftM :: Monad m => (b -> m a) -> Either a b -> m a
+ Agda.Utils.Either: fromRightM :: Monad m => (a -> m b) -> Either a b -> m b
+ Agda.Utils.Empty: instance Data.Data.Data Agda.Utils.Empty.Empty
+ Agda.Utils.Empty: toImpossible :: Empty -> IO Impossible
+ Agda.Utils.FileName: instance Data.Data.Data Agda.Utils.FileName.AbsolutePath
+ Agda.Utils.Graph.AdjacencyMap.Unidirectional: instance (Agda.Utils.Pretty.Pretty s, Agda.Utils.Pretty.Pretty t, Agda.Utils.Pretty.Pretty e) => Agda.Utils.Pretty.Pretty (Agda.Utils.Graph.AdjacencyMap.Unidirectional.Edge s t e)
+ Agda.Utils.Graph.AdjacencyMap.Unidirectional: instance (Agda.Utils.Pretty.Pretty s, Agda.Utils.Pretty.Pretty t, Agda.Utils.Pretty.Pretty e) => Agda.Utils.Pretty.Pretty (Agda.Utils.Graph.AdjacencyMap.Unidirectional.Graph s t e)
+ Agda.Utils.Haskell.Syntax: OtherPragma :: String -> ModulePragma
+ Agda.Utils.Haskell.Syntax: PatSyn :: Pat -> Pat -> Decl
+ Agda.Utils.IO: catchIO :: CatchIO m => m a -> (IOException -> m a) -> m a
+ Agda.Utils.IO: class CatchIO m
+ Agda.Utils.IO: instance Agda.Utils.IO.CatchIO GHC.Types.IO
+ Agda.Utils.IO: instance Agda.Utils.IO.CatchIO m => Agda.Utils.IO.CatchIO (Control.Monad.Trans.Writer.Lazy.WriterT w m)
+ Agda.Utils.IO.UTF8: writeTextToFile :: FilePath -> Text -> IO ()
+ Agda.Utils.Impossible: Unreachable :: String -> Integer -> Impossible
+ Agda.Utils.IndexedList: [Cons] :: p x -> All p xs -> All p (x : xs)
+ Agda.Utils.IndexedList: [Nil] :: All p '[]
+ Agda.Utils.IndexedList: [Some] :: f i -> Some f
+ Agda.Utils.IndexedList: [Suc] :: Index xs x -> Index (y : xs) x
+ Agda.Utils.IndexedList: [Zero] :: Index (x : xs) x
+ Agda.Utils.IndexedList: allIndices :: All p xs -> All (Index xs) xs
+ Agda.Utils.IndexedList: data All :: (x -> *) -> [x] -> *
+ Agda.Utils.IndexedList: data Index :: [x] -> x -> *
+ Agda.Utils.IndexedList: data Some :: (k -> *) -> *
+ Agda.Utils.IndexedList: forgetAll :: (forall x. b x -> a) -> All b xs -> [a]
+ Agda.Utils.IndexedList: forgetIndex :: Index xs x -> Int
+ Agda.Utils.IndexedList: lIndex :: Index xs x -> Lens' (p x) (All p xs)
+ Agda.Utils.IndexedList: lookupIndex :: All p xs -> Index xs x -> p x
+ Agda.Utils.IndexedList: makeAll :: (a -> Some b) -> [a] -> Some (All b)
+ Agda.Utils.IndexedList: mapWithIndex :: (forall x. Index xs x -> p x -> q x) -> All p xs -> All q xs
+ Agda.Utils.IndexedList: withSome :: Some b -> (forall i. b i -> a) -> a
+ Agda.Utils.Lens: lFst :: Lens' a (a, b)
+ Agda.Utils.Lens: lSnd :: Lens' b (a, b)
+ Agda.Utils.List: last2 :: [a] -> Maybe (a, a)
+ Agda.Utils.Maybe: boolToMaybe :: Bool -> a -> Maybe a
+ Agda.Utils.Maybe: ifJust :: Maybe a -> (a -> b) -> b -> b
+ Agda.Utils.Maybe.Strict: instance Data.Semigroup.Semigroup a => Data.Semigroup.Semigroup (Data.Strict.Maybe.Maybe a)
+ Agda.Utils.Maybe.Strict: instance Data.Semigroup.Semigroup a => GHC.Base.Monoid (Data.Strict.Maybe.Maybe a)
+ Agda.Utils.Monad: orEitherM :: (Monoid e, Monad m, Functor m) => [m (Either e b)] -> m (Either e b)
+ Agda.Utils.Monoid: MaxNat :: Int -> MaxNat
+ Agda.Utils.Monoid: [getMaxNat] :: MaxNat -> Int
+ Agda.Utils.Monoid: instance Data.Semigroup.Semigroup Agda.Utils.Monoid.MaxNat
+ Agda.Utils.Monoid: instance GHC.Base.Monoid Agda.Utils.Monoid.MaxNat
+ Agda.Utils.Monoid: instance GHC.Classes.Eq Agda.Utils.Monoid.MaxNat
+ Agda.Utils.Monoid: instance GHC.Classes.Ord Agda.Utils.Monoid.MaxNat
+ Agda.Utils.Monoid: instance GHC.Enum.Enum Agda.Utils.Monoid.MaxNat
+ Agda.Utils.Monoid: instance GHC.Num.Num Agda.Utils.Monoid.MaxNat
+ Agda.Utils.Monoid: instance GHC.Show.Show Agda.Utils.Monoid.MaxNat
+ Agda.Utils.Monoid: newtype MaxNat
+ Agda.Utils.Null: instance Agda.Utils.Null.Null (Data.IntMap.Internal.IntMap a)
+ Agda.Utils.Null: instance Agda.Utils.Null.Null (Data.Map.Internal.Map k a)
+ Agda.Utils.Null: instance Agda.Utils.Null.Null (Data.Sequence.Internal.Seq a)
+ Agda.Utils.Null: instance Agda.Utils.Null.Null (Data.Set.Internal.Set a)
+ Agda.Utils.Null: instance Agda.Utils.Null.Null Data.IntSet.Internal.IntSet
+ Agda.Utils.Parser.MemoisedCPS: atomP :: Int
+ Agda.Utils.Parser.MemoisedCPS: bindP :: Int
+ Agda.Utils.Parser.MemoisedCPS: choiceP :: Int
+ Agda.Utils.Parser.MemoisedCPS: doc :: ParserClass p k r tok => Doc -> p a -> p a
+ Agda.Utils.Parser.MemoisedCPS: sat' :: ParserClass p k r tok => (tok -> Maybe a) -> p a
+ Agda.Utils.Parser.MemoisedCPS: seqP :: Int
+ Agda.Utils.Parser.MemoisedCPS: starP :: Int
+ Agda.Utils.Parser.MemoisedCPS: type DocP = (Doc, Int)
+ Agda.Utils.PartialOrd: instance GHC.Classes.Ord a => Agda.Utils.PartialOrd.PartialOrd (Agda.Utils.PartialOrd.Inclusion (Data.Set.Internal.Set a))
+ Agda.Utils.Permutation: instance Agda.Utils.Permutation.InversePermute [GHC.Base.Maybe a] (Data.IntMap.Internal.IntMap a)
+ Agda.Utils.Permutation: instance Data.Data.Data Agda.Utils.Permutation.Permutation
+ Agda.Utils.Permutation: instance Data.Data.Data a => Data.Data.Data (Agda.Utils.Permutation.Drop a)
+ Agda.Utils.Pointer: instance Data.Data.Data a => Data.Data.Data (Agda.Utils.Pointer.Ptr a)
+ Agda.Utils.Pointer: instance Data.Typeable.Internal.Typeable a => Data.Data.Data (GHC.IORef.IORef a)
+ Agda.Utils.Pretty: (<?>) :: Doc -> Doc -> Doc
+ Agda.Utils.Pretty: infixl 6 <?>
+ Agda.Utils.Pretty: instance Agda.Utils.Pretty.Pretty a => Agda.Utils.Pretty.Pretty (GHC.Base.Maybe a)
+ Agda.Utils.Pretty: instance Agda.Utils.Pretty.Pretty a => Agda.Utils.Pretty.Pretty [a]
+ Agda.Utils.Pretty: instance Data.Data.Data Text.PrettyPrint.HughesPJ.Doc
+ Agda.Utils.Pretty: prettyList_ :: Pretty a => [a] -> Doc
+ Agda.Utils.Pretty: pshow :: Show a => a -> Doc
+ Agda.Utils.Singleton: instance Agda.Utils.Singleton.Singleton (GHC.Types.Int, a) (Data.IntMap.Internal.IntMap a)
+ Agda.Utils.Singleton: instance Agda.Utils.Singleton.Singleton (k, a) (Data.Map.Internal.Map k a)
+ Agda.Utils.Singleton: instance Agda.Utils.Singleton.Singleton GHC.Types.Int Data.IntSet.Internal.IntSet
+ Agda.Utils.Singleton: instance Agda.Utils.Singleton.Singleton a (Data.Sequence.Internal.Seq a)
+ Agda.Utils.Singleton: instance Agda.Utils.Singleton.Singleton a (Data.Set.Internal.Set a)
+ Agda.Utils.Size: instance Agda.Utils.Size.Sized (Data.IntMap.Internal.IntMap a)
+ Agda.Utils.Size: instance Agda.Utils.Size.Sized (Data.Map.Internal.Map k a)
+ Agda.Utils.Size: instance Agda.Utils.Size.Sized (Data.Sequence.Internal.Seq a)
+ Agda.Utils.Size: instance Agda.Utils.Size.Sized (Data.Set.Internal.Set a)
+ Agda.Utils.Size: instance Agda.Utils.Size.Sized Data.IntSet.Internal.IntSet
+ Agda.Utils.String: delimiter :: String -> String
+ Agda.Utils.Three: One :: Three
+ Agda.Utils.Three: Three :: Three
+ Agda.Utils.Three: Two :: Three
+ Agda.Utils.Three: data Three
+ Agda.Utils.Three: instance GHC.Classes.Eq Agda.Utils.Three.Three
+ Agda.Utils.Three: instance GHC.Classes.Ord Agda.Utils.Three.Three
+ Agda.Utils.Three: instance GHC.Enum.Bounded Agda.Utils.Three.Three
+ Agda.Utils.Three: instance GHC.Enum.Enum Agda.Utils.Three.Three
+ Agda.Utils.Three: instance GHC.Show.Show Agda.Utils.Three.Three
+ Agda.Utils.Three: partition3 :: (a -> Three) -> [a] -> ([a], [a], [a])
+ Agda.Utils.Time: fromMilliseconds :: Integer -> CPUTime
+ Agda.Utils.Trie: Trie :: !(Maybe v) -> !(Map k (Trie k v)) -> Trie k v
+ Agda.Utils.Trie: filter :: Ord k => (v -> Bool) -> Trie k v -> Trie k v
+ Agda.Utils.Trie: mapSubTries :: Ord k => (Trie k u -> Maybe v) -> Trie k u -> Trie k v
+ Agda.Utils.Trie: toListOrderedBy :: Ord k => (v -> v -> Ordering) -> Trie k v -> [([k], v)]
+ Agda.Utils.TypeLevel: class Currying as b
+ Agda.Utils.TypeLevel: currys :: Currying as b => Proxy as -> Proxy b -> (Products as -> b) -> Arrows as b
+ Agda.Utils.TypeLevel: data ConsMap0 :: (Function k l -> *) -> Function k (Function [l] [l] -> *) -> *
+ Agda.Utils.TypeLevel: data ConsMap1 :: (Function k l -> *) -> k -> Function [l] [l] -> *
+ Agda.Utils.TypeLevel: data Constant0 :: Function a (Function b a -> *) -> *
+ Agda.Utils.TypeLevel: data Constant1 :: * -> Function b a -> *
+ Agda.Utils.TypeLevel: data Function :: * -> * -> *
+ Agda.Utils.TypeLevel: instance Agda.Utils.TypeLevel.Currying '[] b
+ Agda.Utils.TypeLevel: instance Agda.Utils.TypeLevel.Currying as b => Agda.Utils.TypeLevel.Currying (a : as) b
+ Agda.Utils.TypeLevel: type Arrows (as :: [*]) (r :: *) = Foldr (->) r as
+ Agda.Utils.TypeLevel: type Products (as :: [*]) = Foldr (,) () as
+ Agda.Utils.TypeLevel: uncurrys :: Currying as b => Proxy as -> Proxy b -> Arrows as b -> Products as -> b
- Agda.Auto.Auto: auto :: InteractionId -> Range -> String -> TCM (Either [(InteractionId, String)] (Either [String] String), Maybe String)
+ Agda.Auto.Auto: auto :: InteractionId -> Range -> String -> TCM AutoResult
- Agda.Auto.CaseSplit: HI :: FMode -> a -> HI a
+ Agda.Auto.CaseSplit: HI :: Hiding -> a -> HI a
- Agda.Auto.CaseSplit: caseSplitSearch :: forall o. IORef Int -> Int -> [ConstRef o] -> Maybe (EqReasoningConsts o) -> Int -> Int -> ConstRef o -> CSCtx o -> MExp o -> [CSPat o] -> IO [Sol o]
+ Agda.Auto.CaseSplit: caseSplitSearch :: forall o. IORef Int -> Int -> [ConstRef o] -> Maybe (EqReasoningConsts o) -> Int -> Cost -> ConstRef o -> CSCtx o -> MExp o -> [CSPat o] -> IO [Sol o]
- Agda.Auto.CaseSplit: caseSplitSearch' :: forall o. (Int -> CSCtx o -> MExp o -> ([Nat], Nat, [Nat]) -> IO (Maybe (MExp o))) -> Int -> Int -> ConstRef o -> CSCtx o -> MExp o -> [CSPat o] -> IO [Sol o]
+ Agda.Auto.CaseSplit: caseSplitSearch' :: forall o. (Cost -> CSCtx o -> MExp o -> ([Nat], Nat, [Nat]) -> IO (Maybe (MExp o))) -> Int -> Cost -> ConstRef o -> CSCtx o -> MExp o -> [CSPat o] -> IO [Sol o]
- Agda.Auto.CaseSplit: concatargs :: MM (ArgList o) (RefInfo o) -> MArgList o -> MArgList o
+ Agda.Auto.CaseSplit: concatargs :: MArgList o -> MArgList o -> MArgList o
- Agda.Auto.CaseSplit: costAddVarDepth :: Nat
+ Agda.Auto.CaseSplit: costAddVarDepth :: Cost
- Agda.Auto.CaseSplit: costCaseSplitHigh :: Nat
+ Agda.Auto.CaseSplit: costCaseSplitHigh :: Cost
- Agda.Auto.CaseSplit: costCaseSplitLow :: Nat
+ Agda.Auto.CaseSplit: costCaseSplitLow :: Cost
- Agda.Auto.CaseSplit: costCaseSplitVeryHigh :: Nat
+ Agda.Auto.CaseSplit: costCaseSplitVeryHigh :: Cost
- Agda.Auto.CaseSplit: freevars :: MExp o -> [Nat]
+ Agda.Auto.CaseSplit: freevars :: FreeVars t => t -> [Nat]
- Agda.Auto.CaseSplit: lift :: Nat -> MExp o -> MExp o
+ Agda.Auto.CaseSplit: lift :: Lift t => Nat -> t -> t
- Agda.Auto.CaseSplit: notequal :: Nat -> Nat -> MExp o -> MExp o -> IO Bool
+ Agda.Auto.CaseSplit: notequal :: Unify o t => Nat -> Nat -> t -> t -> IO Bool
- Agda.Auto.CaseSplit: replace :: Nat -> Nat -> MExp o -> MExp o -> MExp o
+ Agda.Auto.CaseSplit: replace :: Replace o t u => Nat -> Nat -> MExp o -> t -> u
- Agda.Auto.CaseSplit: replacep :: Nat -> Nat -> CSPatI o -> MExp o -> CSPat o -> CSPat o
+ Agda.Auto.CaseSplit: replacep :: forall o. Nat -> Nat -> CSPatI o -> MExp o -> CSPat o -> CSPat o
- Agda.Auto.CaseSplit: unifyexp :: MExp o -> MExp o -> Maybe [(Nat, MExp o)]
+ Agda.Auto.CaseSplit: unifyexp :: MExp o -> MExp o -> Maybe ([(Nat, MExp o)])
- Agda.Auto.Convert: constructPats :: Map QName (TMode, ConstRef O) -> MetaId -> Clause -> TCM ([(FMode, MId)], [CSPat O])
+ Agda.Auto.Convert: constructPats :: Map QName (TMode, ConstRef O) -> MetaId -> Clause -> TCM ([(Hiding, MId)], [CSPat O])
- Agda.Auto.Convert: icnvh :: FMode -> ArgInfo
+ Agda.Auto.Convert: icnvh :: Hiding -> ArgInfo
- Agda.Auto.Convert: tomy :: MetaId -> [(Bool, QName)] -> [Type] -> TCM ([ConstRef O], [MExp O], Map MetaId (Metavar (Exp O) (RefInfo O), MExp O, [MExp O], [MetaId]), [(Bool, MExp O, MExp O)], Map QName (TMode, ConstRef O))
+ Agda.Auto.Convert: tomy :: MetaId -> [Hint] -> [Type] -> TCM ([ConstRef O], [MExp O], Map MetaId (Metavar (Exp O) (RefInfo O), MExp O, [MExp O], [MetaId]), [(Bool, MExp O, MExp O)], Map QName (TMode, ConstRef O))
- Agda.Auto.NarrowingSearch: AddExtraRef :: String -> (Metavar a blk) -> (Int, RefCreateEnv blk a) -> Prop blk
+ Agda.Auto.NarrowingSearch: AddExtraRef :: String -> (Metavar a blk) -> (Move' blk a) -> Prop blk
- Agda.Auto.NarrowingSearch: Metavar :: IORef (Maybe a) -> IORef Bool -> IORef [(QPB a blk, Maybe (CTree blk))] -> IORef [SubConstraints blk] -> IORef [(Int, RefCreateEnv blk a)] -> Metavar a blk
+ Agda.Auto.NarrowingSearch: Metavar :: IORef (Maybe a) -> IORef Bool -> IORef [(QPB a blk, Maybe (CTree blk))] -> IORef [SubConstraints blk] -> IORef [Move' blk a] -> Metavar a blk
- Agda.Auto.NarrowingSearch: [mextrarefs] :: Metavar a blk -> IORef [(Int, RefCreateEnv blk a)]
+ Agda.Auto.NarrowingSearch: [mextrarefs] :: Metavar a blk -> IORef [Move' blk a]
- Agda.Auto.NarrowingSearch: refinements :: Refinable a blk => blk -> [blk] -> Metavar a blk -> IO [(Int, RefCreateEnv blk a)]
+ Agda.Auto.NarrowingSearch: refinements :: Refinable a blk => blk -> [blk] -> Metavar a blk -> IO [Move' blk a]
- Agda.Auto.NarrowingSearch: topSearch :: forall blk. IORef Int -> IORef Int -> HandleSol -> blk -> MetaEnv (PB blk) -> Int -> Int -> IO Bool
+ Agda.Auto.NarrowingSearch: topSearch :: forall blk. IORef Int -> IORef Int -> HandleSol -> blk -> MetaEnv (PB blk) -> Cost -> Cost -> IO Bool
- Agda.Auto.SearchControl: ExpRefInfo :: Maybe (RefInfo o) -> [RefInfo o] -> Bool -> Maybe ([UId o], [Elr o]) -> Maybe Bool -> Bool -> Maybe EqReasoningState -> ExpRefInfo o
+ Agda.Auto.SearchControl: ExpRefInfo :: Maybe (RefInfo o) -> [RefInfo o] -> Bool -> Bool -> Maybe ([UId o], [Elr o]) -> Maybe Bool -> Bool -> Maybe EqReasoningState -> ExpRefInfo o
- Agda.Auto.SearchControl: costAbsurdLam :: Int
+ Agda.Auto.SearchControl: costAbsurdLam :: Cost
- Agda.Auto.SearchControl: costAppConstructor :: Int
+ Agda.Auto.SearchControl: costAppConstructor :: Cost
- Agda.Auto.SearchControl: costAppConstructorSingle :: Int
+ Agda.Auto.SearchControl: costAppConstructorSingle :: Cost
- Agda.Auto.SearchControl: costAppExtraRef :: Int
+ Agda.Auto.SearchControl: costAppExtraRef :: Cost
- Agda.Auto.SearchControl: costAppHint :: Int
+ Agda.Auto.SearchControl: costAppHint :: Cost
- Agda.Auto.SearchControl: costAppHintUsed :: Int
+ Agda.Auto.SearchControl: costAppHintUsed :: Cost
- Agda.Auto.SearchControl: costAppRecCall :: Int
+ Agda.Auto.SearchControl: costAppRecCall :: Cost
- Agda.Auto.SearchControl: costAppRecCallUsed :: Int
+ Agda.Auto.SearchControl: costAppRecCallUsed :: Cost
- Agda.Auto.SearchControl: costAppVar :: Int
+ Agda.Auto.SearchControl: costAppVar :: Cost
- Agda.Auto.SearchControl: costAppVarUsed :: Int
+ Agda.Auto.SearchControl: costAppVarUsed :: Cost
- Agda.Auto.SearchControl: costEqCong :: Int
+ Agda.Auto.SearchControl: costEqCong :: Cost
- Agda.Auto.SearchControl: costEqEnd :: Int
+ Agda.Auto.SearchControl: costEqEnd :: Cost
- Agda.Auto.SearchControl: costEqStep :: Int
+ Agda.Auto.SearchControl: costEqStep :: Cost
- Agda.Auto.SearchControl: costEqSym :: Int
+ Agda.Auto.SearchControl: costEqSym :: Cost
- Agda.Auto.SearchControl: costIncrease :: Int
+ Agda.Auto.SearchControl: costIncrease :: Cost
- Agda.Auto.SearchControl: costInferredTypeUnkown :: Int
+ Agda.Auto.SearchControl: costInferredTypeUnkown :: Cost
- Agda.Auto.SearchControl: costIotaStep :: Int
+ Agda.Auto.SearchControl: costIotaStep :: Cost
- Agda.Auto.SearchControl: costLam :: Int
+ Agda.Auto.SearchControl: costLam :: Cost
- Agda.Auto.SearchControl: costLamUnfold :: Int
+ Agda.Auto.SearchControl: costLamUnfold :: Cost
- Agda.Auto.SearchControl: costPi :: Int
+ Agda.Auto.SearchControl: costPi :: Cost
- Agda.Auto.SearchControl: costSort :: Int
+ Agda.Auto.SearchControl: costSort :: Cost
- Agda.Auto.SearchControl: costUnification :: Int
+ Agda.Auto.SearchControl: costUnification :: Cost
- Agda.Auto.SearchControl: costUnificationOccurs :: Int
+ Agda.Auto.SearchControl: costUnificationOccurs :: Cost
- Agda.Auto.SearchControl: extraref :: UId o -> [Maybe (UId o)] -> ConstRef o -> (Int, StateT (IORef [SubConstraints (RefInfo o)], Int) IO (Exp o))
+ Agda.Auto.SearchControl: extraref :: UId o -> [Maybe (UId o)] -> ConstRef o -> Move o
- Agda.Auto.SearchControl: prioAbsurdLambda :: Int
+ Agda.Auto.SearchControl: prioAbsurdLambda :: Prio
- Agda.Auto.SearchControl: prioCompBeta :: Int
+ Agda.Auto.SearchControl: prioCompBeta :: Prio
- Agda.Auto.SearchControl: prioCompBetaStructured :: Int
+ Agda.Auto.SearchControl: prioCompBetaStructured :: Prio
- Agda.Auto.SearchControl: prioCompChoice :: Int
+ Agda.Auto.SearchControl: prioCompChoice :: Prio
- Agda.Auto.SearchControl: prioCompCopy :: Int
+ Agda.Auto.SearchControl: prioCompCopy :: Prio
- Agda.Auto.SearchControl: prioCompIota :: Int
+ Agda.Auto.SearchControl: prioCompIota :: Prio
- Agda.Auto.SearchControl: prioCompUnif :: Int
+ Agda.Auto.SearchControl: prioCompUnif :: Prio
- Agda.Auto.SearchControl: prioCompareArgList :: Int
+ Agda.Auto.SearchControl: prioCompareArgList :: Prio
- Agda.Auto.SearchControl: prioInferredTypeUnknown :: Int
+ Agda.Auto.SearchControl: prioInferredTypeUnknown :: Prio
- Agda.Auto.SearchControl: prioNo :: Int
+ Agda.Auto.SearchControl: prioNo :: Prio
- Agda.Auto.SearchControl: prioNoIota :: Int
+ Agda.Auto.SearchControl: prioNoIota :: Prio
- Agda.Auto.SearchControl: prioProjIndex :: Int
+ Agda.Auto.SearchControl: prioProjIndex :: Prio
- Agda.Auto.SearchControl: prioTypeUnknown :: Int
+ Agda.Auto.SearchControl: prioTypeUnknown :: Prio
- Agda.Auto.SearchControl: prioTypecheck :: Bool -> Int
+ Agda.Auto.SearchControl: prioTypecheck :: Bool -> Prio
- Agda.Auto.SearchControl: prioTypecheckArgList :: Int
+ Agda.Auto.SearchControl: prioTypecheckArgList :: Prio
- Agda.Auto.Syntax: ALCons :: FMode -> (MExp o) -> (MArgList o) -> ArgList o
+ Agda.Auto.Syntax: ALCons :: Hiding -> (MExp o) -> (MArgList o) -> ArgList o
- Agda.Auto.Syntax: ALProj :: (MArgList o) -> (MM (ConstRef o) (RefInfo o)) -> FMode -> (MArgList o) -> ArgList o
+ Agda.Auto.Syntax: ALProj :: (MArgList o) -> (MM (ConstRef o) (RefInfo o)) -> Hiding -> (MArgList o) -> ArgList o
- Agda.Auto.Syntax: AbsurdLambda :: FMode -> Exp o
+ Agda.Auto.Syntax: AbsurdLambda :: Hiding -> Exp o
- Agda.Auto.Syntax: HNALCons :: FMode -> (ICExp o) -> (ICArgList o) -> HNArgList o
+ Agda.Auto.Syntax: HNALCons :: Hiding -> (ICExp o) -> (ICArgList o) -> HNArgList o
- Agda.Auto.Syntax: HNApp :: [Maybe (UId o)] -> (Elr o) -> (ICArgList o) -> HNExp o
+ Agda.Auto.Syntax: HNApp :: (Elr o) -> (ICArgList o) -> HNExp' o
- Agda.Auto.Syntax: HNLam :: [Maybe (UId o)] -> FMode -> (Abs (ICExp o)) -> HNExp o
+ Agda.Auto.Syntax: HNLam :: Hiding -> (Abs (ICExp o)) -> HNExp' o
- Agda.Auto.Syntax: HNPi :: [Maybe (UId o)] -> FMode -> Bool -> (ICExp o) -> (Abs (ICExp o)) -> HNExp o
+ Agda.Auto.Syntax: HNPi :: Hiding -> Bool -> (ICExp o) -> (Abs (ICExp o)) -> HNExp' o
- Agda.Auto.Syntax: HNSort :: Sort -> HNExp o
+ Agda.Auto.Syntax: HNSort :: Sort -> HNExp' o
- Agda.Auto.Syntax: Lam :: FMode -> (Abs (MExp o)) -> Exp o
+ Agda.Auto.Syntax: Lam :: Hiding -> (Abs (MExp o)) -> Exp o
- Agda.Auto.Syntax: Pi :: (Maybe (UId o)) -> FMode -> Bool -> (MExp o) -> (Abs (MExp o)) -> Exp o
+ Agda.Auto.Syntax: Pi :: (Maybe (UId o)) -> Hiding -> Bool -> (MExp o) -> (Abs (MExp o)) -> Exp o
- Agda.Auto.Syntax: weak :: Nat -> CExp o -> CExp o
+ Agda.Auto.Syntax: weak :: Weakening t => Nat -> t -> t
- Agda.Auto.Typecheck: addend :: FMode -> MExp o -> MM (Exp o) blk -> MM (Exp o) blk
+ Agda.Auto.Typecheck: addend :: Hiding -> MExp o -> MM (Exp o) blk -> MM (Exp o) blk
- Agda.Auto.Typecheck: maybeor :: Bool -> Int -> IO (PB (RefInfo o)) -> IO (PB (RefInfo o)) -> IO (PB (RefInfo o))
+ Agda.Auto.Typecheck: maybeor :: Bool -> Prio -> IO (PB (RefInfo o)) -> IO (PB (RefInfo o)) -> IO (PB (RefInfo o))
- Agda.Compiler.Common: doCompile :: IsMain -> Interface -> (IsMain -> Interface -> TCM ()) -> TCM ()
+ Agda.Compiler.Common: doCompile :: forall r. Monoid r => IsMain -> Interface -> (IsMain -> Interface -> TCM r) -> TCM r
- Agda.Compiler.JS.Syntax: Export :: [MemberId] -> Bool -> Exp -> Export
+ Agda.Compiler.JS.Syntax: Export :: [MemberId] -> Exp -> Export
- Agda.Compiler.MAlonzo.Compiler: callGHC :: IsMain -> Interface -> TCM ()
+ Agda.Compiler.MAlonzo.Compiler: callGHC :: GHCOptions -> IsMain -> Map ModuleName IsMain -> TCM ()
- Agda.Compiler.MAlonzo.Compiler: checkConstructorType :: QName -> TCM [Decl]
+ Agda.Compiler.MAlonzo.Compiler: checkConstructorType :: QName -> HaskellCode -> TCM [Decl]
- Agda.Compiler.MAlonzo.Compiler: checkCover :: QName -> HaskellType -> Nat -> [QName] -> TCM [Decl]
+ Agda.Compiler.MAlonzo.Compiler: checkCover :: QName -> HaskellType -> Nat -> [QName] -> [HaskellCode] -> TCM [Decl]
- Agda.Interaction.BasicOps: give :: InteractionId -> Maybe Range -> Expr -> TCM Expr
+ Agda.Interaction.BasicOps: give :: UseForce -> InteractionId -> Maybe Range -> Expr -> TCM Expr
- Agda.Interaction.BasicOps: giveExpr :: Maybe InteractionId -> MetaId -> Expr -> TCM ()
+ Agda.Interaction.BasicOps: giveExpr :: UseForce -> Maybe InteractionId -> MetaId -> Expr -> TCM ()
- Agda.Interaction.BasicOps: refine :: InteractionId -> Maybe Range -> Expr -> TCM Expr
+ Agda.Interaction.BasicOps: refine :: UseForce -> InteractionId -> Maybe Range -> Expr -> TCM Expr
- Agda.Interaction.FindFile: moduleName' :: AbsolutePath -> TCM (Ranged TopLevelModuleName)
+ Agda.Interaction.FindFile: moduleName' :: AbsolutePath -> TCM TopLevelModuleName
- Agda.Interaction.Highlighting.Emacs: lispifyHighlightingInfo :: HighlightingInfo -> ModuleToSource -> TCM (Lisp String)
+ Agda.Interaction.Highlighting.Emacs: lispifyHighlightingInfo :: HighlightingInfo -> HighlightingMethod -> ModuleToSource -> IO (Lisp String)
- Agda.Interaction.Highlighting.Generate: generateAndPrintSyntaxInfo :: Declaration -> Level -> TCM ()
+ Agda.Interaction.Highlighting.Generate: generateAndPrintSyntaxInfo :: Declaration -> Level -> Bool -> TCM ()
- Agda.Interaction.Highlighting.HTML: generatePage :: (FilePath -> FilePath -> String -> String) -> FilePath -> TopLevelModuleName -> TCM ()
+ Agda.Interaction.Highlighting.HTML: generatePage :: (FilePath -> FilePath -> String -> Text) -> FilePath -> TopLevelModuleName -> TCM ()
- Agda.Interaction.Highlighting.HTML: page :: FilePath -> TopLevelModuleName -> Html -> String
+ Agda.Interaction.Highlighting.HTML: page :: FilePath -> TopLevelModuleName -> Html -> Text
- Agda.Interaction.Highlighting.Precise: Aspects :: Maybe Aspect -> [OtherAspect] -> Maybe String -> Maybe (TopLevelModuleName, Int) -> Aspects
+ Agda.Interaction.Highlighting.Precise: Aspects :: Maybe Aspect -> [OtherAspect] -> Maybe String -> Maybe DefinitionSite -> Aspects
- Agda.Interaction.Highlighting.Precise: [definitionSite] :: Aspects -> Maybe (TopLevelModuleName, Int)
+ Agda.Interaction.Highlighting.Precise: [definitionSite] :: Aspects -> Maybe DefinitionSite
- Agda.Interaction.Imports: MainInterface :: MainInterface
+ Agda.Interaction.Imports: MainInterface :: Mode -> MainInterface
- Agda.Interaction.Imports: addImportedThings :: Signature -> BuiltinThings PrimFun -> Set String -> Set String -> PatternSynDefns -> DisplayForms -> TCM ()
+ Agda.Interaction.Imports: addImportedThings :: Signature -> BuiltinThings PrimFun -> PatternSynDefns -> DisplayForms -> [TCWarning] -> TCM ()
- Agda.Interaction.Imports: alreadyVisited :: TopLevelModuleName -> TCM (Interface, MaybeWarnings) -> TCM (Interface, MaybeWarnings)
+ Agda.Interaction.Imports: alreadyVisited :: TopLevelModuleName -> MainInterface -> TCM (Interface, MaybeWarnings) -> TCM (Interface, MaybeWarnings)
- Agda.Interaction.Imports: buildInterface :: AbsolutePath -> TopLevelInfo -> HighlightingInfo -> Set String -> Set String -> [OptionsPragma] -> TCM Interface
+ Agda.Interaction.Imports: buildInterface :: AbsolutePath -> TopLevelInfo -> HighlightingInfo -> [OptionsPragma] -> TCM Interface
- Agda.Interaction.Imports: createInterface :: AbsolutePath -> TopLevelModuleName -> Bool -> TCM (Interface, MaybeWarnings)
+ Agda.Interaction.Imports: createInterface :: AbsolutePath -> TopLevelModuleName -> MainInterface -> TCM (Interface, MaybeWarnings)
- Agda.Interaction.Imports: getStoredInterface :: TopLevelModuleName -> AbsolutePath -> Bool -> TCM (Bool, (Interface, MaybeWarnings))
+ Agda.Interaction.Imports: getStoredInterface :: TopLevelModuleName -> AbsolutePath -> MainInterface -> TCM (Bool, (Interface, MaybeWarnings))
- Agda.Interaction.Imports: typeCheck :: TopLevelModuleName -> AbsolutePath -> Bool -> TCM (Bool, (Interface, MaybeWarnings))
+ Agda.Interaction.Imports: typeCheck :: TopLevelModuleName -> AbsolutePath -> MainInterface -> TCM (Bool, (Interface, MaybeWarnings))
- Agda.Interaction.Imports: typeCheckMain :: AbsolutePath -> TCM (Interface, MaybeWarnings)
+ Agda.Interaction.Imports: typeCheckMain :: AbsolutePath -> Mode -> TCM (Interface, MaybeWarnings)
- Agda.Interaction.InteractionTop: Cmd_compile :: Backend -> FilePath -> [String] -> Interaction' range
+ Agda.Interaction.InteractionTop: Cmd_compile :: CompilerBackend -> FilePath -> [String] -> Interaction' range
- Agda.Interaction.InteractionTop: Cmd_give :: InteractionId -> range -> String -> Interaction' range
+ Agda.Interaction.InteractionTop: Cmd_give :: UseForce -> InteractionId -> range -> String -> Interaction' range
- Agda.Interaction.InteractionTop: CommandState :: [InteractionId] -> Maybe (AbsolutePath, ClockTime) -> CommandLineOptions -> !OldInteractionScopes -> CommandState
+ Agda.Interaction.InteractionTop: CommandState :: [InteractionId] -> Maybe (AbsolutePath, ClockTime) -> CommandLineOptions -> !OldInteractionScopes -> CommandQueue -> CommandState
- Agda.Interaction.InteractionTop: LaTeX :: Backend
+ Agda.Interaction.InteractionTop: LaTeX :: CompilerBackend
- Agda.Interaction.InteractionTop: cmd_load' :: FilePath -> [String] -> Bool -> ((Interface, MaybeWarnings) -> CommandM ()) -> CommandM ()
+ Agda.Interaction.InteractionTop: cmd_load' :: FilePath -> [String] -> Bool -> Mode -> ((Interface, MaybeWarnings) -> CommandM ()) -> CommandM ()
- Agda.Interaction.InteractionTop: give_gen :: InteractionId -> Range -> String -> GiveRefine -> CommandM ()
+ Agda.Interaction.InteractionTop: give_gen :: UseForce -> InteractionId -> Range -> String -> GiveRefine -> CommandM ()
- Agda.Interaction.InteractionTop: initCommandState :: CommandState
+ Agda.Interaction.InteractionTop: initCommandState :: CommandQueue -> CommandState
- Agda.Interaction.InteractionTop: tellToUpdateHighlighting :: Maybe (HighlightingInfo, ModuleToSource) -> IO [Response]
+ Agda.Interaction.InteractionTop: tellToUpdateHighlighting :: Maybe (HighlightingInfo, HighlightingMethod, ModuleToSource) -> IO [Response]
- Agda.Interaction.Options: Options :: String -> Maybe FilePath -> [FilePath] -> [AbsolutePath] -> [LibName] -> Maybe FilePath -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> [String] -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Int -> [String] -> Bool -> Maybe FilePath -> Bool -> Bool -> Bool -> Maybe FilePath -> FilePath -> FilePath -> Maybe FilePath -> Bool -> Bool -> PragmaOptions -> [String] -> Bool -> Bool -> Bool -> CommandLineOptions
+ Agda.Interaction.Options: Options :: String -> Maybe FilePath -> [FilePath] -> [AbsolutePath] -> [LibName] -> Maybe FilePath -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Bool -> Maybe FilePath -> FilePath -> Bool -> FilePath -> Maybe FilePath -> Bool -> Bool -> PragmaOptions -> Bool -> Bool -> Bool -> CommandLineOptions
- Agda.Interaction.Options: PragmaOptions :: Bool -> Bool -> Verbosity -> Bool -> Bool -> Bool -> Bool -> CutOff -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Int -> PragmaOptions
+ Agda.Interaction.Options: PragmaOptions :: Bool -> Bool -> Verbosity -> Bool -> Bool -> Bool -> Bool -> CutOff -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Int -> Bool -> WarningMode -> Bool -> PragmaOptions
- Agda.Interaction.Options: [optCompileNoMain] :: CommandLineOptions -> Bool
+ Agda.Interaction.Options: [optCompileNoMain] :: PragmaOptions -> Bool
- Agda.Interaction.Options: [optSafe] :: CommandLineOptions -> Bool
+ Agda.Interaction.Options: [optSafe] :: PragmaOptions -> Bool
- Agda.Interaction.Options.Lenses: class LensCommandLineOptions a where setCommandLineOptions = mapCommandLineOptions . const mapCommandLineOptions f a = setCommandLineOptions (f $ getCommandLineOptions a) a
+ Agda.Interaction.Options.Lenses: class LensCommandLineOptions a
- Agda.Interaction.Options.Lenses: class LensIncludePaths a where setIncludePaths = mapIncludePaths . const mapIncludePaths f a = setIncludePaths (f $ getIncludePaths a) a setAbsoluteIncludePaths = mapAbsoluteIncludePaths . const mapAbsoluteIncludePaths f a = setAbsoluteIncludePaths (f $ getAbsoluteIncludePaths a) a
+ Agda.Interaction.Options.Lenses: class LensIncludePaths a
- Agda.Interaction.Options.Lenses: class LensPersistentVerbosity a where setPersistentVerbosity = mapPersistentVerbosity . const mapPersistentVerbosity f a = setPersistentVerbosity (f $ getPersistentVerbosity a) a
+ Agda.Interaction.Options.Lenses: class LensPersistentVerbosity a
- Agda.Interaction.Options.Lenses: class LensPragmaOptions a where setPragmaOptions = mapPragmaOptions . const mapPragmaOptions f a = setPragmaOptions (f $ getPragmaOptions a) a
+ Agda.Interaction.Options.Lenses: class LensPragmaOptions a
- Agda.Interaction.Options.Lenses: class LensSafeMode a where setSafeMode = mapSafeMode . const mapSafeMode f a = setSafeMode (f $ getSafeMode a) a
+ Agda.Interaction.Options.Lenses: class LensSafeMode a
- Agda.Interaction.Options.Lenses: class LensVerbosity a where setVerbosity = mapVerbosity . const mapVerbosity f a = setVerbosity (f $ getVerbosity a) a
+ Agda.Interaction.Options.Lenses: class LensVerbosity a
- Agda.Interaction.Response: Info_CompilationOk :: DisplayInfo
+ Agda.Interaction.Response: Info_CompilationOk :: String -> String -> DisplayInfo
- Agda.Interaction.Response: Resp_HighlightingInfo :: HighlightingInfo -> ModuleToSource -> Response
+ Agda.Interaction.Response: Resp_HighlightingInfo :: HighlightingInfo -> HighlightingMethod -> ModuleToSource -> Response
- Agda.Interaction.Response: type InteractionOutputCallback = Response -> TCM ()
+ Agda.Interaction.Response: type InteractionOutputCallback = Response -> IO ()
- Agda.Interaction.SearchAbout: findMentions :: Rewrite -> Range -> String -> TCM [(Name, Type)]
+ Agda.Interaction.SearchAbout: findMentions :: Rewrite -> Range -> String -> ScopeM [(Name, Type)]
- Agda.Main: printUsage :: IO ()
+ Agda.Main: printUsage :: [Backend] -> IO ()
- Agda.Main: printVersion :: IO ()
+ Agda.Main: printVersion :: [Backend] -> IO ()
- Agda.Main: runAgda :: TCM ()
+ Agda.Main: runAgda :: [Backend] -> IO ()
- Agda.Main: runAgdaWithOptions :: TCM () -> String -> CommandLineOptions -> TCM ()
+ Agda.Main: runAgdaWithOptions :: [Backend] -> TCM () -> (TCM (Maybe Interface) -> TCM a) -> String -> CommandLineOptions -> TCM (Maybe a)
- Agda.Syntax.Abstract: AbsurdLam :: ExprInfo -> Hiding -> Expr
+ Agda.Syntax.Abstract: AbsurdLam :: LamInfo -> Hiding -> Expr
- Agda.Syntax.Abstract: Clause :: lhs -> [NamedDotPattern] -> RHS -> [Declaration] -> Bool -> Clause' lhs
+ Agda.Syntax.Abstract: Clause :: lhs -> [NamedDotPattern] -> [StrippedDotPattern] -> RHS -> [Declaration] -> Bool -> Clause' lhs
- Agda.Syntax.Abstract: ExtendedLam :: ExprInfo -> DefInfo -> QName -> [Clause] -> Expr
+ Agda.Syntax.Abstract: ExtendedLam :: LamInfo -> DefInfo -> QName -> [Clause] -> Expr
- Agda.Syntax.Abstract: Lam :: ExprInfo -> LamBinding -> Expr -> Expr
+ Agda.Syntax.Abstract: Lam :: LamInfo -> LamBinding -> Expr -> Expr
- Agda.Syntax.Abstract.Name: class MkName a where mkName_ = mkName noRange
+ Agda.Syntax.Abstract.Name: class MkName a
- Agda.Syntax.Abstract.Views: class ExprLike a where recurseExpr = traverse . recurseExpr foldExpr f = getConst . recurseExpr (\ pre post -> Const (f pre) <* post) traverseExpr f = recurseExpr (\ pre post -> f =<< post) mapExpr f = runIdentity . traverseExpr (Identity . f)
+ Agda.Syntax.Abstract.Views: class ExprLike a
- Agda.Syntax.Common: ArgInfo :: Hiding -> Relevance -> Origin -> Bool -> ArgInfo
+ Agda.Syntax.Common: ArgInfo :: Hiding -> Relevance -> Origin -> ArgInfo
- Agda.Syntax.Common: Instance :: Hiding
+ Agda.Syntax.Common: Instance :: Overlappable -> Hiding
- Agda.Syntax.Common: class LensArgInfo a where setArgInfo ai = mapArgInfo (const ai) mapArgInfo f a = setArgInfo (f $ getArgInfo a) a
+ Agda.Syntax.Common: class LensArgInfo a
- Agda.Syntax.Common: class LensHiding a where setHiding h = mapHiding (const h) mapHiding f a = setHiding (f $ getHiding a) a
+ Agda.Syntax.Common: class LensHiding a
- Agda.Syntax.Common: class LensOrigin a where setOrigin o = mapOrigin (const o) mapOrigin f a = setOrigin (f $ getOrigin a) a
+ Agda.Syntax.Common: class LensOrigin a
- Agda.Syntax.Common: class LensRelevance a where setRelevance h = mapRelevance (const h) mapRelevance f a = setRelevance (f $ getRelevance a) a
+ Agda.Syntax.Common: class LensRelevance a
- Agda.Syntax.Common: class Eq a => Underscore a where isUnderscore = (== underscore)
+ Agda.Syntax.Common: class Eq a => Underscore a
- Agda.Syntax.Common: unusableRelevance :: Relevance -> Bool
+ Agda.Syntax.Common: unusableRelevance :: LensRelevance a => a -> Bool
- Agda.Syntax.Concrete.Definitions: FunDef :: Range -> [Declaration] -> Fixity' -> IsAbstract -> TerminationCheck -> Name -> [Clause] -> NiceDeclaration
+ Agda.Syntax.Concrete.Definitions: FunDef :: Range -> [Declaration] -> Fixity' -> IsAbstract -> IsInstance -> TerminationCheck -> Name -> [Clause] -> NiceDeclaration
- Agda.Syntax.Concrete.Definitions: PolarityPragmasButNotPostulates :: [Name] -> DeclarationException
+ Agda.Syntax.Concrete.Definitions: PolarityPragmasButNotPostulates :: [Name] -> DeclarationWarning
- Agda.Syntax.Concrete.Definitions: UnknownNamesInFixityDecl :: [Name] -> DeclarationException
+ Agda.Syntax.Concrete.Definitions: UnknownNamesInFixityDecl :: [Name] -> DeclarationWarning
- Agda.Syntax.Concrete.Definitions: UnknownNamesInPolarityPragmas :: [Name] -> DeclarationException
+ Agda.Syntax.Concrete.Definitions: UnknownNamesInPolarityPragmas :: [Name] -> DeclarationWarning
- Agda.Syntax.Concrete.Definitions: UselessAbstract :: Range -> DeclarationException
+ Agda.Syntax.Concrete.Definitions: UselessAbstract :: Range -> DeclarationWarning
- Agda.Syntax.Concrete.Definitions: UselessInstance :: Range -> DeclarationException
+ Agda.Syntax.Concrete.Definitions: UselessInstance :: Range -> DeclarationWarning
- Agda.Syntax.Concrete.Definitions: UselessPrivate :: Range -> DeclarationException
+ Agda.Syntax.Concrete.Definitions: UselessPrivate :: Range -> DeclarationWarning
- Agda.Syntax.Concrete.Definitions: WrongParameters :: Name -> DeclarationException
+ Agda.Syntax.Concrete.Definitions: WrongParameters :: Name -> Params -> Params -> DeclarationException
- Agda.Syntax.Concrete.Definitions: runNice :: Nice a -> Either DeclarationException a
+ Agda.Syntax.Concrete.Definitions: runNice :: Nice a -> (Either DeclarationException a, NiceWarnings)
- Agda.Syntax.Concrete.Generic: class ExprLike a where traverseExpr = (throwImpossible (Impossible "src/full/Agda/Syntax/Concrete/Generic.hs" 43)) foldExpr = (throwImpossible (Impossible "src/full/Agda/Syntax/Concrete/Generic.hs" 44))
+ Agda.Syntax.Concrete.Generic: class ExprLike a
- Agda.Syntax.Concrete.Name: TopLevelModuleName :: [String] -> TopLevelModuleName
+ Agda.Syntax.Concrete.Name: TopLevelModuleName :: Range -> [String] -> TopLevelModuleName
- Agda.Syntax.Concrete.Operators.Parser: [In] :: NK InfixNotation
+ Agda.Syntax.Concrete.Operators.Parser: [In] :: NK 'InfixNotation
- Agda.Syntax.Concrete.Operators.Parser: [Non] :: NK NonfixNotation
+ Agda.Syntax.Concrete.Operators.Parser: [Non] :: NK 'NonfixNotation
- Agda.Syntax.Concrete.Operators.Parser: [Post] :: NK PostfixNotation
+ Agda.Syntax.Concrete.Operators.Parser: [Post] :: NK 'PostfixNotation
- Agda.Syntax.Concrete.Operators.Parser: [Pre] :: NK PrefixNotation
+ Agda.Syntax.Concrete.Operators.Parser: [Pre] :: NK 'PrefixNotation
- Agda.Syntax.Concrete.Pretty: prettyOpApp :: Pretty a => QName -> [NamedArg (MaybePlaceholder a)] -> [Doc]
+ Agda.Syntax.Concrete.Pretty: prettyOpApp :: forall a. Pretty a => QName -> [NamedArg (MaybePlaceholder a)] -> [Doc]
- Agda.Syntax.Fixity: appBrackets :: Precedence -> Bool
+ Agda.Syntax.Fixity: appBrackets :: PrecedenceStack -> Bool
- Agda.Syntax.Fixity: lamBrackets :: Precedence -> Bool
+ Agda.Syntax.Fixity: lamBrackets :: PrecedenceStack -> Bool
- Agda.Syntax.Fixity: opBrackets :: Fixity -> Precedence -> Bool
+ Agda.Syntax.Fixity: opBrackets :: Fixity -> PrecedenceStack -> Bool
- Agda.Syntax.Fixity: piBrackets :: Precedence -> Bool
+ Agda.Syntax.Fixity: piBrackets :: PrecedenceStack -> Bool
- Agda.Syntax.Fixity: roundFixBrackets :: Precedence -> Bool
+ Agda.Syntax.Fixity: roundFixBrackets :: PrecedenceStack -> Bool
- Agda.Syntax.Fixity: withAppBrackets :: Precedence -> Bool
+ Agda.Syntax.Fixity: withAppBrackets :: PrecedenceStack -> Bool
- Agda.Syntax.Internal: Clause :: Range -> Telescope -> [NamedArg DeBruijnPattern] -> Maybe Term -> Maybe (Arg Type) -> Bool -> Clause
+ Agda.Syntax.Internal: Clause :: Range -> Range -> Telescope -> [NamedArg DeBruijnPattern] -> Maybe Term -> Maybe (Arg Type) -> Bool -> Maybe Bool -> Clause
- Agda.Syntax.Internal: EmptyS :: Substitution' a
+ Agda.Syntax.Internal: EmptyS :: Empty -> Substitution' a
- Agda.Syntax.Internal: EqualityType :: Sort -> QName -> Arg Term -> Arg Term -> Arg Term -> Arg Term -> EqualityView
+ Agda.Syntax.Internal: EqualityType :: Sort -> QName -> [Arg Term] -> Arg Term -> Arg Term -> Arg Term -> EqualityView
- Agda.Syntax.Internal: class LensConName a where setConName = mapConName . const mapConName f a = setConName (f (getConName a)) a
+ Agda.Syntax.Internal: class LensConName a
- Agda.Syntax.Internal: class LensSort a where getSort a = a ^. lensSort
+ Agda.Syntax.Internal: class LensSort a
- Agda.Syntax.Internal: class TermSize a where termSize = getSum . tsize
+ Agda.Syntax.Internal: class TermSize a
- Agda.Syntax.Internal: patternVars :: Arg (Pattern' a) -> [Arg (Either a Term)]
+ Agda.Syntax.Internal: patternVars :: PatternVars a b => b -> [Arg (Either a Term)]
- Agda.Syntax.Internal.Defs: getDefs :: (GetDefs a, MonadGetDefs m) => a -> m ()
+ Agda.Syntax.Internal.Defs: getDefs :: (GetDefs a, MonadGetDefs m, Foldable f, GetDefs b, f b ~ a) => a -> m ()
- Agda.Syntax.Internal.Generic: foldTerm :: (TermLike a, Monoid m) => (Term -> m) -> a -> m
+ Agda.Syntax.Internal.Generic: foldTerm :: (TermLike a, Monoid m, Foldable f, TermLike b, f b ~ a) => (Term -> m) -> a -> m
- Agda.Syntax.Internal.Generic: traverseTermM :: (TermLike a, Monad m) => (Term -> m Term) -> a -> m a
+ Agda.Syntax.Internal.Generic: traverseTermM :: (TermLike a, Monad m, Traversable f, TermLike b, f b ~ a) => (Term -> m Term) -> a -> m a
- Agda.Syntax.Internal.Names: namesIn :: NamesIn a => a -> Set QName
+ Agda.Syntax.Internal.Names: namesIn :: (NamesIn a, Foldable f, NamesIn b, f b ~ a) => a -> Set QName
- Agda.Syntax.Internal.Pattern: labelPatVars :: LabelPatVars a b i => a -> State [i] b
+ Agda.Syntax.Internal.Pattern: labelPatVars :: (LabelPatVars a b i, Traversable f, LabelPatVars a' b' i, f a' ~ a, f b' ~ b) => a -> State [i] b
- Agda.Syntax.Internal.Pattern: unlabelPatVars :: LabelPatVars a b i => b -> a
+ Agda.Syntax.Internal.Pattern: unlabelPatVars :: (LabelPatVars a b i, Traversable f, LabelPatVars a' b' i, f a' ~ a, f b' ~ b) => b -> a
- Agda.Syntax.Internal.SanityCheck: sanityCheckSubst :: (Pretty a, FreeVS a) => Telescope -> Substitution' a -> Telescope -> TCM ()
+ Agda.Syntax.Internal.SanityCheck: sanityCheckSubst :: (Pretty a, Free a) => Telescope -> Substitution' a -> Telescope -> TCM ()
- Agda.Syntax.Internal.SanityCheck: sanityCheckVars :: (Pretty a, FreeVS a) => Telescope -> a -> TCM ()
+ Agda.Syntax.Internal.SanityCheck: sanityCheckVars :: (Pretty a, Free a) => Telescope -> a -> TCM ()
- Agda.Syntax.Parser.Literate: Code :: LayerType
+ Agda.Syntax.Parser.Literate: Code :: LayerRole
- Agda.Syntax.Parser.Literate: Comment :: LayerType
+ Agda.Syntax.Parser.Literate: Comment :: LayerRole
- Agda.Syntax.Parser.Literate: Layer :: LayerType -> Interval -> String -> Layer
+ Agda.Syntax.Parser.Literate: Layer :: LayerRole -> Interval -> String -> Layer
- Agda.Syntax.Parser.Literate: Markup :: LayerType
+ Agda.Syntax.Parser.Literate: Markup :: LayerRole
- Agda.Syntax.Parser.Literate: isCode :: Layer -> Bool
+ Agda.Syntax.Parser.Literate: isCode :: LayerRole -> Bool
- Agda.Syntax.Scope.Base: LocalVar :: Name -> LocalVar
+ Agda.Syntax.Scope.Base: LocalVar :: Name -> Bool -> [AbstractName] -> LocalVar
- Agda.Syntax.Scope.Base: Scope :: ModuleName -> [ModuleName] -> ScopeNameSpaces -> Map QName ModuleName -> Bool -> Scope
+ Agda.Syntax.Scope.Base: Scope :: ModuleName -> [ModuleName] -> ScopeNameSpaces -> Map QName ModuleName -> Maybe DataOrRecord -> Scope
- Agda.Syntax.Scope.Base: ScopeInfo :: ModuleName -> Map ModuleName Scope -> LocalVars -> Precedence -> Map QName [QName] -> Map ModuleName [QName] -> InScopeSet -> ScopeInfo
+ Agda.Syntax.Scope.Base: ScopeInfo :: ModuleName -> Map ModuleName Scope -> LocalVars -> PrecedenceStack -> Map QName [QName] -> Map ModuleName [QName] -> InScopeSet -> ScopeInfo
- Agda.Syntax.Scope.Base: [scopeDatatypeModule] :: Scope -> Bool
+ Agda.Syntax.Scope.Base: [scopeDatatypeModule] :: Scope -> Maybe DataOrRecord
- Agda.Syntax.Scope.Base: [scopePrecedence] :: ScopeInfo -> Precedence
+ Agda.Syntax.Scope.Base: [scopePrecedence] :: ScopeInfo -> PrecedenceStack
- Agda.Syntax.Scope.Base: blockOfLines :: String -> [String] -> [String]
+ Agda.Syntax.Scope.Base: blockOfLines :: Doc -> [Doc] -> [Doc]
- Agda.Syntax.Scope.Monad: VarName :: Name -> ResolvedName
+ Agda.Syntax.Scope.Monad: VarName :: Name -> Bool -> ResolvedName
- Agda.Syntax.Scope.Monad: bindVariable :: Name -> Name -> ScopeM ()
+ Agda.Syntax.Scope.Monad: bindVariable :: Bool -> Name -> Name -> ScopeM ()
- Agda.Syntax.Scope.Monad: createModule :: Bool -> ModuleName -> ScopeM ()
+ Agda.Syntax.Scope.Monad: createModule :: Maybe DataOrRecord -> ModuleName -> ScopeM ()
- Agda.Syntax.Scope.Monad: isDatatypeModule :: ModuleName -> ScopeM Bool
+ Agda.Syntax.Scope.Monad: isDatatypeModule :: ModuleName -> ScopeM (Maybe DataOrRecord)
- Agda.Syntax.Translation.AbstractToConcrete: class ToConcrete a c | a -> c where toConcrete x = bindToConcrete x return bindToConcrete x ret = ret =<< toConcrete x
+ Agda.Syntax.Translation.AbstractToConcrete: class ToConcrete a c | a -> c
- Agda.Syntax.Translation.InternalToAbstract: class Reify i a | i -> a where reifyWhen _ = reify
+ Agda.Syntax.Translation.InternalToAbstract: class Reify i a | i -> a
- Agda.Termination.CallGraph: (>*<) :: (CallComb a, ?cutoff :: CutOff) => a -> a -> a
+ Agda.Termination.CallGraph: (>*<) :: (CallComb a, (?cutoff :: CutOff)) => a -> a -> a
- Agda.Termination.CallMatrix: (>*<) :: (CallComb a, ?cutoff :: CutOff) => a -> a -> a
+ Agda.Termination.CallMatrix: (>*<) :: (CallComb a, (?cutoff :: CutOff)) => a -> a -> a
- Agda.Termination.Inlining: inlineWithClauses :: QName -> Clause -> TCM [Clause]
+ Agda.Termination.Inlining: inlineWithClauses :: QName -> Clause -> TCM (Maybe [Clause])
- Agda.Termination.Monad: TerEnv :: Bool -> Bool -> Bool -> Maybe QName -> Maybe QName -> CutOff -> QName -> MutualNames -> [QName] -> Maybe Target -> Delayed -> [Bool] -> Bool -> Int -> MaskedDeBruijnPats -> !Int -> !Guarded -> Bool -> VarSet -> TerEnv
+ Agda.Termination.Monad: TerEnv :: Bool -> Bool -> Bool -> Maybe QName -> Maybe QName -> CutOff -> QName -> MutualNames -> [QName] -> Bool -> Maybe Target -> Delayed -> [Bool] -> Bool -> Int -> MaskedDeBruijnPatterns -> !Int -> !Guarded -> Bool -> VarSet -> TerEnv
- Agda.Termination.Monad: [terPatterns] :: TerEnv -> MaskedDeBruijnPats
+ Agda.Termination.Monad: [terPatterns] :: TerEnv -> MaskedDeBruijnPatterns
- Agda.Termination.Monad: class (Functor m, Monad m) => MonadTer m where terAsks f = f <$> terAsk
+ Agda.Termination.Monad: class (Functor m, Monad m) => MonadTer m
- Agda.Termination.Monad: patternDepth :: DeBruijnPat' a -> Int
+ Agda.Termination.Monad: patternDepth :: forall a. Pattern' a -> Int
- Agda.Termination.Monad: terGetPatterns :: TerM (MaskedDeBruijnPats)
+ Agda.Termination.Monad: terGetPatterns :: TerM (MaskedDeBruijnPatterns)
- Agda.Termination.Monad: terSetPatterns :: MaskedDeBruijnPats -> TerM a -> TerM a
+ Agda.Termination.Monad: terSetPatterns :: MaskedDeBruijnPatterns -> TerM a -> TerM a
- Agda.Termination.Monad: unusedVar :: DeBruijnPat
+ Agda.Termination.Monad: unusedVar :: DeBruijnPattern
- Agda.Termination.Order: Decr :: {-# UNPACK #-} !Int -> Order
+ Agda.Termination.Order: Decr :: !Bool -> {-# UNPACK #-} !Int -> Order
- Agda.Termination.Order: decr :: (?cutoff :: CutOff) => Int -> Order
+ Agda.Termination.Order: decr :: (?cutoff :: CutOff) => Bool -> Int -> Order
- Agda.TypeChecking.CheckInternal: Action :: (Type -> Term -> TCM Term) -> (Type -> Term -> TCM Term) -> Action
+ Agda.TypeChecking.CheckInternal: Action :: (Type -> Term -> TCM Term) -> (Type -> Term -> TCM Term) -> (Relevance -> Relevance -> Relevance) -> Action
- Agda.TypeChecking.CompiledClause: Case :: (Arg Int) -> (Case CompiledClauses) -> CompiledClauses
+ Agda.TypeChecking.CompiledClause: Case :: (Arg Int) -> (Case (CompiledClauses' a)) -> CompiledClauses' a
- Agda.TypeChecking.CompiledClause: Done :: [Arg ArgName] -> Term -> CompiledClauses
+ Agda.TypeChecking.CompiledClause: Done :: [Arg ArgName] -> a -> CompiledClauses' a
- Agda.TypeChecking.CompiledClause: Fail :: CompiledClauses
+ Agda.TypeChecking.CompiledClause: Fail :: CompiledClauses' a
- Agda.TypeChecking.CompiledClause: prettyMap :: (Show k, Pretty v) => Map k v -> [Doc]
+ Agda.TypeChecking.CompiledClause: prettyMap :: (Pretty k, Pretty v) => Map k v -> [Doc]
- Agda.TypeChecking.Coverage.Match: isTrivialPattern :: Pattern' a -> Bool
+ Agda.TypeChecking.Coverage.Match: isTrivialPattern :: (HasConstInfo m) => Pattern' a -> m Bool
- Agda.TypeChecking.Datatypes: getConForm :: QName -> TCM ConHead
+ Agda.TypeChecking.Datatypes: getConForm :: QName -> TCM (Either SigError ConHead)
- Agda.TypeChecking.Datatypes: getConHead :: QName -> TCM ConHead
+ Agda.TypeChecking.Datatypes: getConHead :: QName -> TCM (Either SigError ConHead)
- Agda.TypeChecking.Datatypes: getConType :: ConHead -> Type -> TCM (Maybe Type)
+ Agda.TypeChecking.Datatypes: getConType :: ConHead -> Type -> TCM (Maybe ((QName, Type, Args), Type))
- Agda.TypeChecking.Datatypes: getOrigConHead :: QName -> TCM ConHead
+ Agda.TypeChecking.Datatypes: getOrigConHead :: QName -> TCM (Either SigError ConHead)
- Agda.TypeChecking.DisplayForm: match :: Match a => a -> a -> MaybeT TCM [Term]
+ Agda.TypeChecking.DisplayForm: match :: Match a => a -> a -> MaybeT TCM [WithOrigin Term]
- Agda.TypeChecking.Free: allFreeVars :: Free' a VarSet => a -> VarSet
+ Agda.TypeChecking.Free: allFreeVars :: Free a => a -> VarSet
- Agda.TypeChecking.Free: allRelevantVars :: Free' a VarSet => a -> VarSet
+ Agda.TypeChecking.Free: allRelevantVars :: Free a => a -> VarSet
- Agda.TypeChecking.Free: allRelevantVarsIgnoring :: Free' a VarSet => IgnoreSorts -> a -> VarSet
+ Agda.TypeChecking.Free: allRelevantVarsIgnoring :: Free a => IgnoreSorts -> a -> VarSet
- Agda.TypeChecking.Free: closed :: Free' a All => a -> Bool
+ Agda.TypeChecking.Free: closed :: Free a => a -> Bool
- Agda.TypeChecking.Free: freeVars :: (Monoid c, Singleton Variable c, Free' a c) => a -> c
+ Agda.TypeChecking.Free: freeVars :: (IsVarSet c, Singleton Variable c, Free a) => a -> c
- Agda.TypeChecking.Free: freeVars' :: (Free' a c, Monoid c) => a -> FreeM c
+ Agda.TypeChecking.Free: freeVars' :: (Free a, IsVarSet c) => a -> FreeM c
- Agda.TypeChecking.Free: occurrence :: FreeV a => Nat -> a -> Occurrence
+ Agda.TypeChecking.Free: occurrence :: Free a => Nat -> a -> Occurrence
- Agda.TypeChecking.Free: runFree :: (Monoid c, Free' a c) => SingleVar c -> IgnoreSorts -> a -> c
+ Agda.TypeChecking.Free: runFree :: (IsVarSet c, Free a) => SingleVar c -> IgnoreSorts -> a -> c
- Agda.TypeChecking.Free.Lazy: FreeEnv :: !IgnoreSorts -> !Int -> !FlexRig -> !Relevance -> SingleVar c -> FreeEnv c
+ Agda.TypeChecking.Free.Lazy: FreeEnv :: !IgnoreSorts -> !FlexRig -> !Relevance -> (Maybe Variable -> c) -> FreeEnv c
- Agda.TypeChecking.Free.Lazy: [feSingleton] :: FreeEnv c -> SingleVar c
+ Agda.TypeChecking.Free.Lazy: [feSingleton] :: FreeEnv c -> Maybe Variable -> c
- Agda.TypeChecking.Free.Lazy: freeVars' :: (Free' a c, Monoid c) => a -> FreeM c
+ Agda.TypeChecking.Free.Lazy: freeVars' :: (Free a, IsVarSet c) => a -> FreeM c
- Agda.TypeChecking.Free.Lazy: initFreeEnv :: SingleVar c -> FreeEnv c
+ Agda.TypeChecking.Free.Lazy: initFreeEnv :: Monoid c => SingleVar c -> FreeEnv c
- Agda.TypeChecking.Free.Lazy: type Variable = (Int, VarOcc)
+ Agda.TypeChecking.Free.Lazy: type Variable = Int
- Agda.TypeChecking.Free.Lazy: variable :: (Monoid c) => Int -> FreeM c
+ Agda.TypeChecking.Free.Lazy: variable :: IsVarSet c => Int -> FreeM c
- Agda.TypeChecking.MetaVars.Occurs: foldRigid :: (FoldRigid a, Monoid (TCM m)) => (Nat -> TCM m) -> a -> TCM m
+ Agda.TypeChecking.MetaVars.Occurs: foldRigid :: (FoldRigid a, (Monoid (TCM m))) => (Nat -> TCM m) -> a -> TCM m
- Agda.TypeChecking.Monad.Base: AbstractDefn :: Defn
+ Agda.TypeChecking.Monad.Base: AbstractDefn :: Defn -> Defn
- Agda.TypeChecking.Monad.Base: Constructor :: Nat -> ConHead -> QName -> IsAbstract -> Induction -> [Bool] -> Defn
+ Agda.TypeChecking.Monad.Base: Constructor :: Int -> Int -> ConHead -> QName -> IsAbstract -> Induction -> [Bool] -> Defn
- Agda.TypeChecking.Monad.Base: CoverageNoExactSplit :: QName -> Clause -> TypeError
+ Agda.TypeChecking.Monad.Base: CoverageNoExactSplit :: QName -> [Clause] -> Warning
- Agda.TypeChecking.Monad.Base: Datatype :: Nat -> Permutation -> Drop Permutation -> Nat -> Induction -> (Maybe Clause) -> [QName] -> Sort -> [QName] -> IsAbstract -> Defn
+ Agda.TypeChecking.Monad.Base: Datatype :: Nat -> Permutation -> Drop Permutation -> Nat -> Induction -> (Maybe Clause) -> [QName] -> Sort -> Maybe [QName] -> IsAbstract -> Defn
- Agda.TypeChecking.Monad.Base: Defn :: ArgInfo -> QName -> Type -> [Polarity] -> [Occurrence] -> [LocalDisplayForm] -> MutualId -> CompiledRepresentation -> Maybe QName -> Bool -> Bool -> Defn -> Definition
+ Agda.TypeChecking.Monad.Base: Defn :: ArgInfo -> QName -> Type -> [Polarity] -> [Occurrence] -> [LocalDisplayForm] -> MutualId -> CompiledRepresentation -> Maybe QName -> Bool -> Bool -> Bool -> Defn -> Definition
- Agda.TypeChecking.Monad.Base: Function :: [Clause] -> Maybe CompiledClauses -> Maybe Compiled -> FunctionInverse -> [QName] -> IsAbstract -> Delayed -> Maybe Projection -> Set FunctionFlag -> Maybe Bool -> Maybe ExtLamInfo -> Maybe QName -> Bool -> Defn
+ Agda.TypeChecking.Monad.Base: Function :: [Clause] -> Maybe CompiledClauses -> Maybe Compiled -> FunctionInverse -> Maybe [QName] -> IsAbstract -> Delayed -> Maybe Projection -> Set FunctionFlag -> Maybe Bool -> Maybe ExtLamInfo -> Maybe QName -> Bool -> Defn
- Agda.TypeChecking.Monad.Base: IOException :: Range -> IOException -> TCErr
+ Agda.TypeChecking.Monad.Base: IOException :: TCState -> Range -> IOException -> TCErr
- Agda.TypeChecking.Monad.Base: InteractionPoint :: Range -> Maybe MetaId -> IPClause -> InteractionPoint
+ Agda.TypeChecking.Monad.Base: InteractionPoint :: Range -> Maybe MetaId -> Bool -> IPClause -> InteractionPoint
- Agda.TypeChecking.Monad.Base: Interface :: Hash -> [(ModuleName, Hash)] -> ModuleName -> Map ModuleName Scope -> ScopeInfo -> Signature -> DisplayForms -> BuiltinThings (String, QName) -> Set String -> Set String -> [String] -> HighlightingInfo -> [OptionsPragma] -> PatternSynDefns -> Interface
+ Agda.TypeChecking.Monad.Base: Interface :: Hash -> [(ModuleName, Hash)] -> ModuleName -> Map ModuleName Scope -> ScopeInfo -> Signature -> DisplayForms -> BuiltinThings (String, QName) -> Map BackendName [ForeignCode] -> HighlightingInfo -> [OptionsPragma] -> PatternSynDefns -> [TCWarning] -> Interface
- Agda.TypeChecking.Monad.Base: PConstr :: [ProblemId] -> Closure Constraint -> ProblemConstraint
+ Agda.TypeChecking.Monad.Base: PConstr :: Set ProblemId -> Closure Constraint -> ProblemConstraint
- Agda.TypeChecking.Monad.Base: PVar :: (Maybe CtxId) -> !Int -> [Arg Int] -> NLPat
+ Agda.TypeChecking.Monad.Base: PVar :: !Int -> [Arg Int] -> NLPat
- Agda.TypeChecking.Monad.Base: PersistentTCSt :: DecodedModules -> CommandLineOptions -> InteractionOutputCallback -> !Benchmark -> !Statistics -> !(Maybe LoadedFileCache) -> PersistentTCState
+ Agda.TypeChecking.Monad.Base: PersistentTCSt :: DecodedModules -> CommandLineOptions -> InteractionOutputCallback -> !Benchmark -> !Statistics -> !(Maybe LoadedFileCache) -> [Backend] -> PersistentTCState
- Agda.TypeChecking.Monad.Base: PostScopeState :: !CompressedFile -> !DisambiguatedNames -> !MetaStore -> !InteractionPoints -> !InteractionPoints -> !Constraints -> !Constraints -> !Bool -> !(Set QName) -> !Signature -> !ModuleParamDict -> !DisplayForms -> !(Maybe ModuleName) -> !TempInstanceTable -> !Statistics -> ![TCWarning] -> !(Map MutualId MutualBlock) -> !(BuiltinThings PrimFun) -> !MetaId -> !MutualId -> !CtxId -> !ProblemId -> !Int -> !NameId -> PostScopeState
+ Agda.TypeChecking.Monad.Base: PostScopeState :: !CompressedFile -> !DisambiguatedNames -> !MetaStore -> !InteractionPoints -> !Constraints -> !Constraints -> !Bool -> !(Set QName) -> !Signature -> !ModuleParamDict -> !DisplayForms -> !(Maybe ModuleName) -> !TempInstanceTable -> !Statistics -> ![TCWarning] -> !(Map MutualId MutualBlock) -> !(BuiltinThings PrimFun) -> !MetaId -> !MutualId -> !CtxId -> !ProblemId -> !Int -> !NameId -> PostScopeState
- Agda.TypeChecking.Monad.Base: PreScopeState :: !CompressedFile -> !Signature -> !(Set ModuleName) -> !ModuleToSource -> !VisitedModules -> !ScopeInfo -> !PatternSynDefns -> !PatternSynDefns -> !PragmaOptions -> !(BuiltinThings PrimFun) -> !DisplayForms -> !InstanceTable -> !(Set String) -> !(Set String) -> ![String] -> !InteractionId -> PreScopeState
+ Agda.TypeChecking.Monad.Base: PreScopeState :: !CompressedFile -> !Signature -> !(Set ModuleName) -> !ModuleToSource -> !VisitedModules -> !ScopeInfo -> !PatternSynDefns -> !PatternSynDefns -> !PragmaOptions -> !(BuiltinThings PrimFun) -> !DisplayForms -> !InstanceTable -> !(Map BackendName [ForeignCode]) -> !InteractionId -> PreScopeState
- Agda.TypeChecking.Monad.Base: Projection :: Bool -> QName -> Arg QName -> Int -> ProjLams -> Projection
+ Agda.TypeChecking.Monad.Base: Projection :: Maybe QName -> QName -> Arg QName -> Int -> ProjLams -> Projection
- Agda.TypeChecking.Monad.Base: Record :: Nat -> Maybe Clause -> ConHead -> Bool -> [Arg QName] -> Telescope -> [QName] -> EtaEquality -> Maybe Induction -> Bool -> IsAbstract -> Defn
+ Agda.TypeChecking.Monad.Base: Record :: Nat -> Maybe Clause -> ConHead -> Bool -> [Arg QName] -> Telescope -> Maybe [QName] -> EtaEquality -> Maybe Induction -> IsAbstract -> Defn
- Agda.TypeChecking.Monad.Base: SafeFlagNoPositivityCheck :: TypeError
+ Agda.TypeChecking.Monad.Base: SafeFlagNoPositivityCheck :: Warning
- Agda.TypeChecking.Monad.Base: SafeFlagNonTerminating :: TypeError
+ Agda.TypeChecking.Monad.Base: SafeFlagNonTerminating :: Warning
- Agda.TypeChecking.Monad.Base: SafeFlagPolarity :: TypeError
+ Agda.TypeChecking.Monad.Base: SafeFlagPolarity :: Warning
- Agda.TypeChecking.Monad.Base: SafeFlagPostulate :: Name -> TypeError
+ Agda.TypeChecking.Monad.Base: SafeFlagPostulate :: Name -> Warning
- Agda.TypeChecking.Monad.Base: SafeFlagPragma :: [String] -> TypeError
+ Agda.TypeChecking.Monad.Base: SafeFlagPragma :: [String] -> Warning
- Agda.TypeChecking.Monad.Base: SafeFlagPrimTrustMe :: TypeError
+ Agda.TypeChecking.Monad.Base: SafeFlagPrimTrustMe :: Warning
- Agda.TypeChecking.Monad.Base: SafeFlagTerminating :: TypeError
+ Agda.TypeChecking.Monad.Base: SafeFlagTerminating :: Warning
- Agda.TypeChecking.Monad.Base: TCEnv :: Context -> LetBindings -> ModuleName -> Maybe AbsolutePath -> [(ModuleName, Nat)] -> [TopLevelModuleName] -> Maybe MutualId -> TerminationCheck () -> Bool -> Bool -> Bool -> [ProblemId] -> AbstractMode -> Relevance -> Bool -> Range -> Range -> IPClause -> Maybe (Closure Call) -> HighlightingLevel -> HighlightingMethod -> !Int -> Bool -> ExpandHidden -> Maybe QName -> Simplification -> AllowedReductions -> Bool -> Bool -> Bool -> Bool -> UnquoteFlags -> !Int -> TCEnv
+ Agda.TypeChecking.Monad.Base: TCEnv :: Context -> LetBindings -> ModuleName -> Maybe AbsolutePath -> [(ModuleName, Nat)] -> [TopLevelModuleName] -> Maybe MutualId -> TerminationCheck () -> Bool -> Bool -> Bool -> Set ProblemId -> AbstractMode -> Relevance -> Bool -> Range -> Range -> IPClause -> Maybe (Closure Call) -> HighlightingLevel -> HighlightingMethod -> !Int -> Bool -> ExpandHidden -> Maybe QName -> Simplification -> AllowedReductions -> Bool -> Bool -> Bool -> Bool -> UnquoteFlags -> !Int -> TCEnv
- Agda.TypeChecking.Monad.Base: TCWarning :: TCState -> Closure Warning -> TCWarning
+ Agda.TypeChecking.Monad.Base: TCWarning :: Range -> Warning -> Doc -> TCWarning
- Agda.TypeChecking.Monad.Base: TooManyPolarities :: QName -> Integer -> TypeError
+ Agda.TypeChecking.Monad.Base: TooManyPolarities :: QName -> Int -> TypeError
- Agda.TypeChecking.Monad.Base: UnificationStuck :: Telescope -> [Term] -> [Term] -> TypeError
+ Agda.TypeChecking.Monad.Base: UnificationStuck :: QName -> Telescope -> Args -> Args -> [UnificationFailure] -> SplitError
- Agda.TypeChecking.Monad.Base: UnifyConflict :: ConHead -> ConHead -> TypeError
+ Agda.TypeChecking.Monad.Base: UnifyConflict :: Telescope -> Term -> Term -> NegativeUnification
- Agda.TypeChecking.Monad.Base: UnifyCycle :: Int -> Term -> TypeError
+ Agda.TypeChecking.Monad.Base: UnifyCycle :: Telescope -> Int -> Term -> NegativeUnification
- Agda.TypeChecking.Monad.Base: UnifyIndicesNotVars :: Type -> Term -> Term -> Args -> TypeError
+ Agda.TypeChecking.Monad.Base: UnifyIndicesNotVars :: Telescope -> Type -> Term -> Term -> Args -> UnificationFailure
- Agda.TypeChecking.Monad.Base: UnreachableClauses :: QName -> [[NamedArg DeBruijnPattern]] -> TypeError
+ Agda.TypeChecking.Monad.Base: UnreachableClauses :: QName -> [[NamedArg DeBruijnPattern]] -> Warning
- Agda.TypeChecking.Monad.Base: WithClausePatternMismatch :: Pattern -> Pattern -> TypeError
+ Agda.TypeChecking.Monad.Base: WithClausePatternMismatch :: Pattern -> (NamedArg DeBruijnPattern) -> TypeError
- Agda.TypeChecking.Monad.Base: WrongIrrelevanceInLambda :: Type -> TypeError
+ Agda.TypeChecking.Monad.Base: WrongIrrelevanceInLambda :: TypeError
- Agda.TypeChecking.Monad.Base: [conPars] :: Defn -> Nat
+ Agda.TypeChecking.Monad.Base: [conPars] :: Defn -> Int
- Agda.TypeChecking.Monad.Base: [constraintProblems] :: ProblemConstraint -> [ProblemId]
+ Agda.TypeChecking.Monad.Base: [constraintProblems] :: ProblemConstraint -> Set ProblemId
- Agda.TypeChecking.Monad.Base: [dataMutual] :: Defn -> [QName]
+ Agda.TypeChecking.Monad.Base: [dataMutual] :: Defn -> Maybe [QName]
- Agda.TypeChecking.Monad.Base: [envActiveProblems] :: TCEnv -> [ProblemId]
+ Agda.TypeChecking.Monad.Base: [envActiveProblems] :: TCEnv -> Set ProblemId
- Agda.TypeChecking.Monad.Base: [funMutual] :: Defn -> [QName]
+ Agda.TypeChecking.Monad.Base: [funMutual] :: Defn -> Maybe [QName]
- Agda.TypeChecking.Monad.Base: [projProper] :: Projection -> Bool
+ Agda.TypeChecking.Monad.Base: [projProper] :: Projection -> Maybe QName
- Agda.TypeChecking.Monad.Base: [recMutual] :: Defn -> [QName]
+ Agda.TypeChecking.Monad.Base: [recMutual] :: Defn -> Maybe [QName]
- Agda.TypeChecking.Monad.Base: class Enum i => HasFresh i where nextFresh' = succ
+ Agda.TypeChecking.Monad.Base: class Enum i => HasFresh i
- Agda.TypeChecking.Monad.Base: class (Applicative tcm, MonadIO tcm, MonadReader TCEnv tcm, MonadState TCState tcm) => MonadTCM tcm
+ Agda.TypeChecking.Monad.Base: class (Applicative tcm, MonadIO tcm, MonadReader TCEnv tcm, MonadState TCState tcm, HasOptions tcm) => MonadTCM tcm
- Agda.TypeChecking.Monad.Base: eActiveProblems :: Lens' [ProblemId] TCEnv
+ Agda.TypeChecking.Monad.Base: eActiveProblems :: Lens' (Set ProblemId) TCEnv
- Agda.TypeChecking.Monad.Base: freshName :: (MonadState TCState m, HasFresh NameId) => Range -> String -> m Name
+ Agda.TypeChecking.Monad.Base: freshName :: MonadState TCState m => Range -> String -> m Name
- Agda.TypeChecking.Monad.Base: freshName_ :: (FreshName a, MonadState TCState m, HasFresh NameId) => a -> m Name
+ Agda.TypeChecking.Monad.Base: freshName_ :: (FreshName a, MonadState TCState m) => a -> m Name
- Agda.TypeChecking.Monad.Base: freshNoName :: (MonadState TCState m, HasFresh NameId) => Range -> m Name
+ Agda.TypeChecking.Monad.Base: freshNoName :: MonadState TCState m => Range -> m Name
- Agda.TypeChecking.Monad.Base: freshNoName_ :: (MonadState TCState m, HasFresh NameId) => m Name
+ Agda.TypeChecking.Monad.Base: freshNoName_ :: MonadState TCState m => m Name
- Agda.TypeChecking.Monad.Benchmark: class (Ord a, Functor m, MonadIO m) => MonadBench a m | m -> a where getsBenchmark f = f <$> getBenchmark putBenchmark b = modifyBenchmark $ const b modifyBenchmark f = do { b <- getBenchmark; putBenchmark $! f b }
+ Agda.TypeChecking.Monad.Benchmark: class (Ord a, Functor m, MonadIO m) => MonadBench a m | m -> a
- Agda.TypeChecking.Monad.Constraints: buildProblemConstraint :: [ProblemId] -> Constraint -> TCM ProblemConstraint
+ Agda.TypeChecking.Monad.Constraints: buildProblemConstraint :: Set ProblemId -> Constraint -> TCM ProblemConstraint
- Agda.TypeChecking.Monad.Constraints: solvingProblems :: [ProblemId] -> TCM a -> TCM a
+ Agda.TypeChecking.Monad.Constraints: solvingProblems :: Set ProblemId -> TCM a -> TCM a
- Agda.TypeChecking.Monad.Context: addContext' :: (MonadTCM tcm, AddContext b) => b -> tcm a -> tcm a
+ Agda.TypeChecking.Monad.Context: addContext' :: (MonadTCM tcm, MonadDebug tcm, AddContext b) => b -> tcm a -> tcm a
- Agda.TypeChecking.Monad.Context: getModuleParameterSub :: MonadTCM tcm => ModuleName -> tcm Substitution
+ Agda.TypeChecking.Monad.Context: getModuleParameterSub :: (Functor m, ReadTCState m) => ModuleName -> m Substitution
- Agda.TypeChecking.Monad.Context: updateModuleParameters :: MonadTCM tcm => Substitution -> tcm a -> tcm a
+ Agda.TypeChecking.Monad.Context: updateModuleParameters :: (MonadTCM tcm, MonadDebug tcm) => Substitution -> tcm a -> tcm a
- Agda.TypeChecking.Monad.Context: weakenModuleParameters :: MonadTCM tcm => Nat -> tcm a -> tcm a
+ Agda.TypeChecking.Monad.Context: weakenModuleParameters :: (MonadTCM tcm, MonadDebug tcm) => Nat -> tcm a -> tcm a
- Agda.TypeChecking.Monad.Local: makeGlobal :: Free' a All => a -> TCM (Local a)
+ Agda.TypeChecking.Monad.Local: makeGlobal :: Free a => a -> TCM (Local a)
- Agda.TypeChecking.Monad.Local: makeLocal :: Free' a All => a -> TCM (Local a)
+ Agda.TypeChecking.Monad.Local: makeLocal :: Free a => a -> TCM (Local a)
- Agda.TypeChecking.Monad.Options: verboseS :: MonadTCM tcm => VerboseKey -> Int -> tcm () -> tcm ()
+ Agda.TypeChecking.Monad.Options: verboseS :: HasOptions m => VerboseKey -> Int -> m () -> m ()
- Agda.TypeChecking.Monad.Signature: addCoreCode :: QName -> CoreExpr -> TCM ()
+ Agda.TypeChecking.Monad.Signature: addCoreCode :: QName -> CoreCode -> TCM ()
- Agda.TypeChecking.Monad.Signature: addCoreType :: QName -> CoreType -> TCM ()
+ Agda.TypeChecking.Monad.Signature: addCoreType :: QName -> CoreCode -> [CoreCode] -> TCM ()
- Agda.TypeChecking.Monad.Signature: addHaskellCode :: QName -> HaskellType -> HaskellCode -> TCM ()
+ Agda.TypeChecking.Monad.Signature: addHaskellCode :: QName -> HaskellCode -> TCM ()
- Agda.TypeChecking.Monad.Signature: addHaskellExport :: QName -> HaskellType -> String -> TCM ()
+ Agda.TypeChecking.Monad.Signature: addHaskellExport :: QName -> String -> TCM ()
- Agda.TypeChecking.Monad.Signature: addJSCode :: QName -> String -> TCM ()
+ Agda.TypeChecking.Monad.Signature: addJSCode :: QName -> JSCode -> TCM ()
- Agda.TypeChecking.Monad.Signature: class (Functor m, Applicative m, Monad m) => HasConstInfo m
+ Agda.TypeChecking.Monad.Signature: class (Functor m, Applicative m, Monad m, HasOptions m, MonadDebug m) => HasConstInfo m
- Agda.TypeChecking.Monad.Signature: freeVarsToApply :: QName -> TCM Args
+ Agda.TypeChecking.Monad.Signature: freeVarsToApply :: (Functor m, HasConstInfo m, HasOptions m, ReadTCState m, MonadReader TCEnv m, MonadDebug m) => QName -> m Args
- Agda.TypeChecking.Monad.Signature: getModuleFreeVars :: (Functor m, Applicative m, ReadTCState m, MonadReader TCEnv m) => ModuleName -> m Nat
+ Agda.TypeChecking.Monad.Signature: getModuleFreeVars :: (Functor m, Applicative m, MonadReader TCEnv m, ReadTCState m) => ModuleName -> m Nat
- Agda.TypeChecking.Monad.Signature: getMutual :: QName -> TCM [QName]
+ Agda.TypeChecking.Monad.Signature: getMutual :: QName -> TCM (Maybe [QName])
- Agda.TypeChecking.Monad.Signature: moduleParamsToApply :: ModuleName -> TCM Args
+ Agda.TypeChecking.Monad.Signature: moduleParamsToApply :: (Functor m, Applicative m, HasOptions m, MonadReader TCEnv m, ReadTCState m, MonadDebug m) => ModuleName -> m Args
- Agda.TypeChecking.Monad.Signature: whatInduction :: QName -> TCM Induction
+ Agda.TypeChecking.Monad.Signature: whatInduction :: MonadTCM tcm => QName -> tcm Induction
- Agda.TypeChecking.Monad.Trace: traceCall :: MonadTCM tcm => Call -> tcm a -> tcm a
+ Agda.TypeChecking.Monad.Trace: traceCall :: (MonadTCM tcm, MonadDebug tcm) => Call -> tcm a -> tcm a
- Agda.TypeChecking.Monad.Trace: traceCallCPS :: MonadTCM tcm => Call -> (r -> tcm a) -> ((r -> tcm a) -> tcm b) -> tcm b
+ Agda.TypeChecking.Monad.Trace: traceCallCPS :: (MonadTCM tcm, MonadDebug tcm) => Call -> (r -> tcm a) -> ((r -> tcm a) -> tcm b) -> tcm b
- Agda.TypeChecking.Monad.Trace: traceCallCPS_ :: MonadTCM tcm => Call -> tcm a -> (tcm a -> tcm b) -> tcm b
+ Agda.TypeChecking.Monad.Trace: traceCallCPS_ :: (MonadTCM tcm, MonadDebug tcm) => Call -> tcm a -> (tcm a -> tcm b) -> tcm b
- Agda.TypeChecking.Monad.Trace: traceCallM :: MonadTCM tcm => tcm Call -> tcm a -> tcm a
+ Agda.TypeChecking.Monad.Trace: traceCallM :: (MonadTCM tcm, MonadDebug tcm) => tcm Call -> tcm a -> tcm a
- Agda.TypeChecking.Patterns.Abstract: expandPatternSynonyms :: ExpandPatternSynonyms a => a -> TCM a
+ Agda.TypeChecking.Patterns.Abstract: expandPatternSynonyms :: (ExpandPatternSynonyms a, Traversable f, ExpandPatternSynonyms b, f b ~ a) => a -> TCM a
- Agda.TypeChecking.Polarity: computePolarity :: QName -> TCM ()
+ Agda.TypeChecking.Polarity: computePolarity :: [QName] -> TCM ()
- Agda.TypeChecking.Primitive: class ToTerm a where toTermR = (pure .) <$> toTerm
+ Agda.TypeChecking.Primitive: class ToTerm a
- Agda.TypeChecking.Reduce: class Reduce t where reduce' t = ignoreBlocking <$> reduceB' t reduceB' t = notBlocked <$> reduce' t
+ Agda.TypeChecking.Reduce: class Reduce t
- Agda.TypeChecking.Rewriting.NonLinMatch: reallyFree :: (Reduce a, Normalise a, Free' a FreeVars) => (Int -> Bool) -> a -> ReduceM (Either Blocked_ (Maybe a))
+ Agda.TypeChecking.Rewriting.NonLinMatch: reallyFree :: (Reduce a, Normalise a, Free a) => (Int -> Bool) -> a -> ReduceM (Either Blocked_ (Maybe a))
- Agda.TypeChecking.Rules.Data: fitsIn :: Type -> Sort -> TCM ()
+ Agda.TypeChecking.Rules.Data: fitsIn :: Type -> Sort -> TCM Int
- Agda.TypeChecking.Rules.Def: WithFunction :: QName -> QName -> Type -> Telescope -> Telescope -> [Term] -> [EqualityView] -> Type -> [NamedArg DeBruijnPattern] -> Nat -> Permutation -> Permutation -> Permutation -> [Clause] -> WithFunctionProblem
+ Agda.TypeChecking.Rules.Def: WithFunction :: QName -> QName -> Type -> Telescope -> Telescope -> Telescope -> [Term] -> [EqualityView] -> Type -> [NamedArg DeBruijnPattern] -> Nat -> Permutation -> Permutation -> Permutation -> [Clause] -> WithFunctionProblem
- Agda.TypeChecking.Rules.LHS: checkLeftHandSide :: Call -> Maybe QName -> [NamedArg Pattern] -> Type -> Maybe Substitution -> (LHSResult -> TCM a) -> TCM a
+ Agda.TypeChecking.Rules.LHS: checkLeftHandSide :: Call -> Maybe QName -> [NamedArg Pattern] -> Type -> Maybe Substitution -> [StrippedDotPattern] -> (LHSResult -> TCM a) -> TCM a
- Agda.TypeChecking.Rules.LHS: class IsFlexiblePattern a where isFlexiblePattern p = isJust <$> runMaybeT (maybeFlexiblePattern p)
+ Agda.TypeChecking.Rules.LHS: class IsFlexiblePattern a
- Agda.TypeChecking.Rules.LHS.Problem: FlexibleVar :: Hiding -> FlexibleVarKind -> Maybe Int -> a -> FlexibleVar a
+ Agda.TypeChecking.Rules.LHS.Problem: FlexibleVar :: Hiding -> Origin -> FlexibleVarKind -> Maybe Int -> a -> FlexibleVar a
- Agda.TypeChecking.Rules.LHS.Problem: LHSState :: Problem -> [DotPatternInst] -> LHSState
+ Agda.TypeChecking.Rules.LHS.Problem: LHSState :: Problem -> [DotPatternInst] -> [(Range, Type)] -> LHSState
- Agda.TypeChecking.Rules.LHS.Unify: DontKnow :: TCErr -> UnificationResult' a
+ Agda.TypeChecking.Rules.LHS.Unify: DontKnow :: [UnificationFailure] -> UnificationResult' a
- Agda.TypeChecking.Rules.LHS.Unify: NoUnify :: TCErr -> UnificationResult' a
+ Agda.TypeChecking.Rules.LHS.Unify: NoUnify :: NegativeUnification -> UnificationResult' a
- Agda.TypeChecking.Rules.Term: checkAbsurdLambda :: ExprInfo -> Hiding -> Expr -> Type -> TCM Term
+ Agda.TypeChecking.Rules.Term: checkAbsurdLambda :: LamInfo -> Hiding -> Expr -> Type -> TCM Term
- Agda.TypeChecking.Rules.Term: checkExtendedLambda :: ExprInfo -> DefInfo -> QName -> [Clause] -> Expr -> Type -> TCM Term
+ Agda.TypeChecking.Rules.Term: checkExtendedLambda :: LamInfo -> DefInfo -> QName -> [Clause] -> Expr -> Type -> TCM Term
- Agda.TypeChecking.Serialise: class Typeable a => EmbPrj a where icode a = do { tickICode a; icod_ a }
+ Agda.TypeChecking.Serialise: class Typeable a => EmbPrj a
- Agda.TypeChecking.Serialise.Base: class Typeable a => EmbPrj a where icode a = do { tickICode a; icod_ a }
+ Agda.TypeChecking.Serialise.Base: class Typeable a => EmbPrj a
- Agda.TypeChecking.Serialise.Base: icodeN :: Node -> S Int32
+ Agda.TypeChecking.Serialise.Base: icodeN :: forall t. ICODE t (IsBase t) => Currying (Domains t) (S Int32) => All EmbPrj (Domains t) => Int32 -> t -> Arrows (Domains t) (S Int32)
- Agda.TypeChecking.SizedTypes.Syntax: simplify1 :: (Show f, Show r, Eq r) => CTrans r f -> CTrans r f
+ Agda.TypeChecking.SizedTypes.Syntax: simplify1 :: (Pretty f, Pretty r, Eq r) => CTrans r f -> CTrans r f
- Agda.TypeChecking.SizedTypes.Utils: class Eq a => Top a where isTop = (== top)
+ Agda.TypeChecking.SizedTypes.Utils: class Eq a => Top a
- Agda.TypeChecking.SizedTypes.Utils: debug :: Bool
+ Agda.TypeChecking.SizedTypes.Utils: debug :: IORef Bool
- Agda.TypeChecking.SizedTypes.WarshallSolver: constraintGraph :: (Ord r, Ord f, Show r, Show f) => [Constraint' r f] -> HypGraph r f -> Either String (ConGraph r f)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: constraintGraph :: (Ord r, Ord f, Pretty r, Pretty f) => [Constraint' r f] -> HypGraph r f -> Either String (ConGraph r f)
- Agda.TypeChecking.SizedTypes.WarshallSolver: constraintGraphs :: (Ord r, Ord f, Show r, Show f) => [Constraint' r f] -> HypGraph r f -> Either String ([f], ConGraphs r f)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: constraintGraphs :: (Ord r, Ord f, Pretty r, Pretty f) => [Constraint' r f] -> HypGraph r f -> Either String ([f], ConGraphs r f)
- Agda.TypeChecking.SizedTypes.WarshallSolver: glb :: (Ord r, Ord f, Show r, Show f) => HypGraph r f -> (SizeExpr' r f) -> (SizeExpr' r f) -> Maybe (SizeExpr' r f)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: glb :: (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f) => HypGraph r f -> SizeExpr' r f -> SizeExpr' r f -> Maybe (SizeExpr' r f)
- Agda.TypeChecking.SizedTypes.WarshallSolver: glb' :: forall r f. (Ord r, Ord f, Show r, Show f) => HypGraph r f -> (Node r f, Offset) -> (Node r f, Offset) -> Maybe (SizeExpr' r f)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: glb' :: forall r f. (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f) => HypGraph r f -> (Node r f, Offset) -> (Node r f, Offset) -> Maybe (SizeExpr' r f)
- Agda.TypeChecking.SizedTypes.WarshallSolver: hypGraph :: (Ord rigid, Ord flex, Show rigid, Show flex) => Set rigid -> [Hyp' rigid flex] -> Either String (HypGraph rigid flex)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: hypGraph :: (Ord rigid, Ord flex, Pretty rigid, Pretty flex) => Set rigid -> [Hyp' rigid flex] -> Either String (HypGraph rigid flex)
- Agda.TypeChecking.SizedTypes.WarshallSolver: implies :: (Ord r, Ord f, Show r, Show f, Show a, Top a, Ord a, Negative a) => Graph r f a -> Graph r f a -> Bool
+ Agda.TypeChecking.SizedTypes.WarshallSolver: implies :: (Ord r, Ord f, Pretty r, Pretty f, Pretty a, Top a, Ord a, Negative a) => Graph r f a -> Graph r f a -> Bool
- Agda.TypeChecking.SizedTypes.WarshallSolver: iterateSolver :: (Ord r, Ord f, Show r, Show f) => Polarities f -> HypGraph r f -> [Constraint' r f] -> Solution r f -> Either String (Solution r f)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: iterateSolver :: (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f) => Polarities f -> HypGraph r f -> [Constraint' r f] -> Solution r f -> Either String (Solution r f)
- Agda.TypeChecking.SizedTypes.WarshallSolver: lub :: (Ord r, Ord f, Show r, Show f) => HypGraph r f -> (SizeExpr' r f) -> (SizeExpr' r f) -> Maybe (SizeExpr' r f)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: lub :: (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f) => HypGraph r f -> SizeExpr' r f -> SizeExpr' r f -> Maybe (SizeExpr' r f)
- Agda.TypeChecking.SizedTypes.WarshallSolver: lub' :: forall r f. (Ord r, Ord f, Show r, Show f) => HypGraph r f -> (Node r f, Offset) -> (Node r f, Offset) -> Maybe (SizeExpr' r f)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: lub' :: forall r f. (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f) => HypGraph r f -> (Node r f, Offset) -> (Node r f, Offset) -> Maybe (SizeExpr' r f)
- Agda.TypeChecking.SizedTypes.WarshallSolver: simplifyWithHypotheses :: (Ord rigid, Ord flex, Show rigid, Show flex) => HypGraph rigid flex -> [Constraint' rigid flex] -> Either String [Constraint' rigid flex]
+ Agda.TypeChecking.SizedTypes.WarshallSolver: simplifyWithHypotheses :: (Ord rigid, Ord flex, Pretty rigid, Pretty flex) => HypGraph rigid flex -> [Constraint' rigid flex] -> Either String [Constraint' rigid flex]
- Agda.TypeChecking.SizedTypes.WarshallSolver: solveGraph :: (Ord r, Ord f, Show r, Show f) => Polarities f -> HypGraph r f -> ConGraph r f -> Either String (Solution r f)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: solveGraph :: (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f) => Polarities f -> HypGraph r f -> ConGraph r f -> Either String (Solution r f)
- Agda.TypeChecking.SizedTypes.WarshallSolver: solveGraphs :: (Ord r, Ord f, Show r, Show f) => Polarities f -> HypGraph r f -> ConGraphs r f -> Either String (Solution r f)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: solveGraphs :: (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f) => Polarities f -> HypGraph r f -> ConGraphs r f -> Either String (Solution r f)
- Agda.TypeChecking.SizedTypes.WarshallSolver: testLub :: (Show f, Ord f) => Maybe (SizeExpr' [Char] f)
+ Agda.TypeChecking.SizedTypes.WarshallSolver: testLub :: (Pretty f, Ord f, Show f) => Maybe (SizeExpr' [Char] f)
- Agda.TypeChecking.SizedTypes.WarshallSolver: verifySolution :: (Ord r, Ord f, Show r, Show f) => HypGraph r f -> [Constraint' r f] -> Solution r f -> Either String ()
+ Agda.TypeChecking.SizedTypes.WarshallSolver: verifySolution :: (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f) => HypGraph r f -> [Constraint' r f] -> Solution r f -> Either String ()
- Agda.TypeChecking.Substitute: EmptyS :: Substitution' a
+ Agda.TypeChecking.Substitute: EmptyS :: Empty -> Substitution' a
- Agda.TypeChecking.Substitute.Class: class Apply t where apply t args = applyE t $ map Apply args applyE t es = apply t $ map argFromElim es
+ Agda.TypeChecking.Substitute.Class: class Apply t
- Agda.TypeChecking.Substitute.DeBruijn: class DeBruijn a where deBruijnVar = debruijnNamedVar underscore debruijnNamedVar _ = deBruijnVar
+ Agda.TypeChecking.Substitute.DeBruijn: class DeBruijn a
- Agda.TypeChecking.SyntacticEquality: class SynEq a where synEq' a a' = ifEqual (uncurry synEq) (a, a')
+ Agda.TypeChecking.SyntacticEquality: class SynEq a
- Agda.TypeChecking.Unquote: type UnquoteM = ReaderT Context (StateT UnquoteState (WriterT [QName] (ExceptionT UnquoteError TCM)))
+ Agda.TypeChecking.Unquote: type UnquoteM = ReaderT Context (StateT UnquoteState (WriterT [QName] (ExceptT UnquoteError TCM)))
- Agda.TypeChecking.With: buildWithFunction :: [Name] -> QName -> QName -> Type -> [NamedArg DeBruijnPattern] -> Nat -> Substitution -> Permutation -> Nat -> Nat -> [SpineClause] -> TCM [SpineClause]
+ Agda.TypeChecking.With: buildWithFunction :: [Name] -> QName -> QName -> Type -> Telescope -> [NamedArg DeBruijnPattern] -> Nat -> Substitution -> Permutation -> Nat -> Nat -> [SpineClause] -> TCM [SpineClause]
- Agda.TypeChecking.With: stripWithClausePatterns :: [Name] -> QName -> QName -> Type -> [NamedArg DeBruijnPattern] -> Nat -> Permutation -> [NamedArg Pattern] -> TCM ([NamedDotPattern], [NamedArg Pattern])
+ Agda.TypeChecking.With: stripWithClausePatterns :: [Name] -> QName -> QName -> Type -> Telescope -> [NamedArg DeBruijnPattern] -> Nat -> Permutation -> [NamedArg Pattern] -> TCM ([NamedDotPattern], [StrippedDotPattern], [NamedArg Pattern])
- Agda.Utils.Benchmark: Benchmark :: !Bool -> !(CurrentAccount a) -> !(Timings a) -> Benchmark a
+ Agda.Utils.Benchmark: Benchmark :: !(BenchmarkOn a) -> !(CurrentAccount a) -> !(Timings a) -> Benchmark a
- Agda.Utils.Benchmark: [benchmarkOn] :: Benchmark a -> !Bool
+ Agda.Utils.Benchmark: [benchmarkOn] :: Benchmark a -> !(BenchmarkOn a)
- Agda.Utils.Benchmark: class (Ord a, Functor m, MonadIO m) => MonadBench a m | m -> a where getsBenchmark f = f <$> getBenchmark putBenchmark b = modifyBenchmark $ const b modifyBenchmark f = do { b <- getBenchmark; putBenchmark $! f b }
+ Agda.Utils.Benchmark: class (Ord a, Functor m, MonadIO m) => MonadBench a m | m -> a
- Agda.Utils.Benchmark: mapBenchmarkOn :: (Bool -> Bool) -> Benchmark a -> Benchmark a
+ Agda.Utils.Benchmark: mapBenchmarkOn :: (BenchmarkOn a -> BenchmarkOn a) -> Benchmark a -> Benchmark a
- Agda.Utils.Benchmark: setBenchmarking :: MonadBench a m => Bool -> m ()
+ Agda.Utils.Benchmark: setBenchmarking :: MonadBench a m => BenchmarkOn a -> m ()
- Agda.Utils.Except: class Error a where noMsg = strMsg "" strMsg _ = noMsg
+ Agda.Utils.Except: class Error a
- Agda.Utils.Except: mapExceptT :: (m (Either e a) -> n (Either e' b)) -> ExceptT e m a -> ExceptT e' n b
+ Agda.Utils.Except: mapExceptT :: () => (m Either e a -> n Either e' b) -> ExceptT e m a -> ExceptT e' n b
- Agda.Utils.Except: runExceptT :: ExceptT e m a -> m (Either e a)
+ Agda.Utils.Except: runExceptT :: () => ExceptT e m a -> m Either e a
- Agda.Utils.Functor: class Functor t => Decoration t where traverseF f = distributeF . fmap f distributeF = traverseF id
+ Agda.Utils.Functor: class Functor t => Decoration t
- Agda.Utils.Functor: distributeF :: (Decoration t, Functor m) => t (m a) -> m (t a)
+ Agda.Utils.Functor: distributeF :: (Decoration t, (Functor m)) => t (m a) -> m (t a)
- Agda.Utils.List: zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c]
+ Agda.Utils.List: zipWith' :: (a -> b -> c) -> [a] -> [b] -> Maybe [c]
- Agda.Utils.Monad: (<$) :: Functor f => forall a b. a -> f b -> f a
+ Agda.Utils.Monad: (<$) :: Functor f => forall a b. () => a -> f b -> f a
- Agda.Utils.Monad: (<*>) :: Applicative f => forall a b. f (a -> b) -> f a -> f b
+ Agda.Utils.Monad: (<*>) :: Applicative f => forall a b. () => f (a -> b) -> f a -> f b
- Agda.Utils.Monad: bracket_ :: Monad m => m a -> (a -> m c) -> m b -> m b
+ Agda.Utils.Monad: bracket_ :: Monad m => m a -> (a -> m ()) -> m b -> m b
- Agda.Utils.Monad: finally :: MonadError e m => m a -> m b -> m a
+ Agda.Utils.Monad: finally :: MonadError e m => m a -> m () -> m a
- Agda.Utils.Monad: infixl 4 <$>
+ Agda.Utils.Monad: infixl 4 <$
- Agda.Utils.Monad: unlessM :: Monad m => m Bool -> m a -> m ()
+ Agda.Utils.Monad: unlessM :: Monad m => m Bool -> m () -> m ()
- Agda.Utils.Monad: whenM :: Monad m => m Bool -> m a -> m ()
+ Agda.Utils.Monad: whenM :: Monad m => m Bool -> m () -> m ()
- Agda.Utils.Null: class Null a where null = (== empty)
+ Agda.Utils.Null: class Null a
- Agda.Utils.Parser.MemoisedCPS: annotate :: ParserClass p k r tok => (Doc -> Doc) -> p a -> p a
+ Agda.Utils.Parser.MemoisedCPS: annotate :: ParserClass p k r tok => (DocP -> DocP) -> p a -> p a
- Agda.Utils.Parser.MemoisedCPS: grammar :: ParserClass p k r tok => p a -> Doc
+ Agda.Utils.Parser.MemoisedCPS: grammar :: (ParserClass p k r tok, Show k) => p a -> Doc
- Agda.Utils.Permutation: class DoDrop a where dropMore n (Drop m xs) = Drop (m + n) xs unDrop n (Drop m xs) | n <= m = Drop (m - n) xs | otherwise = (throwImpossible (Impossible "src/full/Agda/Utils/Permutation.hs" 241))
+ Agda.Utils.Permutation: class DoDrop a
- Agda.Utils.Pretty: class Pretty a where pretty = prettyPrec 0 prettyPrec = const pretty
+ Agda.Utils.Pretty: class Pretty a
- Agda.Utils.Size: size :: (Sized a, Integral n) => a -> n
+ Agda.Utils.Size: size :: Sized a => a -> Int
- Agda.Utils.Update: class Traversable f => Updater1 f where updater1 = traverse updates1 f = sharing $ updater1 f update1 f = evalUpdater $ updater1 f
+ Agda.Utils.Update: class Traversable f => Updater1 f
- Agda.Utils.Update: class Updater2 f where updates2 f1 f2 = sharing $ updater2 f1 f2 update2 f1 f2 = evalUpdater $ updater2 f1 f2
+ Agda.Utils.Update: class Updater2 f
Files
- Agda.cabal +97/−103
- CHANGELOG.md +840/−10
- LICENSE +19/−8
- README.md +14/−4
- dist/build/Agda/Syntax/Parser/Lexer.hs +0/−1079
- dist/build/Agda/Syntax/Parser/Parser.hs +0/−7338
- src/data/JS/agda-rts.js +19/−0
- src/data/agda.sty +127/−56
- src/data/emacs-mode/agda-input.el +14/−1
- src/data/emacs-mode/agda2-highlight.el +23/−12
- src/data/emacs-mode/agda2-mode-pkg.el +1/−1
- src/data/emacs-mode/agda2-mode.el +140/−92
- src/data/emacs-mode/annotation.el +12/−1
- src/data/lib/prim/Agda/Builtin/Bool.agda +4/−4
- src/data/lib/prim/Agda/Builtin/Equality.agda +0/−1
- src/data/lib/prim/Agda/Builtin/IO.agda +2/−2
- src/data/lib/prim/Agda/Builtin/List.agda +6/−6
- src/data/lib/prim/Agda/Builtin/Reflection.agda +23/−4
- src/data/lib/prim/Agda/Builtin/String.agda +6/−6
- src/data/lib/prim/Agda/Builtin/Unit.agda +1/−1
- src/data/lib/prim/Agda/Primitive.agda +2/−2
- src/data/uhc-agda-base/LICENSE +0/−0
- src/data/uhc-agda-base/src/UHC/Agda/Builtins.hs +0/−478
- src/data/uhc-agda-base/src/UHC/Agda/double.c +0/−12
- src/data/uhc-agda-base/src/UHC/Agda/double.h +0/−2
- src/data/uhc-agda-base/uhc-agda-base.cabal +0/−25
- src/full/Agda/Auto/Auto.hs +109/−117
- src/full/Agda/Auto/CaseSplit.hs +288/−281
- src/full/Agda/Auto/Convert.hs +224/−255
- src/full/Agda/Auto/NarrowingSearch.hs +50/−23
- src/full/Agda/Auto/Options.hs +106/−0
- src/full/Agda/Auto/SearchControl.hs +270/−201
- src/full/Agda/Auto/Syntax.hs +195/−125
- src/full/Agda/Auto/Typecheck.hs +79/−69
- src/full/Agda/Benchmarking.hs +27/−3
- src/full/Agda/Compiler/Backend.hs +195/−0
- src/full/Agda/Compiler/Backend.hs-boot +4/−0
- src/full/Agda/Compiler/CallCompiler.hs +3/−1
- src/full/Agda/Compiler/Common.hs +39/−13
- src/full/Agda/Compiler/Epic/AuxAST.hs +0/−168
- src/full/Agda/Compiler/Epic/CaseOpts.hs +0/−40
- src/full/Agda/Compiler/Epic/CompileState.hs +0/−215
- src/full/Agda/Compiler/Epic/Compiler.hs +0/−278
- src/full/Agda/Compiler/Epic/Epic.hs +0/−102
- src/full/Agda/Compiler/Epic/Erasure.hs +0/−227
- src/full/Agda/Compiler/Epic/ForceConstrs.hs +0/−75
- src/full/Agda/Compiler/Epic/Forcing.hs +0/−313
- src/full/Agda/Compiler/Epic/FromAgda.hs +0/−265
- src/full/Agda/Compiler/Epic/Injection.hs +0/−383
- src/full/Agda/Compiler/Epic/Interface.hs +0/−89
- src/full/Agda/Compiler/Epic/NatDetection.hs +0/−80
- src/full/Agda/Compiler/Epic/Primitive.hs +0/−213
- src/full/Agda/Compiler/Epic/Smashing.hs +0/−137
- src/full/Agda/Compiler/Epic/Static.hs +0/−119
- src/full/Agda/Compiler/HaskellTypes.hs +0/−115
- src/full/Agda/Compiler/JS/Compiler.hs +190/−84
- src/full/Agda/Compiler/JS/Pretty.hs +19/−4
- src/full/Agda/Compiler/JS/Substitution.hs +8/−8
- src/full/Agda/Compiler/JS/Syntax.hs +9/−7
- src/full/Agda/Compiler/MAlonzo/Compiler.hs +193/−76
- src/full/Agda/Compiler/MAlonzo/Encode.hs +2/−3
- src/full/Agda/Compiler/MAlonzo/HaskellTypes.hs +167/−0
- src/full/Agda/Compiler/MAlonzo/Misc.hs +4/−6
- src/full/Agda/Compiler/MAlonzo/Pragmas.hs +200/−0
- src/full/Agda/Compiler/MAlonzo/Pretty.hs +3/−1
- src/full/Agda/Compiler/MAlonzo/Primitives.hs +24/−27
- src/full/Agda/Compiler/ToTreeless.hs +42/−24
- src/full/Agda/Compiler/Treeless/DelayCoinduction.hs +0/−69
- src/full/Agda/Compiler/Treeless/EliminateDefaults.hs +65/−0
- src/full/Agda/Compiler/Treeless/EliminateLiteralPatterns.hs +4/−2
- src/full/Agda/Compiler/Treeless/Erase.hs +5/−6
- src/full/Agda/Compiler/Treeless/GuardsToPrims.hs +2/−2
- src/full/Agda/Compiler/Treeless/Identity.hs +2/−3
- src/full/Agda/Compiler/Treeless/Pretty.hs +2/−3
- src/full/Agda/Compiler/Treeless/Simplify.hs +10/−7
- src/full/Agda/Compiler/Treeless/Subst.hs +1/−1
- src/full/Agda/Compiler/Treeless/Unused.hs +3/−2
- src/full/Agda/Compiler/UHC/Bridge.hs +0/−292
- src/full/Agda/Compiler/UHC/CompileState.hs +0/−248
- src/full/Agda/Compiler/UHC/Compiler.hs +0/−216
- src/full/Agda/Compiler/UHC/FromAgda.hs +0/−376
- src/full/Agda/Compiler/UHC/MagicTypes.hs +0/−59
- src/full/Agda/Compiler/UHC/Pragmas/Base.hs +0/−58
- src/full/Agda/Compiler/UHC/Pragmas/Parse.hs +0/−103
- src/full/Agda/Compiler/UHC/Primitives.hs +0/−118
- src/full/Agda/Interaction/BasicOps.hs +82/−35
- src/full/Agda/Interaction/CommandLine.hs +9/−6
- src/full/Agda/Interaction/EmacsTop.hs +75/−56
- src/full/Agda/Interaction/FindFile.hs +10/−9
- src/full/Agda/Interaction/FindFile.hs-boot +1/−2
- src/full/Agda/Interaction/Highlighting/Emacs.hs +17/−18
- src/full/Agda/Interaction/Highlighting/Generate.hs +133/−35
- src/full/Agda/Interaction/Highlighting/HTML.hs +80/−50
- src/full/Agda/Interaction/Highlighting/LaTeX.hs +490/−349
- src/full/Agda/Interaction/Highlighting/Precise.hs +26/−6
- src/full/Agda/Interaction/Highlighting/Range.hs +0/−1
- src/full/Agda/Interaction/Imports.hs +217/−186
- src/full/Agda/Interaction/InteractionTop.hs +260/−88
- src/full/Agda/Interaction/Library.hs +259/−82
- src/full/Agda/Interaction/Library/Base.hs +17/−4
- src/full/Agda/Interaction/Library/Parse.hs +133/−38
- src/full/Agda/Interaction/MakeCase.hs +32/−16
- src/full/Agda/Interaction/Options.hs +136/−138
- src/full/Agda/Interaction/Options/Lenses.hs +5/−1
- src/full/Agda/Interaction/Response.hs +8/−3
- src/full/Agda/Interaction/SearchAbout.hs +44/−44
- src/full/Agda/Main.hs +89/−59
- src/full/Agda/Syntax/Abstract.hs +56/−37
- src/full/Agda/Syntax/Abstract/Copatterns.hs +10/−8
- src/full/Agda/Syntax/Abstract/Name.hs +32/−20
- src/full/Agda/Syntax/Abstract/Pattern.hs +209/−0
- src/full/Agda/Syntax/Abstract/Views.hs +13/−3
- src/full/Agda/Syntax/Common.hs +188/−92
- src/full/Agda/Syntax/Concrete.hs +44/−29
- src/full/Agda/Syntax/Concrete/Definitions.hs +263/−136
- src/full/Agda/Syntax/Concrete/Name.hs +46/−21
- src/full/Agda/Syntax/Concrete/Operators.hs +38/−43
- src/full/Agda/Syntax/Concrete/Operators/Parser.hs +54/−81
- src/full/Agda/Syntax/Concrete/Operators/Parser/Monad.hs +13/−20
- src/full/Agda/Syntax/Concrete/Pretty.hs +29/−37
- src/full/Agda/Syntax/Fixity.hs +100/−53
- src/full/Agda/Syntax/Fixity.hs-boot +2/−0
- src/full/Agda/Syntax/IdiomBrackets.hs +4/−1
- src/full/Agda/Syntax/Info.hs +42/−13
- src/full/Agda/Syntax/Internal.hs +160/−101
- src/full/Agda/Syntax/Internal/Defs.hs +15/−15
- src/full/Agda/Syntax/Internal/Generic.hs +45/−94
- src/full/Agda/Syntax/Internal/Names.hs +30/−18
- src/full/Agda/Syntax/Internal/Pattern.hs +120/−17
- src/full/Agda/Syntax/Internal/SanityCheck.hs +3/−3
- src/full/Agda/Syntax/Literal.hs +11/−9
- src/full/Agda/Syntax/Notation.hs +6/−5
- src/full/Agda/Syntax/Parser.hs +8/−7
- src/full/Agda/Syntax/Parser/Comments.hs +2/−2
- src/full/Agda/Syntax/Parser/LexActions.hs +7/−2
- src/full/Agda/Syntax/Parser/LexActions.hs-boot +5/−4
- src/full/Agda/Syntax/Parser/Lexer.x +6/−7
- src/full/Agda/Syntax/Parser/Literate.hs +92/−32
- src/full/Agda/Syntax/Parser/Monad.hs +4/−12
- src/full/Agda/Syntax/Parser/Parser.y +112/−53
- src/full/Agda/Syntax/Parser/Tokens.hs +5/−4
- src/full/Agda/Syntax/Position.hs +4/−4
- src/full/Agda/Syntax/Scope/Base.hs +86/−79
- src/full/Agda/Syntax/Scope/Monad.hs +67/−41
- src/full/Agda/Syntax/Translation/AbstractToConcrete.hs +282/−95
- src/full/Agda/Syntax/Translation/ConcreteToAbstract.hs +218/−190
- src/full/Agda/Syntax/Translation/InternalToAbstract.hs +139/−104
- src/full/Agda/Syntax/Translation/ReflectedToAbstract.hs +6/−7
- src/full/Agda/Syntax/Treeless.hs +7/−6
- src/full/Agda/Termination/CutOff.hs +16/−1
- src/full/Agda/Termination/Inlining.hs +14/−5
- src/full/Agda/Termination/Monad.hs +87/−98
- src/full/Agda/Termination/Order.hs +81/−49
- src/full/Agda/Termination/SparseMatrix.hs +3/−13
- src/full/Agda/Termination/TermCheck.hs +239/−258
- src/full/Agda/TypeChecking/Abstract.hs +9/−3
- src/full/Agda/TypeChecking/CheckInternal.hs +151/−26
- src/full/Agda/TypeChecking/CheckInternal.hs-boot +6/−0
- src/full/Agda/TypeChecking/CompiledClause.hs +41/−28
- src/full/Agda/TypeChecking/CompiledClause/Compile.hs +21/−7
- src/full/Agda/TypeChecking/CompiledClause/Match.hs +11/−8
- src/full/Agda/TypeChecking/Constraints.hs +20/−9
- src/full/Agda/TypeChecking/Conversion.hs +165/−60
- src/full/Agda/TypeChecking/Coverage.hs +165/−101
- src/full/Agda/TypeChecking/Coverage/Match.hs +26/−10
- src/full/Agda/TypeChecking/Coverage/SplitTree.hs +10/−8
- src/full/Agda/TypeChecking/Datatypes.hs +94/−41
- src/full/Agda/TypeChecking/Datatypes.hs-boot +1/−1
- src/full/Agda/TypeChecking/DisplayForm.hs +82/−9
- src/full/Agda/TypeChecking/Empty.hs +69/−21
- src/full/Agda/TypeChecking/Errors.hs +261/−236
- src/full/Agda/TypeChecking/Errors.hs-boot +7/−0
- src/full/Agda/TypeChecking/EtaContract.hs +6/−2
- src/full/Agda/TypeChecking/Forcing.hs +4/−4
- src/full/Agda/TypeChecking/Free.hs +61/−56
- src/full/Agda/TypeChecking/Free/Lazy.hs +66/−108
- src/full/Agda/TypeChecking/Free/Old.hs +0/−1
- src/full/Agda/TypeChecking/Functions.hs +101/−0
- src/full/Agda/TypeChecking/Implicit.hs +19/−18
- src/full/Agda/TypeChecking/Injectivity.hs +9/−7
- src/full/Agda/TypeChecking/InstanceArguments.hs +87/−62
- src/full/Agda/TypeChecking/Irrelevance.hs +18/−10
- src/full/Agda/TypeChecking/Level.hs +3/−3
- src/full/Agda/TypeChecking/LevelConstraints.hs +3/−3
- src/full/Agda/TypeChecking/MetaVars.hs +54/−54
- src/full/Agda/TypeChecking/MetaVars/Mention.hs +1/−1
- src/full/Agda/TypeChecking/MetaVars/Occurs.hs +6/−4
- src/full/Agda/TypeChecking/Monad.hs +2/−0
- src/full/Agda/TypeChecking/Monad/Base.hs +497/−315
- src/full/Agda/TypeChecking/Monad/Base.hs-boot +1/−0
- src/full/Agda/TypeChecking/Monad/Benchmark.hs +33/−5
- src/full/Agda/TypeChecking/Monad/Builtin.hs +19/−9
- src/full/Agda/TypeChecking/Monad/Caching.hs +14/−1
- src/full/Agda/TypeChecking/Monad/Constraints.hs +35/−30
- src/full/Agda/TypeChecking/Monad/Context.hs +51/−29
- src/full/Agda/TypeChecking/Monad/Debug.hs +118/−0
- src/full/Agda/TypeChecking/Monad/Debug.hs-boot +28/−0
- src/full/Agda/TypeChecking/Monad/Env.hs +4/−2
- src/full/Agda/TypeChecking/Monad/Exception.hs +0/−115
- src/full/Agda/TypeChecking/Monad/Local.hs +3/−2
- src/full/Agda/TypeChecking/Monad/MetaVars.hs +19/−15
- src/full/Agda/TypeChecking/Monad/Mutual.hs +2/−1
- src/full/Agda/TypeChecking/Monad/Open.hs +5/−5
- src/full/Agda/TypeChecking/Monad/Options.hs +52/−76
- src/full/Agda/TypeChecking/Monad/Options.hs-boot +1/−11
- src/full/Agda/TypeChecking/Monad/Sharing.hs +4/−4
- src/full/Agda/TypeChecking/Monad/Signature.hs +245/−174
- src/full/Agda/TypeChecking/Monad/SizedTypes.hs +8/−0
- src/full/Agda/TypeChecking/Monad/State.hs +78/−46
- src/full/Agda/TypeChecking/Monad/Statistics.hs +1/−0
- src/full/Agda/TypeChecking/Monad/Trace.hs +14/−7
- src/full/Agda/TypeChecking/Patterns/Abstract.hs +48/−41
- src/full/Agda/TypeChecking/Patterns/Match.hs +10/−10
- src/full/Agda/TypeChecking/Polarity.hs +63/−99
- src/full/Agda/TypeChecking/Polarity.hs-boot +1/−1
- src/full/Agda/TypeChecking/Positivity.hs +75/−74
- src/full/Agda/TypeChecking/Positivity/Occurrence.hs +44/−7
- src/full/Agda/TypeChecking/Pretty.hs +42/−40
- src/full/Agda/TypeChecking/Pretty.hs-boot +1/−1
- src/full/Agda/TypeChecking/Primitive.hs +89/−54
- src/full/Agda/TypeChecking/ProjectionLike.hs +113/−23
- src/full/Agda/TypeChecking/Quote.hs +27/−18
- src/full/Agda/TypeChecking/ReconstructParameters.hs +3/−1
- src/full/Agda/TypeChecking/RecordPatterns.hs +32/−18
- src/full/Agda/TypeChecking/Records.hs +88/−46
- src/full/Agda/TypeChecking/Reduce.hs +51/−32
- src/full/Agda/TypeChecking/Reduce/Fast.hs +10/−8
- src/full/Agda/TypeChecking/Reduce/Monad.hs +15/−43
- src/full/Agda/TypeChecking/Rewriting.hs +45/−67
- src/full/Agda/TypeChecking/Rewriting/NonLinMatch.hs +48/−106
- src/full/Agda/TypeChecking/Rules/Builtin.hs +148/−76
- src/full/Agda/TypeChecking/Rules/Builtin/Coinduction.hs +6/−4
- src/full/Agda/TypeChecking/Rules/Data.hs +90/−55
- src/full/Agda/TypeChecking/Rules/Decl.hs +105/−140
- src/full/Agda/TypeChecking/Rules/Def.hs +81/−68
- src/full/Agda/TypeChecking/Rules/Display.hs +6/−6
- src/full/Agda/TypeChecking/Rules/LHS.hs +188/−119
- src/full/Agda/TypeChecking/Rules/LHS/AsPatterns.hs +25/−52
- src/full/Agda/TypeChecking/Rules/LHS/Implicit.hs +1/−1
- src/full/Agda/TypeChecking/Rules/LHS/Instantiate.hs +1/−2
- src/full/Agda/TypeChecking/Rules/LHS/Problem.hs +44/−17
- src/full/Agda/TypeChecking/Rules/LHS/ProblemRest.hs +17/−6
- src/full/Agda/TypeChecking/Rules/LHS/Split.hs +123/−43
- src/full/Agda/TypeChecking/Rules/LHS/Unify.hs +140/−175
- src/full/Agda/TypeChecking/Rules/Record.hs +32/−19
- src/full/Agda/TypeChecking/Rules/Term.hs +313/−198
- src/full/Agda/TypeChecking/Serialise.hs +2/−2
- src/full/Agda/TypeChecking/Serialise/Base.hs +78/−297
- src/full/Agda/TypeChecking/Serialise/Instances.hs +4/−3
- src/full/Agda/TypeChecking/Serialise/Instances/Abstract.hs +88/−102
- src/full/Agda/TypeChecking/Serialise/Instances/Common.hs +174/−156
- src/full/Agda/TypeChecking/Serialise/Instances/Compilers.hs +9/−153
- src/full/Agda/TypeChecking/Serialise/Instances/Errors.hs +101/−0
- src/full/Agda/TypeChecking/Serialise/Instances/Highlighting.hs +71/−64
- src/full/Agda/TypeChecking/Serialise/Instances/Internal.hs +195/−213
- src/full/Agda/TypeChecking/SizedTypes.hs +58/−20
- src/full/Agda/TypeChecking/SizedTypes/Solve.hs +22/−19
- src/full/Agda/TypeChecking/SizedTypes/Syntax.hs +56/−28
- src/full/Agda/TypeChecking/SizedTypes/Utils.hs +10/−3
- src/full/Agda/TypeChecking/SizedTypes/WarshallSolver.hs +137/−83
- src/full/Agda/TypeChecking/Substitute.hs +158/−74
- src/full/Agda/TypeChecking/Substitute/Class.hs +31/−11
- src/full/Agda/TypeChecking/SyntacticEquality.hs +3/−3
- src/full/Agda/TypeChecking/Telescope.hs +35/−38
- src/full/Agda/TypeChecking/Unquote.hs +78/−54
- src/full/Agda/TypeChecking/Warnings.hs +114/−0
- src/full/Agda/TypeChecking/With.hs +89/−70
- src/full/Agda/Utils/Bag.hs +18/−8
- src/full/Agda/Utils/Benchmark.hs +25/−17
- src/full/Agda/Utils/BiMap.hs +5/−6
- src/full/Agda/Utils/Char.hs +1/−2
- src/full/Agda/Utils/Cluster.hs +1/−2
- src/full/Agda/Utils/Either.hs +23/−22
- src/full/Agda/Utils/Empty.hs +33/−1
- src/full/Agda/Utils/Except.hs +5/−52
- src/full/Agda/Utils/FileName.hs +6/−5
- src/full/Agda/Utils/Functor.hs +0/−8
- src/full/Agda/Utils/Graph/AdjacencyMap/Unidirectional.hs +7/−1
- src/full/Agda/Utils/Haskell/Syntax.hs +13/−8
- src/full/Agda/Utils/IO.hs +21/−0
- src/full/Agda/Utils/IO/Directory.hs +45/−9
- src/full/Agda/Utils/IO/UTF8.hs +11/−0
- src/full/Agda/Utils/Impossible.hs +15/−1
- src/full/Agda/Utils/IndexedList.hs +74/−0
- src/full/Agda/Utils/Lens.hs +8/−1
- src/full/Agda/Utils/List.hs +41/−35
- src/full/Agda/Utils/Maybe.hs +9/−20
- src/full/Agda/Utils/Maybe/Strict.hs +7/−15
- src/full/Agda/Utils/Monad.hs +27/−37
- src/full/Agda/Utils/Monoid.hs +22/−0
- src/full/Agda/Utils/Parser/MemoisedCPS.hs +146/−61
- src/full/Agda/Utils/PartialOrd.hs +0/−1
- src/full/Agda/Utils/Permutation.hs +9/−8
- src/full/Agda/Utils/Pointer.hs +16/−3
- src/full/Agda/Utils/Pretty.hs +49/−7
- src/full/Agda/Utils/Size.hs +9/−11
- src/full/Agda/Utils/String.hs +15/−3
- src/full/Agda/Utils/Suffix.hs +3/−1
- src/full/Agda/Utils/Three.hs +24/−0
- src/full/Agda/Utils/Time.hs +4/−0
- src/full/Agda/Utils/Trie.hs +51/−4
- src/full/Agda/Utils/TypeLevel.hs +130/−0
- src/full/Agda/Utils/Warshall.hs +9/−9
- src/full/Agda/Version.hs +1/−1
- src/full/undefined.h +5/−0
- stack-7.10.3.yaml +10/−0
- stack-7.8.4.yaml +23/−15
- stack-8.0.1.yaml +0/−5
- stack-8.0.2.yaml +5/−0
Agda.cabal view
@@ -1,10 +1,10 @@ name: Agda-version: 2.5.2+version: 2.5.3 cabal-version: >= 1.10 build-type: Custom license: OtherLicense license-file: LICENSE-author: Ulf Norell, Andreas Abel, Nils Anders Danielsson, Makoto Takeyama, Catarina Coquand, with contributions by Stevan Andjelkovic, Marcin Benke, Jean-Philippe Bernardy, James Chapman, Jesper Cockx, Dominique Devriese, Peter Divanski, Fredrik Nordvall Forsberg, Olle Fredriksson, Daniel Gustafsson, Philipp Hausmann, Patrik Jansson, Alan Jeffrey, Wolfram Kahl, Fredrik Lindblad, Francesco Mazzoli, Stefan Monnier, Darin Morrison, Guilhem Moulin, Nicolas Pouillard, Andrés Sicard-Ramírez, Andrea Vezzosi and many more.+author: Agda 2 was originally written by Ulf Norell, partially based on code from Agda 1 by Catarina Coquand and Makoto Takeyama, and from Agdalight by Ulf Norell and Andreas Abel. Agda 2 is currently actively developed mainly by Andreas Abel, Guillaume Allais, Jesper Cockx, Nils Anders Danielsson, Philipp Hausmann, Fredrik Nordvall Forsberg, Ulf Norell, Víctor López Juan, Andrés Sicard-Ramírez, and Andrea Vezzosi. Further, Agda 2 has received contributions by, amongst others, Stevan Andjelkovic, Marcin Benke, Jean-Philippe Bernardy, Guillaume Brunerie, James Chapman, Dominique Devriese, Péter Diviánszki, Olle Fredriksson, Adam Gundry, Daniel Gustafsson, Kuen-Bang Hou (favonia), Patrik Jansson, Alan Jeffrey, Wolfram Kahl, Pepijn Kokke, Fredrik Lindblad, Francesco Mazzoli, Stefan Monnier, Darin Morrison, Guilhem Moulin, Nicolas Pouillard, Nobuo Yamashita, Christian Sattler, and Makoto Takeyama and many more. maintainer: Ulf Norell <ulfn@chalmers.se> homepage: http://wiki.portal.chalmers.se/agda/ bug-reports: https://github.com/agda/agda/issues@@ -29,27 +29,25 @@ Emacs mode. If you want to use the Emacs mode you can set it up by running @agda-mode setup@ (see the README). .- Note that the Agda library does not follow the package versioning+ Note that the Agda package does not follow the package versioning policy, because it is not intended to be used by third-party packages.-tested-with: GHC == 7.6.3- GHC == 7.8.4+tested-with: GHC == 7.8.4 GHC == 7.10.3- GHC == 8.0.1+ GHC == 8.0.2+ GHC == 8.2.1 extra-source-files: CHANGELOG.md README.md src/full/undefined.h stack-7.8.4.yaml- stack-8.0.1.yaml+ stack-7.10.3.yaml+ stack-8.0.2.yaml data-dir: src/data data-files: Agda.css agda.sty emacs-mode/*.el- -- EpicInclude/AgdaPrelude.e- -- EpicInclude/stdagda.c- -- EpicInclude/stdagda.h JS/agda-rts.js JS/biginteger.js lib/prim/Agda/Builtin/Bool.agda@@ -73,11 +71,6 @@ lib/prim/Agda/Primitive.agda MAlonzo/src/MAlonzo/*.hs postprocess-latex.pl- uhc-agda-base/LICENSE- uhc-agda-base/src/UHC/Agda/*.hs- uhc-agda-base/src/UHC/Agda/double.c- uhc-agda-base/src/UHC/Agda/double.h- uhc-agda-base/uhc-agda-base.cabal source-repository head type: git@@ -85,26 +78,26 @@ source-repository this type: git- location: https://github.com/agda/agda/tree/v2.5.2.- tag: v2.5.2+ location: https://github.com/agda/agda.git+ tag: v2.5.3 flag cpphs default: True manual: True description: Use cpphs instead of cpp. -flag uhc- default: False- manual: True- description:- Enable the UHC backend. For details, consult the Agda User Manual.- flag debug default: False manual: True description: Enable debugging features that may slow Agda down. +flag enable-cluster-counting+ default: False+ description:+ Enable the --count-clusters flag. (If enable-cluster-counting is+ False, then the --count-clusters flag triggers an error message.)+ library hs-source-dirs: src/full include-dirs: src/full@@ -115,37 +108,33 @@ -- If your change the lower bound of cpphs also change it in the -- `.travis.yml` file [Issue #2315].- build-tools: cpphs >= 1.20.2+ build-tools: cpphs >= 1.20.8 ghc-options: -pgmP cpphs -optP --cpp - if flag(uhc)- build-depends: shuffle >= 0.1.3.3- , uhc-light >= 1.1.9.2 && < 1.2- , uhc-util >= 0.1.6.3 && < 0.1.6.7- , uulib >= 0.9.20- -- we use the CPP processor to conditionally import the UHC Light- -- modules. If UHC Light is not present, we instead create dummy- -- definitions, see module Agda.Compiler.UHC.Bridge.- cpp-options: -DUHC_BACKEND- if flag(debug) cpp-options: -DDEBUG + if flag(enable-cluster-counting)+ cpp-options: -DCOUNT_CLUSTERS+ build-depends: text-icu == 0.7.*+ if os(windows)- build-depends: Win32 >= 2.2 && < 2.4+ build-depends: Win32 >= 2.2 && < 2.6 - build-depends: array >= 0.4.0.1 && < 0.6- , base >= 4.6.0.1 && < 4.10+ build-depends: array >= 0.5.0.0 && < 0.6+ , async >= 2.0.2 && < 2.2+ , base >= 4.7.0.2 && < 4.11 , binary >= 0.7.2.1 && < 0.9+ , blaze-html >= 0.8 && < 0.10 , boxes >= 0.1.3 && < 0.2- , bytestring >= 0.10.0.2 && < 0.11- , containers >= 0.5.0.0 && < 0.6+ , bytestring >= 0.10.4.0 && < 0.11+ , containers >= 0.5.5.1 && < 0.6 , data-hash >= 0.2.0.0 && < 0.3- , deepseq >= 1.3.0.1 && < 1.5+ , deepseq >= 1.3.0.2 && < 1.5 , directory >= 1.2.0.1 && < 1.4 , EdisonCore >= 1.3.1.1 && < 1.3.2 , edit-distance >= 0.2.1.2 && < 0.3- , equivalence >= 0.2.5 && < 0.4+ , equivalence >= 0.3.2 && < 0.4 , filepath >= 1.3.0.1 && < 1.5 , geniplate-mirror >= 0.6.0.6 && < 0.8 , gitrev >= 1.2 && < 2.0@@ -160,32 +149,35 @@ -- some cases. , hashtables >= 1.0.1.8 && < 1.2 || >= 1.2.0.2 && < 1.3 , haskeline >= 0.7.1.3 && < 0.8- , ieee754 >= 0.7.8 && < 0.8+ , ieee754 >= 0.7.8 && < 0.9 , monadplus >= 1.4 && < 1.5 -- mtl-2.1 contains a severe bug. -- -- mtl >= 2.2 && < 2.2.1 doesn't export Control.Monad.Except.- , mtl >= 2.1.1 && <= 2.1.3.1 || >= 2.2.1 && < 2.3+ , mtl >= 2.2.1 && < 2.3 , murmur-hash >= 0.1 && < 0.2+ , uri-encode >= 1.5.0.4 && < 1.6 , parallel >= 3.2.0.4 && < 3.3 -- pretty 1.1.1.2 and 1.1.1.3 do not follow the -- package versioning policy.- , pretty >= 1.1.1.0 && < 1.1.1.2 || >= 1.1.2 && < 1.2- , process >= 1.1.0.2 && < 1.5+ , pretty >= 1.1.1.1 && < 1.1.1.2 || >= 1.1.2 && < 1.2+ , process >= 1.2.0.0 && < 1.7 , regex-tdfa >= 1.2.2 && < 1.3+ , stm >= 2.4.4 && < 2.5 , strict >= 0.3.2 && < 0.4- , template-haskell >= 2.8.0.0 && < 2.12+ , template-haskell >= 2.9.0.0 && < 2.13 , text >= 0.11.3.1 && < 1.3- , time >= 1.4.0.1 && < 1.7- -- transformers 0.4.0.0 was deprecated.- , transformers >= 0.3 && < 0.4 || >= 0.4.1.0 && < 0.6- , transformers-compat >= 0.3.3.3 && < 0.6+ , time >= 1.4.2 && < 1.9+ -- In hTags the mtl library must be compiled with the+ -- version of transformers shipped GHC. The lower+ -- bound is the version of transformers shipped with+ -- GHC 7.10.3 (it is not necessary set the lower bound+ -- to a version shipped with GHC < 7.10.3 because in+ -- this case Agda and hTags use a different version of+ -- mtl).+ , transformers >= 0.4.2.0 && < 0.6 , unordered-containers >= 0.2.5.0 && < 0.3- , xhtml >= 3000.2.1 && < 3000.3 - if impl(ghc < 7.8)- build-depends: base-orphans >= 0.3.1 && < 0.5- if impl(ghc < 7.10) build-depends: void >= 0.5.4 && < 0.9 @@ -201,11 +193,14 @@ build-depends: fail == 4.9.* , semigroups == 0.18.* - -- Agda doesn't build with Alex 3.2.0.- build-tools: alex >= 3.1.0 && < 3.2.0 || >= 3.2.1 && < 3.3- , happy >= 1.19.4 && < 2+ -- We don't write upper bounds for Alex nor Happy because the+ -- `build-tools` field can not be modified in Hackage. Agda doesn't+ -- build with Alex 3.2.0.+ build-tools: alex >= 3.1.0 && < 3.2.0 || >= 3.2.1+ , happy >= 1.19.4 exposed-modules: Agda.Auto.Auto+ Agda.Auto.Options Agda.Auto.CaseSplit Agda.Auto.Convert Agda.Auto.NarrowingSearch@@ -213,38 +208,25 @@ Agda.Auto.Syntax Agda.Auto.Typecheck Agda.Benchmarking+ Agda.Compiler.Backend Agda.Compiler.CallCompiler Agda.Compiler.Common- Agda.Compiler.Epic.AuxAST- Agda.Compiler.Epic.CaseOpts- Agda.Compiler.Epic.Compiler- Agda.Compiler.Epic.CompileState- Agda.Compiler.Epic.Epic- Agda.Compiler.Epic.Erasure- Agda.Compiler.Epic.ForceConstrs- Agda.Compiler.Epic.Forcing- Agda.Compiler.Epic.FromAgda- Agda.Compiler.Epic.Injection- Agda.Compiler.Epic.Interface- Agda.Compiler.Epic.NatDetection- Agda.Compiler.Epic.Primitive- Agda.Compiler.Epic.Smashing- Agda.Compiler.Epic.Static- Agda.Compiler.HaskellTypes Agda.Compiler.JS.Compiler Agda.Compiler.JS.Syntax Agda.Compiler.JS.Substitution Agda.Compiler.JS.Pretty Agda.Compiler.MAlonzo.Compiler Agda.Compiler.MAlonzo.Encode+ Agda.Compiler.MAlonzo.HaskellTypes Agda.Compiler.MAlonzo.Misc+ Agda.Compiler.MAlonzo.Pragmas Agda.Compiler.MAlonzo.Pretty Agda.Compiler.MAlonzo.Primitives Agda.Compiler.ToTreeless Agda.Compiler.Treeless.AsPatterns Agda.Compiler.Treeless.Builtin Agda.Compiler.Treeless.Compare- Agda.Compiler.Treeless.DelayCoinduction+ Agda.Compiler.Treeless.EliminateDefaults Agda.Compiler.Treeless.EliminateLiteralPatterns Agda.Compiler.Treeless.Erase Agda.Compiler.Treeless.GuardsToPrims@@ -255,14 +237,6 @@ Agda.Compiler.Treeless.Subst Agda.Compiler.Treeless.Uncase Agda.Compiler.Treeless.Unused- Agda.Compiler.UHC.Bridge- Agda.Compiler.UHC.Compiler- Agda.Compiler.UHC.CompileState- Agda.Compiler.UHC.FromAgda- Agda.Compiler.UHC.MagicTypes- Agda.Compiler.UHC.Pragmas.Base- Agda.Compiler.UHC.Pragmas.Parse- Agda.Compiler.UHC.Primitives Agda.ImpossibleTest Agda.Interaction.BasicOps Agda.Interaction.SearchAbout@@ -291,6 +265,7 @@ Agda.Main Agda.Syntax.Abstract.Copatterns Agda.Syntax.Abstract.Name+ Agda.Syntax.Abstract.Pattern Agda.Syntax.Abstract.Pretty Agda.Syntax.Abstract.Views Agda.Syntax.Abstract@@ -368,6 +343,7 @@ Agda.TypeChecking.Free.Lazy Agda.TypeChecking.Free.Old Agda.TypeChecking.Forcing+ Agda.TypeChecking.Functions Agda.TypeChecking.Implicit Agda.TypeChecking.Injectivity Agda.TypeChecking.InstanceArguments@@ -384,8 +360,8 @@ Agda.TypeChecking.Monad.Closure Agda.TypeChecking.Monad.Constraints Agda.TypeChecking.Monad.Context+ Agda.TypeChecking.Monad.Debug Agda.TypeChecking.Monad.Env- Agda.TypeChecking.Monad.Exception Agda.TypeChecking.Monad.Imports Agda.TypeChecking.Monad.Local Agda.TypeChecking.Monad.MetaVars@@ -440,6 +416,7 @@ Agda.TypeChecking.Serialise.Instances.Compilers Agda.TypeChecking.Serialise.Instances.Highlighting Agda.TypeChecking.Serialise.Instances.Internal+ Agda.TypeChecking.Serialise.Instances.Errors Agda.TypeChecking.SizedTypes Agda.TypeChecking.SizedTypes.Solve Agda.TypeChecking.SizedTypes.Syntax@@ -451,6 +428,7 @@ Agda.TypeChecking.SyntacticEquality Agda.TypeChecking.Telescope Agda.TypeChecking.Unquote+ Agda.TypeChecking.Warnings Agda.TypeChecking.With Agda.Utils.AssocList Agda.Utils.Bag@@ -472,6 +450,8 @@ Agda.Utils.HashMap Agda.Utils.Haskell.Syntax Agda.Utils.Impossible+ Agda.Utils.IndexedList+ Agda.Utils.IO Agda.Utils.IO.Binary Agda.Utils.IO.Directory Agda.Utils.IO.UTF8@@ -485,6 +465,7 @@ Agda.Utils.Maybe.Strict Agda.Utils.Memo Agda.Utils.Monad+ Agda.Utils.Monoid Agda.Utils.Null Agda.Utils.Parser.MemoisedCPS Agda.Utils.Parser.ReadP@@ -497,9 +478,11 @@ Agda.Utils.Size Agda.Utils.String Agda.Utils.Suffix+ Agda.Utils.Three Agda.Utils.Time Agda.Utils.Trie Agda.Utils.Tuple+ Agda.Utils.TypeLevel Agda.Utils.Update Agda.Utils.VarSet Agda.Utils.Warshall@@ -516,31 +499,29 @@ if impl(ghc >= 8.0) ghc-options: -Wunrecognised-warning-flags - if impl(ghc >= 7.6.3)+ if impl(ghc >= 7.8) ghc-options: -fwarn-deprecated-flags -fwarn-dodgy-exports -fwarn-dodgy-foreign-imports -fwarn-dodgy-imports -fwarn-duplicate-exports+ -fwarn-empty-enumerations -fwarn-hi-shadowing -fwarn-identities -fwarn-incomplete-patterns+ -fwarn-inline-rule-shadowing -fwarn-missing-fields -fwarn-missing-methods -fwarn-missing-signatures -fwarn-tabs+ -fwarn-typed-holes+ -fwarn-overflowed-literals -fwarn-overlapping-patterns -fwarn-unrecognised-pragmas -fwarn-unused-do-bind -fwarn-warnings-deprecations -fwarn-wrong-do-bind - if impl(ghc >= 7.8)- ghc-options: -fwarn-empty-enumerations- -fwarn-inline-rule-shadowing- -fwarn-typed-holes- -fwarn-overflowed-literals- if impl(ghc >= 7.10) ghc-options: -fwarn-unticked-promoted-constructors -- Enable after removing the support for GHC 7.8.@@ -550,13 +531,10 @@ if impl(ghc >= 7.8) && impl(ghc < 7.10) ghc-options: -fwarn-amp - -- This option will be removed in GHC 8.0.1.- if impl(ghc >= 7.6) && impl(ghc < 8.0)- ghc-options: -fwarn-pointless-pragmas-- -- This option will be deprected in GHC 8.0.1.+ -- These options will be removed in GHC 8.0.1. if impl(ghc >= 7.8) && impl(ghc < 8.0) ghc-options: -fwarn-duplicate-constraints+ -fwarn-pointless-pragmas -- This option will be deprected in GHC 8.0.1. if impl(ghc >= 7.10) && impl(ghc < 8.0)@@ -569,12 +547,20 @@ -Wsemigroup -Wunused-foralls + if impl(ghc >= 8.2)+ ghc-options: -Wcpp-undef+ -- ASR TODO (2017-07-23): `make haddock` fails when+ -- this flag is on.+ -- -Wmissing-home-modules+ -Wsimplifiable-class-constraints+ -Wunbanged-strict-patterns+ default-language: Haskell2010 default-extensions: ConstraintKinds , DataKinds , DefaultSignatures- , DeriveFunctor , DeriveFoldable+ , DeriveFunctor , DeriveTraversable , ExistentialQuantification , FlexibleContexts@@ -582,20 +568,28 @@ , FunctionalDependencies , LambdaCase , MultiParamTypeClasses+ , MultiWayIf , NamedFieldPuns , RankNTypes , RecordWildCards+ , ScopedTypeVariables , StandaloneDeriving- , TupleSections , TypeSynonymInstances+ , TupleSections executable agda hs-source-dirs: src/main main-is: Main.hs- build-depends: Agda == 2.5.2+ build-depends: Agda+ -- A version range on Agda generates a warning with+ -- some versions of Cabal and GHC+ -- (e.g. cabal-install version 1.24.0.2 compiled+ -- using version 1.24.2.0 of the Cabal library and+ -- GHC 8.2.1 RC1).+ -- Nothing is used from the following package, -- except for the prelude.- , base >= 4.6.0.1 && < 6+ , base >= 4.7.0.2 && < 6 default-language: Haskell2010 if impl(ghc >= 7) -- If someone installs Agda with the setuid bit set, then the@@ -609,8 +603,8 @@ hs-source-dirs: src/agda-mode main-is: Main.hs other-modules: Paths_Agda- build-depends: base >= 4.6.0.1 && < 4.10- , directory >= 1.2.0.1 && < 1.4- , filepath >= 1.3.0.1 && < 1.5- , process >= 1.1.0.2 && < 1.5+ build-depends: base >= 4.7.0.2 && < 4.11+ , directory >= 1.2.1.0 && < 1.4+ , filepath >= 1.3.0.2 && < 1.5+ , process >= 1.2.0.0 && < 1.7 default-language: Haskell2010
CHANGELOG.md view
@@ -1,3 +1,827 @@+Release notes for Agda version 2.5.3+====================================++Installation and infrastructure+-------------------------------++* Added support for GHC 8.0.2 and 8.2.1.++* Removed support for GHC 7.6.3.++* Markdown support for literate Agda+ \[PR [#2357](https://github.com/agda/agda/pull/2357)].++ Files ending in `.lagda.md` will be parsed as literate Markdown files.++ + Code blocks start with ```` ``` ```` or ```` ```agda ```` in its own line, and end with+ ```` ``` ````, also in its own line.+ + Code blocks which should be type-checked by Agda but should not be visible+ when the Markdown is rendered may be enclosed in HTML comment delimiters+ (`<!--` and `-->`).+ + Code blocks which should be ignored by Agda, but rendered in the final+ document may be indented by four spaces.+ + Note that inline code fragments are not supported due to the difficulty of+ interpreting their indentation level with respect to the rest of the file.++Language+--------++### Pattern matching++* Dot patterns.++ The dot in front of an inaccessible pattern can now be skipped if the+ pattern consists entirely of constructors or literals. For example:+ ```agda+ open import Agda.Builtin.Bool++ data D : Bool → Set where+ c : D true++ f : (x : Bool) → D x → Bool+ f true c = true++ ```+ Before this change, you had to write `f .true c = true`.++* With-clause patterns can be replaced by _+ [Issue [#2363](https://github.com/agda/agda/issues/2363)].+ Example:+ ```agda+ test : Nat → Set+ test zero with zero+ test _ | _ = Nat+ test (suc x) with zero+ test _ | _ = Nat+ ```+ We do not have to spell out the pattern of the parent clause+ (`zero` / `suc x`) in the with-clause if we do not need the+ pattern variables. Note that `x` is not in scope in the+ with-clause!++ A more elaborate example, which cannot be reduced to+ an ellipsis `...`:+ ```agda+ record R : Set where+ coinductive -- disallow matching+ field f : Bool+ n : Nat++ data P (r : R) : Nat → Set where+ fTrue : R.f r ≡ true → P r zero+ nSuc : P r (suc (R.n r))++ data Q : (b : Bool) (n : Nat) → Set where+ true! : Q true zero+ suc! : ∀{b n} → Q b (suc n)++ test : (r : R) {n : Nat} (p : P r n) → Q (R.f r) n+ test r nSuc = suc!+ test r (fTrue p) with R.f r+ test _ (fTrue ()) | false+ test _ _ | true = true! -- underscore instead of (isTrue _)+ ```++* Pattern matching lambdas (also known as extended lambdas) can now be+ nullary, mirroring the behaviour for ordinary function definitions.+ [Issue [#2671](https://github.com/agda/agda/issues/2671)]++ This is useful for case splitting on the result inside an+ expression: given+ ```agda+ record _×_ (A B : Set) : Set where+ field+ π₁ : A+ π₂ : B+ open _×_+ ```+ one may case split on the result (C-c C-c RET) in a hole+ ```agda+ λ { → {!!}}+ ```+ of type A × B to produce+ ```agda+ λ { .π₁ → {!!} ; .π₂ → {!!}}+ ```++* Records with a field of an empty type are now recognized as empty by Agda.+ In particular, they can be matched against with an absurd pattern ().+ For example:+ ```agda+ data ⊥ : Set where++ record Empty : Set where+ field absurdity : ⊥++ magic : Empty → ⊥+ magic ()+ ```++* Injective pragmas.++ Injective pragmas can be used to mark a definition as injective for the+ pattern matching unifier. This can be used as a version of+ `--injective-type-constructors` that only applies to specific datatypes.+ For example:+ ```agda+ open import Agda.Builtin.Equality+ data Fin : Nat → Set where+ zero : {n : Nat} → Fin (suc n)+ suc : {n : Nat} → Fin n → Fin (suc n)++ {-# INJECTIVE Fin #-}++ Fin-injective : {m n : Nat} → Fin m ≡ Fin n → m ≡ n+ Fin-injective refl = refl+ ```+ Aside from datatypes, this pragma can also be used to mark other definitions+ as being injective (for example postulates).++* Metavariables can no longer be instantiated during case splitting. This means+ Agda will refuse to split instead of taking the first constructor it finds.+ For example:+ ```agda+ open import Agda.Builtin.Nat++ data Vec (A : Set) : Nat → Set where+ nil : Vec A 0+ cons : {n : Nat} → A → Vec A n → Vec A (suc n)++ foo : Vec Nat _ → Nat+ foo x = {!x!}+ ```+ In Agda 2.5.2, case splitting on `x` produced the single clause+ `foo nil = {!!}`, but now Agda refuses to split.++### Reflection++* New TC primitive: `debugPrint`.++ ```agda+ debugPrint : String → Nat → List ErrorPart → TC ⊤+ ```++ This maps to the internal function `reportSDoc`. Debug output is enabled with+ the `-v` flag at the command line, or in an `OPTIONS` pragma. For instance,+ giving `-v a.b.c:10` enables printing from `debugPrint "a.b.c.d" 10 msg`. In the+ Emacs mode, debug output ends up in the `*Agda debug*` buffer.++### Built-ins++* BUILTIN REFL is now superfluous, subsumed by BUILTIN EQUALITY+ [Issue [#2389](https://github.com/agda/agda/issues/2389)].++* BUILTIN EQUALITY is now more liberal+ [Issue [#2386](https://github.com/agda/agda/issues/2386)].+ It accepts, among others, the following new definitions of equality:+ ```agda+ -- Non-universe polymorphic:+ data _≡_ {A : Set} (x : A) : A → Set where+ refl : x ≡ x++ -- ... with explicit argument to refl;+ data _≡_ {A : Set} : (x y : A) → Set where+ refl : {x : A} → x ≡ x++ -- ... even visible+ data _≡_ {A : Set} : (x y : A) → Set where+ refl : (x : A) → x ≡ x++ -- Equality in a different universe than domain:+ -- (also with explicit argument to refl)+ data _≡_ {a} {A : Set a} (x : A) : A → Set where+ refl : x ≡ x++ ```+ The standard definition is still:+ ```agda+ -- Equality in same universe as domain:+ data _≡_ {a} {A : Set a} (x : A) : A → Set a where+ refl : x ≡ x+ ```++### Miscellaneous++* Rule change for omitted top-level module headers.+ [Issue [#1077](https://github.com/agda/agda/issues/1077)]++ If your file is named `Bla.agda`, then the following content+ is rejected.+ ```agda+ foo = Set+ module Bla where+ bar = Set+ ```+ Before the fix of this issue, Agda would add the missing module+ header `module Bla where` at the top of the file.+ However, in this particular case it is more likely the user+ put the declaration `foo = Set` before the module start in error.+ Now you get the error+ ```+ Illegal declaration(s) before top-level module+ ```+ if the following conditions are met:++ 1. There is at least one non-import declaration or non-toplevel pragma+ before the start of the first module.++ 2. The module has the same name as the file.++ 3. The module is the only module at this level+ (may have submodules, of course).++ If you should see this error, insert a top-level module+ before the illegal declarations, or move them inside the+ existing module.++Emacs mode+----------++* New warnings:++ - Unreachable clauses give rise to a simple warning. They are+ highlighted in gray.++ - Incomplete patterns are non-fatal warnings: it is possible+ to keep interacting with the file (the reduction will simply+ be stuck on arguments not matching any pattern).+ The definition with incomplete patterns are highlighted in+ wheat.++* Clauses which do not hold definitionally are now highlighted in white smoke.++* Fewer commands have the side effect that the buffer is saved.++* Aborting commands.++ Now one can (try to) abort an Agda command by using `C-c C-x C-a` or+ a menu entry. The effect is similar to that of restarting Agda (`C-c+ C-x C-r`), but some state is preserved, which could mean that it+ takes less time to reload the module.++ Warning: If a command is aborted while it is writing data to disk+ (for instance .agdai files or Haskell files generated by the GHC+ backend), then the resulting files may be corrupted. Note also that+ external commands (like GHC) are not aborted, and their output may+ continue to be sent to the Emacs mode.++* New bindings for the Agda input method:++ - All the bold digits are now available. The naming scheme is `\Bx` for digit `x`.++ - Typing `\:` you can now get a whole slew of colons.++ (The Agda input method originally only bound the standard unicode colon,+ which looks deceptively like the normal colon.)++* Case splitting now preserves underscores.+ [Issue [#819](https://github.com/agda/agda/issues/819)]+ ```agda+ data ⊥ : Set where++ test : {A B : Set} → A → ⊥ → B+ test _ x = {! x !}+ ```+ Splitting on `x` yields+ ```agda+ test _ ()+ ```++* Interactively expanding ellipsis.+ [Issue [#2589](https://github.com/agda/agda/issues/2589)]+ An ellipsis in a with-clause can be expanded by splitting on "variable" "." (dot).+ ```agda+ test0 : Nat → Nat+ test0 x with zero+ ... | q = {! . !} -- C-c C-c+ ```+ Splitting on dot here yields:+ ```agda+ test0 x | q = ?+ ```++* New command to check an expression against the type of the hole+ it is in and see what it elaborates to.+ [Issue [#2700](https://github.com/agda/agda/issues/2700)]+ This is useful to determine e.g. what solution typeclass resolution yields.+ The command is bound to `C-c C-;` and respects the `C-u` modifier.++ ```agda+ record Pointed (A : Set) : Set where+ field point : A++ it : ∀ {A : Set} {{x : A}} → A+ it {{x}} = x++ instance _ = record { point = 3 - 4 }++ _ : Pointed Nat+ _ = {! it !} -- C-u C-u C-c C-;+ ```+ yields+ ```agda+ Goal: Pointed Nat+ Elaborates to: record { point = 0 }+ ```++* If `agda2-give` is called with a prefix, then giving is forced,+ i.e., the safety checks are skipped,+ including positivity, termination, and double type-checking.+ [Issue [#2730](https://github.com/agda/agda/issues/2730)]++ Invoke forced giving with key sequence `C-u C-c C-SPC`.+++Library management+------------------++* The `name` field in an `.agda-lib` file is now optional.+ [Issue [#2708](https://github.com/agda/agda/issues/2708)]++ This feature is convenient if you just want to specify the dependencies+ and include pathes for your local project in an `.agda-lib` file.++ Naturally, libraries without names cannot be depended on.+++Compiler backends+-----------------++* Unified compiler pragmas++ The compiler pragmas (`COMPILED`, `COMPILED_DATA`, etc.) have been unified across+ backends into two new pragmas:++ ```+ {-# COMPILE <Backend> <Name> <Text> #-}+ {-# FOREIGN <Backend> <Text> #-}+ ```++ The old pragmas still work, but will emit a warning if used. They will be+ removed completely in Agda 2.6.++ The translation of old pragmas into new ones is as follows:++ Old | New+ --- | ---+ `{-# COMPILED f e #-}` | `{-# COMPILE GHC f = e #-}`+ `{-# COMPILED_TYPE A T #-}` | `{-# COMPILE GHC A = type T #-}`+ `{-# COMPILED_DATA A D C1 .. CN #-}` | `{-# COMPILE GHC A = data D (C1 | .. | CN) #-}`+ `{-# COMPILED_DECLARE_DATA #-}` | obsolete, removed+ `{-# COMPILED_EXPORT f g #-}` | `{-# COMPILE GHC f as g #-}`+ `{-# IMPORT M #-}` | `{-# FOREIGN GHC import qualified M #-}`+ `{-# HASKELL code #-}` | `{-# FOREIGN GHC code #-}`+ `{-# COMPILED_UHC f e #-}` | `{-# COMPILE UHC f = e #-}`+ `{-# COMPILED_DATA_UHC A D C1 .. CN #-}` | `{-# COMPILE UHC A = data D (C1 | .. | CN) #-}`+ `{-# IMPORT_UHC M #-}` | `{-# FOREIGN UHC __IMPORT__ M #-}`+ `{-# COMPILED_JS f e #-}` | `{-# COMPILE JS f = e #-}`++* GHC Haskell backend++ The COMPILED pragma (and the corresponding COMPILE GHC pragma) is now also+ allowed for functions. This makes it possible to have both an Agda+ implementation and a native Haskell runtime implementation.++ The GHC file header pragmas `LANGUAGE`, `OPTIONS_GHC`, and `INCLUDE`+ inside a `FOREIGN GHC` pragma are recognized and printed correctly+ at the top of the generated Haskell file.+ [Issue [#2712](https://github.com/agda/agda/issues/2712)]+++* UHC compiler backend++ The UHC backend has been moved to its own repository+ [https://github.com/agda/agda-uhc] and is no longer part of the Agda+ distribution.++* Haskell imports are no longer transitively inherited from imported modules.++ The (now deprecated) IMPORT and IMPORT_UHC pragmas no longer cause import+ statements in modules importing the module containing the pragma.++ The same is true for the corresponding FOREIGN pragmas.++* Support for stand-alone backends.++ There is a new API in `Agda.Compiler.Backend` for creating stand-alone+ backends using Agda as a library. This allows prospective backend writers to+ experiment with new backends without having to change the Agda code base.++HTML backend+------------++* Anchors for identifiers (excluding bound variables) are now the+ identifiers themselves rather than just the file position+ [Issue [#2604](https://github.com/agda/agda/issues/2604)].++ Symbolic anchors look like+ ```html+ <a id="test1">+ <a id="M.bla">+ ```+ while other anchors just give the character position in the file:+ ```html+ <a id="42">+ ```++ Top-level module names do not get a symbolic anchor, since the position of+ a top-level module is defined to be the beginning of the file.++ Example:++ ```agda+ module Issue2604 where -- Character position anchor++ test1 : Set₁ -- Issue2604.html#test1+ test1 = bla+ where+ bla = Set -- Character position anchor++ test2 : Set₁ -- Issue2604.html#test2+ test2 = bla+ where+ bla = Set -- Character position anchor++ test3 : Set₁ -- Issue2604.html#test3+ test3 = bla+ module M where -- Issue2604.html#M+ bla = Set -- Issue2604.html#M.bla++ module NamedModule where -- Issue2604.html#NamedModule+ test4 : Set₁ -- Issue2604.html#NamedModule.test4+ test4 = M.bla++ module _ where -- Character position anchor+ test5 : Set₁ -- Character position anchor+ test5 = M.bla+ ```++* Some generated HTML files now have different file names [Issue+ [#2725](https://github.com/agda/agda/issues/2725)].++ Agda now uses an encoding that amounts to first converting the+ module names to UTF-8, and then percent-encoding the resulting+ bytes. For instance, HTML for the module `Σ` is placed in+ `%CE%A3.html`.++LaTeX backend+-------------++* The LaTeX backend now handles indentation in a different way [Issue+ [#1832](https://github.com/agda/agda/issues/1832)].++ A constraint on the indentation of the first token *t* on a line is+ determined as follows:+ * Let *T* be the set containing every previous token (in any code+ block) that is either the initial token on its line or preceded by+ at least one whitespace character.+ * Let *S* be the set containing all tokens in *T* that are not+ *shadowed* by other tokens in *T*. A token *t₁* is shadowed by+ *t₂* if *t₂* is further down than *t₁* and does not start to the+ right of *t₁*.+ * Let *L* be the set containing all tokens in *S* that start to the+ left of *t*, and *E* be the set containing all tokens in *S* that+ start in the same column as *t*.+ * The constraint is that *t* must be indented further than every+ token in *L*, and aligned with every token in *E*.++ Note that if any token in *L* or *E* belongs to a previous code+ block, then the constraint may not be satisfied unless (say) the+ `AgdaAlign` environment is used in an appropriate way.++ If custom settings are used, for instance if `\AgdaIndent` is+ redefined, then the constraint discussed above may not be satisfied.+ (Note that the meaning of the `\AgdaIndent` command's argument has+ changed, and that the command is now used in a different way in the+ generated LaTeX files.)++ Examples:+ * Here `C` is indented further than `B`:++ ```agda+ postulate+ A B+ C : Set+ ```++ * Here `C` is not (necessarily) indented further than `B`, because+ `X` shadows `B`:++ ```agda+ postulate+ A B : Set+ X+ C : Set+ ```++ The new rule is inspired by, but not identical to, the one used by+ lhs2TeX's poly mode (see Section 8.4 of the [manual for lhs2TeX+ version 1.17](https://www.andres-loeh.de/lhs2tex/Guide2-1.17.pdf)).++* Some spacing issues+ [[#2353](https://github.com/agda/agda/issues/2353),+ [#2441](https://github.com/agda/agda/issues/2441),+ [#2733](https://github.com/agda/agda/issues/2733),+ [#2740](https://github.com/agda/agda/issues/2740)] have been fixed.++* The user can now control the typesetting of (certain) individual tokens+ by redefining the `\AgdaFormat` command. Example:+ ```latex+ \usepackage{ifthen}++ % Insert extra space before some tokens.+ \DeclareRobustCommand{\AgdaFormat}[2]{%+ \ifthenelse{+ \equal{#1}{≡⟨} \OR+ \equal{#1}{≡⟨⟩} \OR+ \equal{#1}{∎}+ }{\ }{}#2}+ ```+ Note the use of `\DeclareRobustCommand`. The first argument to+ `\AgdaFormat` is the token, and the second argument the thing to+ be typeset.++* One can now instruct the agda package not to select any fonts.++ If the `nofontsetup` option is used, then some font packages are+ loaded, but specific fonts are not selected:+ ```latex+ \usepackage[nofontsetup]{agda}+ ```++* The height of empty lines is now configurable+ [[#2734](https://github.com/agda/agda/issues/2734)].++ The height is controlled by the length `\AgdaEmptySkip`, which by+ default is `\baselineskip`.++* The alignment feature regards the string `+̲`, containing `+` and a+ combining character, as having length two. However, it seems more+ reasonable to treat it as having length one, as it occupies a single+ column, if displayed "properly" using a monospace font. The new flag+ `--count-clusters` is an attempt at fixing this. When this flag is+ enabled the backend counts ["extended grapheme+ clusters"](http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries)+ rather than code points.++ Note that this fix is not perfect: a single extended grapheme+ cluster might be displayed in different ways by different programs,+ and might, in some cases, occupy more than one column. Here are some+ examples of extended grapheme clusters, all of which are treated as+ a single character by the alignment algorithm:+ ```+ │ │+ │+̲│+ │Ö̂│+ │நி│+ │ᄀힰᇹ│+ │ᄀᄀᄀᄀᄀᄀힰᇹᇹᇹᇹᇹᇹ│+ │ │+ ```++ Note also that the layout machinery does not count extended grapheme+ clusters, but code points. The following code is syntactically+ correct, but if `--count-clusters` is used, then the LaTeX backend+ does not align the two `field` keywords:+ ```agda+ record +̲ : Set₁ where field A : Set+ field B : Set+ ```++ The `--count-clusters` flag is not enabled in all builds of Agda,+ because the implementation depends on the+ [ICU](http://site.icu-project.org) library, the installation of+ which could cause extra trouble for some users. The presence of this+ flag is controlled by the Cabal flag `enable-cluster-counting`.++* A faster variant of the LaTeX backend: QuickLaTeX.++ When this variant of the backend is used the top-level module is not+ type-checked, only scope-checked. This implies that some+ highlighting information is not available. For instance, overloaded+ constructors are not resolved.++ QuickLaTeX can be invoked from the Emacs mode, or using `agda+ --latex --only-scope-checking`. If the module has already been+ type-checked successfully, then this information is reused; in this+ case QuickLaTeX behaves like the regular LaTeX backend.++ The `--only-scope-checking` flag can also be used independently, but+ it is perhaps unclear what purpose that would serve. (The flag can+ currently not be combined with `--html`, `--dependency-graph` or+ `--vim`.) The flag is not allowed in safe mode.++Pragmas and options+-------------------++* The `--safe` option is now a valid pragma.++ This makes it possible to declare a module as being part of the safe+ subset of the language by stating `{-# OPTIONS --safe #-}` at the top+ of the corresponding file. Incompatibilities between the `--safe` option+ and other options or language constructs are non-fatal errors.++* The `--no-main` option is now a valid pragma.++ One can now suppress the compiler warning about a missing main function by+ putting+ ```agda+ {-# OPTIONS --no-main #-}+ ```+ on top of the file.++* New command-line option and pragma `--warning=MODE` (or `-W MODE`) for+ setting the warning mode. Current options are+ - `warn` for displaying warnings (default)+ - `error` for turning warnings into errors+ - `ignore` for not displaying warnings++List of fixed issues+--------------------++For 2.5.3, the following issues have been fixed+(see [bug tracker](https://github.com/agda/agda/issues)):++ - [#142](https://github.com/agda/agda/issues/142): Inherited dot patterns in with functions are not checked+ - [#623](https://github.com/agda/agda/issues/623): Error message points to importing module rather than imported module+ - [#657](https://github.com/agda/agda/issues/657): Yet another display form problem+ - [#668](https://github.com/agda/agda/issues/668): Ability to stop, or restart, typechecking somehow+ - [#705](https://github.com/agda/agda/issues/705): confusing error message for ambiguous datatype module name+ - [#719](https://github.com/agda/agda/issues/719): Error message for duplicate module definition points to external module instead of internal module+ - [#776](https://github.com/agda/agda/issues/776): Unsolvable constraints should give error+ - [#819](https://github.com/agda/agda/issues/819): Case-splitting doesn't preserve underscores+ - [#883](https://github.com/agda/agda/issues/883): Rewrite loses type information+ - [#899](https://github.com/agda/agda/issues/899): Instance search fails if there are several definitionally equal values in scope+ - [#1077](https://github.com/agda/agda/issues/1077): problem with module syntax, with parametric module import+ - [#1126](https://github.com/agda/agda/issues/1126): Port optimizations from the Epic backend+ - [#1175](https://github.com/agda/agda/issues/1175): Internal Error in Auto+ - [#1544](https://github.com/agda/agda/issues/1544): Positivity polymorphism needed for compositional positivity analysis+ - [#1611](https://github.com/agda/agda/issues/1611): Interactive splitting instantiates meta+ - [#1664](https://github.com/agda/agda/issues/1664): Add Reflection primitives to expose precedence and fixity+ - [#1817](https://github.com/agda/agda/issues/1817): Solvable size constraints reported as unsolvable+ - [#1832](https://github.com/agda/agda/issues/1832): Insufficient indentation in LaTeX-rendered Agda code+ - [#1834](https://github.com/agda/agda/issues/1834): Copattern matching: order of clauses should not matter here+ - [#1886](https://github.com/agda/agda/issues/1886): Second copies of telescopes not checked?+ - [#1899](https://github.com/agda/agda/issues/1899): Positivity checker does not treat datatypes and record types in the same way+ - [#1975](https://github.com/agda/agda/issues/1975): Type-incorrect instantiated overloaded constructor accepted in pattern+ - [#1976](https://github.com/agda/agda/issues/1976): Type-incorrect instantiated projection accepted in pattern+ - [#2035](https://github.com/agda/agda/issues/2035): Matching on string causes solver to fail with internal error+ - [#2146](https://github.com/agda/agda/issues/2146): Unicode syntax for instance arguments+ - [#2217](https://github.com/agda/agda/issues/2217): Abort Agda without losing state+ - [#2229](https://github.com/agda/agda/issues/2229): Absence or presence of top-level module header affects scope+ - [#2253](https://github.com/agda/agda/issues/2253): Wrong scope error for abstract constructors+ - [#2261](https://github.com/agda/agda/issues/2261): Internal error in Auto/CaseSplit.hs:284+ - [#2270](https://github.com/agda/agda/issues/2270): Printer does not use sections.+ - [#2329](https://github.com/agda/agda/issues/2329): Size solver does not use type `Size< i` to gain the necessary information+ - [#2354](https://github.com/agda/agda/issues/2354): Interaction between instance search, size solver, and ordinary constraint solver.+ - [#2355](https://github.com/agda/agda/issues/2355): Literate Agda parser does not recognize TeX comments+ - [#2360](https://github.com/agda/agda/issues/2360): With clause stripping chokes on ambiguous projection+ - [#2362](https://github.com/agda/agda/issues/2362): Printing of parent patterns when with-clause does not match+ - [#2363](https://github.com/agda/agda/issues/2363): Allow underscore in with-clause patterns+ - [#2366](https://github.com/agda/agda/issues/2366): With-clause patterns renamed in error message+ - [#2368](https://github.com/agda/agda/issues/2368): Internal error after refining a tactic @ MetaVars.hs:267+ - [#2371](https://github.com/agda/agda/issues/2371): Shadowed module parameter crashes interaction+ - [#2372](https://github.com/agda/agda/issues/2372): problems when instances are declared with inferred types+ - [#2374](https://github.com/agda/agda/issues/2374): Ambiguous projection pattern could be disambiguated by visibility+ - [#2376](https://github.com/agda/agda/issues/2376): Termination checking interacts badly with eta-contraction+ - [#2377](https://github.com/agda/agda/issues/2377): open public is useless before module header+ - [#2381](https://github.com/agda/agda/issues/2381): Search (`C-c C-z`) panics on pattern synonyms+ - [#2386](https://github.com/agda/agda/issues/2386): Relax requirements of BUILTIN EQUALITY+ - [#2389](https://github.com/agda/agda/issues/2389): BUILTIN REFL not needed+ - [#2400](https://github.com/agda/agda/issues/2400): LaTeX backend error on LaTeX comments+ - [#2402](https://github.com/agda/agda/issues/2402): Parameters not dropped when reporting incomplete patterns+ - [#2403](https://github.com/agda/agda/issues/2403): Termination checker should reduce arguments in structural order check+ - [#2405](https://github.com/agda/agda/issues/2405): instance search failing in parameterized module+ - [#2408](https://github.com/agda/agda/issues/2408): DLub sorts are not serialized+ - [#2412](https://github.com/agda/agda/issues/2412): Problem with checking with sized types+ - [#2413](https://github.com/agda/agda/issues/2413): Agda crashes on x@y pattern+ - [#2415](https://github.com/agda/agda/issues/2415): Size solver reports "inconsistent upper bound" even though there is a solution+ - [#2416](https://github.com/agda/agda/issues/2416): Cannot give size as computed by solver+ - [#2422](https://github.com/agda/agda/issues/2422): Overloaded inherited projections don't resolve+ - [#2423](https://github.com/agda/agda/issues/2423): Inherited projection on lhs+ - [#2426](https://github.com/agda/agda/issues/2426): On just warning about missing cases+ - [#2429](https://github.com/agda/agda/issues/2429): Irrelevant lambda should be accepted when relevant lambda is expected+ - [#2430](https://github.com/agda/agda/issues/2430): Another regression related to parameter refinement?+ - [#2433](https://github.com/agda/agda/issues/2433): rebindLocalRewriteRules re-adds global rewrite rules+ - [#2434](https://github.com/agda/agda/issues/2434): Exact split analysis is too strict when matching on eta record constructor+ - [#2441](https://github.com/agda/agda/issues/2441): Incorrect alignement in latex using the new ACM format+ - [#2444](https://github.com/agda/agda/issues/2444): Generalising compiler pragmas+ - [#2445](https://github.com/agda/agda/issues/2445): The LaTeX backend is slow+ - [#2447](https://github.com/agda/agda/issues/2447): Cache loaded interfaces even if a type error is encountered+ - [#2449](https://github.com/agda/agda/issues/2449): Agda depends on additional C library icu+ - [#2451](https://github.com/agda/agda/issues/2451): Agda panics when attempting to rewrite a typeclass Eq+ - [#2456](https://github.com/agda/agda/issues/2456): Internal error when postulating instance+ - [#2458](https://github.com/agda/agda/issues/2458): Regression: Agda-2.5.3 loops where Agda-2.5.2 passes+ - [#2462](https://github.com/agda/agda/issues/2462): Overloaded postfix projection does not resolve+ - [#2464](https://github.com/agda/agda/issues/2464): Eta contraction for irrelevant functions breaks subject reduction+ - [#2466](https://github.com/agda/agda/issues/2466): Case split to make hidden variable visible does not work+ - [#2467](https://github.com/agda/agda/issues/2467): REWRITE without BUILTIN REWRITE crashes+ - [#2469](https://github.com/agda/agda/issues/2469): "Partial" pattern match causes segfault at runtime+ - [#2472](https://github.com/agda/agda/issues/2472): Regression related to the auto command+ - [#2477](https://github.com/agda/agda/issues/2477): Sized data type analysis brittle, does not reduce size+ - [#2478](https://github.com/agda/agda/issues/2478): Multiply defined labels on the user manual (pdf)+ - [#2479](https://github.com/agda/agda/issues/2479): "Occurs check" error in generated Haskell code+ - [#2480](https://github.com/agda/agda/issues/2480): Agda accepts incorrect (?) code, subject reduction broken+ - [#2482](https://github.com/agda/agda/issues/2482): Wrong counting of data parameters with new-style mutual blocks+ - [#2483](https://github.com/agda/agda/issues/2483): Files are sometimes truncated to a size of 201 bytes+ - [#2486](https://github.com/agda/agda/issues/2486): Imports via FOREIGN are not transitively inherited anymore+ - [#2488](https://github.com/agda/agda/issues/2488): Instance search inhibits holes for instance fields+ - [#2493](https://github.com/agda/agda/issues/2493): Regression: Agda seems to loop when expression is given+ - [#2494](https://github.com/agda/agda/issues/2494): Instance fields sometimes have incorrect goal types+ - [#2495](https://github.com/agda/agda/issues/2495): Regression: termination checker of Agda-2.5.3 seemingly loops where Agda-2.5.2 passes+ - [#2500](https://github.com/agda/agda/issues/2500): Adding fields to a record can cause Agda to reject previous definitions+ - [#2510](https://github.com/agda/agda/issues/2510): Wrong error with --no-pattern-matching+ - [#2517](https://github.com/agda/agda/issues/2517): "Not a variable error"+ - [#2518](https://github.com/agda/agda/issues/2518): CopatternReductions in TreeLess+ - [#2523](https://github.com/agda/agda/issues/2523): The documentation of `--without-K` is outdated+ - [#2529](https://github.com/agda/agda/issues/2529): Unable to install Agda on Windows.+ - [#2537](https://github.com/agda/agda/issues/2537): case splitting with 'with' creates {_} instead of replicating the arguments it found.+ - [#2538](https://github.com/agda/agda/issues/2538): Internal error when parsing as-pattern+ - [#2543](https://github.com/agda/agda/issues/2543): Case splitting with ellipsis produces spurious parentheses+ - [#2545](https://github.com/agda/agda/issues/2545): Race condition in api tests+ - [#2549](https://github.com/agda/agda/issues/2549): Rewrite rule for higher path constructor does not fire+ - [#2550](https://github.com/agda/agda/issues/2550): Internal error in Agda.TypeChecking.Substitute+ - [#2552](https://github.com/agda/agda/issues/2552): Let bindings in module telescopes crash Agda.Interaction.BasicOps+ - [#2553](https://github.com/agda/agda/issues/2553): Internal error in Agda.TypeChecking.CheckInternal+ - [#2554](https://github.com/agda/agda/issues/2554): More flexible size-assignment in successor style+ - [#2555](https://github.com/agda/agda/issues/2555): Why does the positivity checker care about non-recursive occurrences?+ - [#2558](https://github.com/agda/agda/issues/2558): Internal error in Warshall Solver+ - [#2560](https://github.com/agda/agda/issues/2560): Internal Error in Reduce.Fast+ - [#2564](https://github.com/agda/agda/issues/2564): Non-exact-split highlighting makes other highlighting disappear+ - [#2568](https://github.com/agda/agda/issues/2568): agda2-infer-type-maybe-toplevel (in hole) does not respect "single-solution" requirement of instance resolution+ - [#2571](https://github.com/agda/agda/issues/2571): Record pattern translation does not eta contract+ - [#2573](https://github.com/agda/agda/issues/2573): Rewrite rules fail depending on unrelated changes+ - [#2574](https://github.com/agda/agda/issues/2574): No link attached to module without toplevel name+ - [#2575](https://github.com/agda/agda/issues/2575): Internal error, related to caching+ - [#2577](https://github.com/agda/agda/issues/2577): deBruijn fail for higher order instance problem+ - [#2578](https://github.com/agda/agda/issues/2578): Catch-all clause face used incorrectly for parent with pattern+ - [#2579](https://github.com/agda/agda/issues/2579): Import statements with module instantiation should not trigger an error message+ - [#2580](https://github.com/agda/agda/issues/2580): Implicit absurd match is NonVariant, explicit not+ - [#2583](https://github.com/agda/agda/issues/2583): Wrong de Bruijn index introduced by absurd pattern+ - [#2584](https://github.com/agda/agda/issues/2584): Duplicate warning printing+ - [#2585](https://github.com/agda/agda/issues/2585): Definition by copatterns not modulo eta+ - [#2586](https://github.com/agda/agda/issues/2586): "λ where" with single absurd clause not parsed+ - [#2588](https://github.com/agda/agda/issues/2588): `agda --latex` produces invalid LaTeX when there are block comments+ - [#2592](https://github.com/agda/agda/issues/2592): Internal Error in Agda/TypeChecking/Serialise/Instances/Common.hs+ - [#2597](https://github.com/agda/agda/issues/2597): Inline record definitions confuse the reflection API+ - [#2602](https://github.com/agda/agda/issues/2602): Debug output messes up AgdaInfo buffer+ - [#2603](https://github.com/agda/agda/issues/2603): Internal error in MetaVars.hs+ - [#2604](https://github.com/agda/agda/issues/2604): Use QNames as anchors in generated HTML+ - [#2605](https://github.com/agda/agda/issues/2605): HTML backend generates anchors for whitespace+ - [#2606](https://github.com/agda/agda/issues/2606): Check that LHS of a rewrite rule doesn't reduce is too strict+ - [#2612](https://github.com/agda/agda/issues/2612): `exact-split` documentation is outdated and incomplete+ - [#2613](https://github.com/agda/agda/issues/2613): Parametrised modules, with-abstraction and termination+ - [#2620](https://github.com/agda/agda/issues/2620): Internal error in auto.+ - [#2621](https://github.com/agda/agda/issues/2621): Case splitting instantiates meta+ - [#2626](https://github.com/agda/agda/issues/2626): triggered internal error with sized types in MetaVars module+ - [#2629](https://github.com/agda/agda/issues/2629): Exact splitting should not complain about absurd clauses+ - [#2631](https://github.com/agda/agda/issues/2631): docs for auto aren't clear on how to use flags/options+ - [#2632](https://github.com/agda/agda/issues/2632): some flags to auto dont seem to work in current agda 2.5.2+ - [#2637](https://github.com/agda/agda/issues/2637): Internal error in Agda.TypeChecking.Pretty, possibly related to sized types+ - [#2639](https://github.com/agda/agda/issues/2639): Performance regression, possibly related to the size solver+ - [#2641](https://github.com/agda/agda/issues/2641): Required instance of FromNat when compiling imported files+ - [#2642](https://github.com/agda/agda/issues/2642): Records with duplicate fields+ - [#2644](https://github.com/agda/agda/issues/2644): Wrong substitution in expandRecordVar+ - [#2645](https://github.com/agda/agda/issues/2645): Agda accepts postulated fields in a record+ - [#2646](https://github.com/agda/agda/issues/2646): Only warn if fixities for undefined symbols are given+ - [#2649](https://github.com/agda/agda/issues/2649): Empty list of "previous definition" in duplicate definition error+ - [#2652](https://github.com/agda/agda/issues/2652): Added a new variant of the colon to the Agda input method+ - [#2653](https://github.com/agda/agda/issues/2653): agda-mode: "cannot refine" inside instance argument even though term to be refined typechecks there+ - [#2654](https://github.com/agda/agda/issues/2654): Internal error on result splitting without --postfix-projections+ - [#2664](https://github.com/agda/agda/issues/2664): Segmentation fault with compiled programs using mutual record+ - [#2665](https://github.com/agda/agda/issues/2665): Documentation: Record update syntax in wrong location+ - [#2666](https://github.com/agda/agda/issues/2666): Internal error at Agda/Syntax/Abstract/Name.hs:113+ - [#2667](https://github.com/agda/agda/issues/2667): Panic error on unbound variable.+ - [#2669](https://github.com/agda/agda/issues/2669): Interaction: incorrect field variable name generation+ - [#2671](https://github.com/agda/agda/issues/2671): Feature request: nullary pattern matching lambdas+ - [#2679](https://github.com/agda/agda/issues/2679): Internal error at "Typechecking/Abstract.hs:133" and "TypeChecking/Telescope.hs:68"+ - [#2682](https://github.com/agda/agda/issues/2682): What are the rules for projections of abstract records?+ - [#2684](https://github.com/agda/agda/issues/2684): Bad error message for abstract constructor+ - [#2686](https://github.com/agda/agda/issues/2686): Abstract constructors should be ignored when resolving overloading+ - [#2690](https://github.com/agda/agda/issues/2690): [regression?] Agda engages in deep search instead of immediately failing+ - [#2700](https://github.com/agda/agda/issues/2700): Add a command to check against goal type (and normalise)+ - [#2703](https://github.com/agda/agda/issues/2703): Regression: Internal error for underapplied indexed constructor+ - [#2705](https://github.com/agda/agda/issues/2705): The GHC backend might diverge in infinite file creation+ - [#2708](https://github.com/agda/agda/issues/2708): Why is the `name` field in .agda-lib files mandatory?+ - [#2710](https://github.com/agda/agda/issues/2710): Type checker hangs+ - [#2712](https://github.com/agda/agda/issues/2712): Compiler Pragma for headers+ - [#2714](https://github.com/agda/agda/issues/2714): Option --no-main should be allowed as file-local option+ - [#2717](https://github.com/agda/agda/issues/2717): internal error at DisplayForm.hs:197+ - [#2718](https://github.com/agda/agda/issues/2718): Interactive 'give' doesn't insert enough parenthesis+ - [#2721](https://github.com/agda/agda/issues/2721): Without-K doesn't prevent heterogeneous conflict between literals+ - [#2723](https://github.com/agda/agda/issues/2723): Unreachable clauses in definition by copattern matching trip clause compiler+ - [#2725](https://github.com/agda/agda/issues/2725): File names for generated HTML files+ - [#2726](https://github.com/agda/agda/issues/2726): Old regression related to with+ - [#2727](https://github.com/agda/agda/issues/2727): Internal errors related to rewrite+ - [#2729](https://github.com/agda/agda/issues/2729): Regression: case splitting uses variable name variants instead of the unused original names+ - [#2730](https://github.com/agda/agda/issues/2730): Command to give in spite of termination errors+ - [#2731](https://github.com/agda/agda/issues/2731): Agda fails to build with happy 1.19.6+ - [#2733](https://github.com/agda/agda/issues/2733): Avoid some uses of \AgdaIndent?+ - [#2734](https://github.com/agda/agda/issues/2734): Make height of empty lines configurable+ - [#2736](https://github.com/agda/agda/issues/2736): Segfault using Alex 3.2.2 and cpphs+ - [#2740](https://github.com/agda/agda/issues/2740): Indenting every line of code should be a no-op++ Release notes for Agda version 2.5.2 ==================================== @@ -723,6 +1547,15 @@ Returns `true` if the name refers to a macro, otherwise `false`. +* The `record-type` constructor now has an extra argument containing+ information about the record type's fields:+ ```agda+ data Definition : Set where+ …+ record-type : (c : Name) (fs : List (Arg Name)) → Definition+ …+ ```+ Type checking ------------- @@ -1030,10 +1863,12 @@ available: lowercase and uppercase. Some previous bindings had to be modified for consistency. The naming scheme is as follows: - * \bx for lowercase blackboard bold- * \bX for uppercase blackboard bold- * \bGx for lowercase greek blackboard bold (similar to \Gx for greeks)- * \bGX for uppercase greek blackboard bold (similar to \GX for uppercase greeks)+ * `\bx` for lowercase blackboard bold+ * `\bX` for uppercase blackboard bold+ * `\bGx` for lowercase greek blackboard bold (similar to `\Gx` for+ greeks)+ * `\bGX` for uppercase greek blackboard bold (similar to `\GX` for+ uppercase greeks) * Replaced binding for go back @@ -5324,8 +6159,6 @@ * Key bindings for controlling simplification/normalisation: - [TODO: Simplification should be explained somewhere.]- Commands like `Goal type and context` (`C-c C-,`) could previously be invoked in two ways. By default the output was normalised, but if a prefix argument was used (for instance via `C-u C-c C-,`), then no@@ -5339,9 +6172,6 @@ - If `C-u` is used twice (`C-u C-u C-c C-,`), then the result is normalised. - [TODO: As part of the release of Agda 2.3.4 the key binding page on- the wiki should be updated.]- ### LaTeX-backend * Two new color scheme options were added to `agda.sty`:@@ -8018,7 +8848,7 @@ aux : ℕ → List → List aux z zs = f (cons z zs)- ```+ ``` Here the termination checker compares `cons z zs` to `z` and also to `zs`. In both cases, the result will be "unrelated", no matter
LICENSE view
@@ -1,11 +1,22 @@-Copyright (c) 2005-2016 Ulf Norell, Andreas Abel, Nils Anders-Danielsson, Andrés Sicard-Ramírez, Dominique Devriese, Péter-Divianszki, Francesco Mazzoli, Stevan Andjelkovic, Daniel Gustafsson,-Alan Jeffrey, Makoto Takeyama, Andrea Vezzosi, Nicolas Pouillard,-James Chapman, Jean-Philippe Bernardy, Fredrik Lindblad, Nobuo-Yamashita, Fredrik Nordvall Forsberg, Patrik Jansson, Guilhem Moulin,-Stefan Monnier, Marcin Benke, Olle Fredriksson, Darin Morrison, Jesper-Cockx, Wolfram Kahl, Catarina Coquand+Copyright (c) 2005-2017 remains with the authors.+Agda 2 was originally written by Ulf Norell,+partially based on code from Agda 1 by Catarina Coquand and Makoto Takeyama,+and from Agdalight by Ulf Norell and Andreas Abel.++Agda 2 is currently actively developed mainly by Andreas Abel,+Guillaume Allais, Jesper Cockx, Nils Anders Danielsson, Philipp+Hausmann, Fredrik Nordvall Forsberg, Ulf Norell, Víctor López Juan,+Andrés Sicard-Ramírez, and Andrea Vezzosi.++Further, Agda 2 has received contributions by, amongst others, Stevan+Andjelkovic, Marcin Benke, Jean-Philippe Bernardy, Guillaume Brunerie,+James Chapman, Dominique Devriese, Péter Diviánszki, Olle Fredriksson,+Adam Gundry, Daniel Gustafsson, Kuen-Bang Hou (favonia), Patrik+Jansson, Alan Jeffrey, Wolfram Kahl, Pepijn Kokke, Fredrik Lindblad,+Francesco Mazzoli, Stefan Monnier, Darin Morrison, Guilhem Moulin,+Nicolas Pouillard, Nobuo Yamashita, Christian Sattler, and Makoto+Takeyama. The full list of contributors is available at+https://github.com/agda/agda/graphs/contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the
README.md view
@@ -3,7 +3,9 @@ [](http://hackage.haskell.org/package/Agda) [](https://www.stackage.org/package/Agda)-[](https://travis-ci.org/agda/agda)+[](https://travis-ci.org/agda/agda)+[](https://ci.appveyor.com/project/gallais/agda)+[](http://agda.readthedocs.io/en/stable-2.5/?badge=stable-2.5) Table of contents: @@ -25,7 +27,7 @@ Prerequisites ------------- -You need recent versions of the following programs/libraries:+You need recent versions of the following programs: * GHC: http://www.haskell.org/ghc/ * cabal-install: http://www.haskell.org/cabal/@@ -38,7 +40,7 @@ on your shell's search path. For instructions on installing a suitable version of Emacs under-Windows, see [below]((#installing-emacs-under-windows).+Windows, see [below](#installing-emacs-under-windows). Non-Windows users need to ensure that the development files for the C libraries zlib and ncurses are installed (see http://zlib.net and@@ -50,6 +52,14 @@ as root to get the correct files installed. +Optionally one can also install the [ICU](http://site.icu-project.org)+library, which is used to implement the `--count-clusters` flag. Under+Debian or Ubuntu it may suffice to install `libicu-dev`. Once the ICU+library is installed one can hopefully enable the `--count-clusters`+flag by giving the `-fenable-cluster-counting` flag to `cabal+install`. Note that `make install` by default enables+`-fenable-cluster-counting`.+ ### Note on GHC's CPP language extension Recent versions of Clang's preprocessor don't work well with Haskell.@@ -79,7 +89,7 @@ ### Using a released source package from Hackage -Install the prerequisites mentioned below, then run the following commands:+Install the prerequisites mentioned above, then run the following commands: cabal update cabal install Agda
− dist/build/Agda/Syntax/Parser/Lexer.hs
@@ -1,1079 +0,0 @@-{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-}-{-# LANGUAGE CPP,MagicHash #-}-{-# LINE 1 "src/full/Agda/Syntax/Parser/Lexer.x" #-}--{-# OPTIONS_GHC -fno-warn-deprecated-flags #-}-{-# OPTIONS_GHC -fno-warn-missing-signatures #-}-{-# OPTIONS_GHC -fno-warn-tabs #-}-{-# OPTIONS_GHC -fno-warn-unused-imports #-}--{-# LANGUAGE BangPatterns #-}--{-| The lexer is generated by Alex (<http://www.haskell.org/alex>) and is an- adaptation of GHC's lexer. The main lexing function 'lexer' is called by- the "Agda.Syntax.Parser.Parser" to get the next token from the input.--}-module Agda.Syntax.Parser.Lexer- ( -- * The main function- lexer- -- * Lex states- , normal, code- , layout, empty_layout, bol, imp_dir- -- * Alex generated functions- , AlexReturn(..), alexScanUser- ) where---- -- import Data.List--import Agda.Syntax.Parser.Alex-import Agda.Syntax.Parser.Comments-#ifndef __HADDOCK__-import {-# SOURCE #-} Agda.Syntax.Parser.Layout-import {-# SOURCE #-} Agda.Syntax.Parser.LexActions-#endif-import Agda.Syntax.Parser.Monad-import Agda.Syntax.Parser.StringLiterals-import Agda.Syntax.Parser.Tokens-import Agda.Syntax.Literal---#if __GLASGOW_HASKELL__ >= 603-#include "ghcconfig.h"-#elif defined(__GLASGOW_HASKELL__)-#include "config.h"-#endif-#if __GLASGOW_HASKELL__ >= 503-import Data.Array-import Data.Array.Base (unsafeAt)-#else-import Array-#endif-#if __GLASGOW_HASKELL__ >= 503-import GHC.Exts-#else-import GlaExts-#endif-alex_tab_size :: Int-alex_tab_size = 8-alex_base :: AlexAddr-alex_base = AlexA# "\xf7\xff\xff\xff\x6c\x00\x00\x00\xe1\x00\x00\x00\x55\x01\x00\x00\xca\x01\x00\x00\x3f\x02\x00\x00\xb5\x02\x00\x00\x73\x00\x00\x00\xd8\xff\xff\xff\x94\x03\x00\x00\xf2\x03\x00\x00\x50\x04\x00\x00\xb6\x02\x00\x00\xac\x04\x00\x00\x08\x05\x00\x00\x5d\x05\x00\x00\x5c\x05\x00\x00\xdc\x05\x00\x00\xbb\x06\x00\x00\xba\x06\x00\x00\x3a\x07\x00\x00\xba\x07\x00\x00\x99\x08\x00\x00\xf5\x08\x00\x00\xf4\x08\x00\x00\x00\x00\x00\x00\x65\x09\x00\x00\x00\x00\x00\x00\xd6\x09\x00\x00\x00\x00\x00\x00\x47\x0a\x00\x00\x00\x00\x00\x00\x88\x0a\x00\x00\x00\x00\x00\x00\xc9\x0a\x00\x00\x00\x00\x00\x00\x0a\x0b\x00\x00\xe9\x0b\x00\x00\x68\x0c\x00\x00\x28\x0c\x00\x00\x00\x00\x00\x00\x28\x0d\x00\x00\xe8\x0c\x00\x00\x00\x00\x00\x00\xe8\x0d\x00\x00\x5e\x0e\x00\x00\xc0\x0d\x00\x00\x00\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x0f\x00\x00\x4c\x10\x00\x00\x43\x11\x00\x00\x3a\x12\x00\x00\x31\x13\x00\x00\x28\x14\x00\x00\x1f\x15\x00\x00\x16\x16\x00\x00\x0d\x17\x00\x00\x04\x18\x00\x00\xfb\x18\x00\x00\xf2\x19\x00\x00\xe9\x1a\x00\x00\xe0\x1b\x00\x00\xd7\x1c\x00\x00\xce\x1d\x00\x00\xc5\x1e\x00\x00\xbc\x1f\x00\x00\xb3\x20\x00\x00\xaa\x21\x00\x00\xa1\x22\x00\x00\x98\x23\x00\x00\x8f\x24\x00\x00\x86\x25\x00\x00\x7d\x26\x00\x00\x74\x27\x00\x00\x6b\x28\x00\x00\x62\x29\x00\x00\x59\x2a\x00\x00\x50\x2b\x00\x00\x47\x2c\x00\x00\x3e\x2d\x00\x00\x35\x2e\x00\x00\x2c\x2f\x00\x00\x23\x30\x00\x00\x1a\x31\x00\x00\x11\x32\x00\x00\x08\x33\x00\x00\xff\x33\x00\x00\xf6\x34\x00\x00\xed\x35\x00\x00\xe4\x36\x00\x00\xdb\x37\x00\x00\xd2\x38\x00\x00\xc9\x39\x00\x00\xc0\x3a\x00\x00\xb7\x3b\x00\x00\xae\x3c\x00\x00\xa5\x3d\x00\x00\x9c\x3e\x00\x00\x93\x3f\x00\x00\x8a\x40\x00\x00\x81\x41\x00\x00\x78\x42\x00\x00\x6f\x43\x00\x00\x66\x44\x00\x00\x5d\x45\x00\x00\x54\x46\x00\x00\x4b\x47\x00\x00\x42\x48\x00\x00\x39\x49\x00\x00\x30\x4a\x00\x00\x27\x4b\x00\x00\x1e\x4c\x00\x00\x15\x4d\x00\x00\x0c\x4e\x00\x00\x03\x4f\x00\x00\xfa\x4f\x00\x00\xf1\x50\x00\x00\xe8\x51\x00\x00\xdf\x52\x00\x00\xd6\x53\x00\x00\xcd\x54\x00\x00\xc4\x55\x00\x00\xbb\x56\x00\x00\xb2\x57\x00\x00\xa9\x58\x00\x00\xa0\x59\x00\x00\x97\x5a\x00\x00\x8e\x5b\x00\x00\x85\x5c\x00\x00\x7c\x5d\x00\x00\x73\x5e\x00\x00\x6a\x5f\x00\x00\x61\x60\x00\x00\x58\x61\x00\x00\x4f\x62\x00\x00\x46\x63\x00\x00\x3d\x64\x00\x00\x34\x65\x00\x00\x2b\x66\x00\x00\x22\x67\x00\x00\x19\x68\x00\x00\x10\x69\x00\x00\x07\x6a\x00\x00\xfe\x6a\x00\x00\xf5\x6b\x00\x00\xec\x6c\x00\x00\xe3\x6d\x00\x00\xda\x6e\x00\x00\xd1\x6f\x00\x00\xc8\x70\x00\x00\xbf\x71\x00\x00\xb6\x72\x00\x00\xad\x73\x00\x00\xa4\x74\x00\x00\x9b\x75\x00\x00\x92\x76\x00\x00\x89\x77\x00\x00\x80\x78\x00\x00\x77\x79\x00\x00\x6e\x7a\x00\x00\x65\x7b\x00\x00\x5c\x7c\x00\x00\x53\x7d\x00\x00\x4a\x7e\x00\x00\x41\x7f\x00\x00\x38\x80\x00\x00\x2f\x81\x00\x00\x26\x82\x00\x00\x1d\x83\x00\x00\x14\x84\x00\x00\x0b\x85\x00\x00\x02\x86\x00\x00\xf9\x86\x00\x00\xf0\x87\x00\x00\xe7\x88\x00\x00\xde\x89\x00\x00\xd5\x8a\x00\x00\xcc\x8b\x00\x00\xc3\x8c\x00\x00\xba\x8d\x00\x00\xb1\x8e\x00\x00\xa8\x8f\x00\x00\x9f\x90\x00\x00\x96\x91\x00\x00\x8d\x92\x00\x00\x84\x93\x00\x00\x7b\x94\x00\x00\x72\x95\x00\x00\x69\x96\x00\x00\x60\x97\x00\x00\x57\x98\x00\x00\x4e\x99\x00\x00\x45\x9a\x00\x00\x3c\x9b\x00\x00\x33\x9c\x00\x00\x2a\x9d\x00\x00\x21\x9e\x00\x00\x18\x9f\x00\x00\x0f\xa0\x00\x00\x06\xa1\x00\x00\xfd\xa1\x00\x00\xf4\xa2\x00\x00\xeb\xa3\x00\x00\xe2\xa4\x00\x00\xd9\xa5\x00\x00\xd0\xa6\x00\x00\xc7\xa7\x00\x00\xbe\xa8\x00\x00\xb5\xa9\x00\x00\xac\xaa\x00\x00\xa3\xab\x00\x00\x9a\xac\x00\x00\x91\xad\x00\x00\x88\xae\x00\x00\x7f\xaf\x00\x00\x76\xb0\x00\x00\x6d\xb1\x00\x00\x64\xb2\x00\x00\x5b\xb3\x00\x00\x52\xb4\x00\x00\x49\xb5\x00\x00\x40\xb6\x00\x00\x37\xb7\x00\x00\x2e\xb8\x00\x00\x25\xb9\x00\x00\x1c\xba\x00\x00\x13\xbb\x00\x00\x0a\xbc\x00\x00\x01\xbd\x00\x00\xf8\xbd\x00\x00\xef\xbe\x00\x00\xe6\xbf\x00\x00\xdd\xc0\x00\x00\xd4\xc1\x00\x00\xcb\xc2\x00\x00\xc2\xc3\x00\x00\xb9\xc4\x00\x00\xb0\xc5\x00\x00\xa7\xc6\x00\x00\x9e\xc7\x00\x00\x95\xc8\x00\x00\x8c\xc9\x00\x00\x83\xca\x00\x00\x7a\xcb\x00\x00\x71\xcc\x00\x00\x68\xcd\x00\x00\x5f\xce\x00\x00\x56\xcf\x00\x00\x4d\xd0\x00\x00\xe3\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\xd1\x00\x00\x43\xd2\x00\x00\x43\xd3\x00\x00\x39\xd4\x00\x00\x39\xd5\x00\x00\x2f\xd6\x00\x00\x2f\xd7\x00\x00\x2f\xd8\x00\x00\x2f\xd9\x00\x00\x2f\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x0f\x00\x00\x43\x10\x00\x00\x3a\x11\x00\x00\x31\x12\x00\x00\x16\x15\x00\x00\x0d\x16\x00\x00\x04\x17\x00\x00\xfb\x17\x00\x00\xf2\x18\x00\x00\xe9\x19\x00\x00\xe0\x1a\x00\x00\xd7\x1b\x00\x00\xce\x1c\x00\x00\xbc\x1e\x00\x00\xb3\x1f\x00\x00\xaa\x20\x00\x00\xa1\x21\x00\x00\x98\x22\x00\x00\x8f\x23\x00\x00\x86\x24\x00\x00\x7d\x25\x00\x00\x74\x26\x00\x00\x6b\x27\x00\x00\x62\x28\x00\x00\x59\x29\x00\x00\x50\x2a\x00\x00\x51\x2b\x00\x00\x3e\x2c\x00\x00\x3f\x2d\x00\x00\x2d\x2f\x00\x00\x55\x46\x00\x00\x31\x4a\x00\x00\x16\x4d\x00\x00\x59\x61\x00\x00\x11\x69\x00\x00\xf6\x6b\x00\x00\xed\x6c\x00\x00\xdb\x6e\x00\x00\xb7\x72\x00\x00\x54\x7d\x00\x00\xfa\x86\x00\x00\x9f\x8f\x00\x00\x2d\xd1\x00\x00\x23\xd4\x00\x00\x0e\xdb\x00\x00\x6a\xdb\x00\x00\xc6\xdb\x00\x00\x22\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\xff\xff\xda\xff\xff\xff\x00\x00\x00\x00\x7e\xdc\x00\x00\xda\xdc\x00\x00\x73\x41\x00\x00\x36\xdd\x00\x00\x92\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xff\xff\xff\x00\x00\x00\x00\xee\xdd\x00\x00\x23\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xde\x00\x00\xa6\xde\x00\x00\x02\xdf\x00\x00\x5e\xdf\x00\x00\xba\xdf\x00\x00\x16\xe0\x00\x00\x72\xe0\x00\x00\xce\xe0\x00\x00\x2a\xe1\x00\x00\x86\xe1\x00\x00\xe2\xe1\x00\x00\x3e\xe2\x00\x00\x9a\xe2\x00\x00\xf6\xe2\x00\x00\x52\xe3\x00\x00\xae\xe3\x00\x00\x0a\xe4\x00\x00\x66\xe4\x00\x00\xc2\xe4\x00\x00\x1e\xe5\x00\x00\x7c\xe5\x00\x00\xda\xe5\x00\x00\x38\xe6\x00\x00\x96\xe6\x00\x00\xf4\xe6\x00\x00\x52\xe7\x00\x00\xb0\xe7\x00\x00\x0c\xe8\x00\x00\x68\xe8\x00\x00\xc4\xe8\x00\x00\x20\xe9\x00\x00\x7c\xe9\x00\x00\xd8\xe9\x00\x00\x34\xea\x00\x00\x90\xea\x00\x00\xec\xea\x00\x00\x48\xeb\x00\x00\xa4\xeb\x00\x00\x00\xec\x00\x00\x5c\xec\x00\x00\xb8\xec\x00\x00\x14\xed\x00\x00\x70\xed\x00\x00\xcc\xed\x00\x00\x28\xee\x00\x00\x84\xee\x00\x00\xe0\xee\x00\x00\x3c\xef\x00\x00\x98\xef\x00\x00\xf4\xef\x00\x00\x50\xf0\x00\x00\xac\xf0\x00\x00\x08\xf1\x00\x00\x64\xf1\x00\x00\xc0\xf1\x00\x00\x1c\xf2\x00\x00\x78\xf2\x00\x00\xd4\xf2\x00\x00\x30\xf3\x00\x00\x8c\xf3\x00\x00\xe8\xf3\x00\x00\x44\xf4\x00\x00\xa0\xf4\x00\x00\xfc\xf4\x00\x00\x58\xf5\x00\x00\xb4\xf5\x00\x00\x10\xf6\x00\x00\x6c\xf6\x00\x00\xc8\xf6\x00\x00\x24\xf7\x00\x00\x80\xf7\x00\x00\xdc\xf7\x00\x00\x38\xf8\x00\x00\x94\xf8\x00\x00\xf0\xf8\x00\x00\x4c\xf9\x00\x00\xa8\xf9\x00\x00\x04\xfa\x00\x00\x60\xfa\x00\x00\xbc\xfa\x00\x00\x18\xfb\x00\x00\x74\xfb\x00\x00\xd0\xfb\x00\x00\x2c\xfc\x00\x00\x88\xfc\x00\x00\xe4\xfc\x00\x00\x40\xfd\x00\x00\x9c\xfd\x00\x00\xf8\xfd\x00\x00\x54\xfe\x00\x00\xb0\xfe\x00\x00\x0c\xff\x00\x00\x68\xff\x00\x00\xc4\xff\x00\x00\x20\x00\x01\x00\x7c\x00\x01\x00\xd8\x00\x01\x00\x34\x01\x01\x00\x90\x01\x01\x00\xec\x01\x01\x00\x48\x02\x01\x00\xa4\x02\x01\x00\x00\x03\x01\x00\x5c\x03\x01\x00\xb8\x03\x01\x00\x14\x04\x01\x00\x70\x04\x01\x00\xcc\x04\x01\x00\x28\x05\x01\x00\x84\x05\x01\x00\xe0\x05\x01\x00\x3c\x06\x01\x00\x98\x06\x01\x00\xf4\x06\x01\x00\x50\x07\x01\x00\xac\x07\x01\x00\x08\x08\x01\x00\x64\x08\x01\x00\xc0\x08\x01\x00\x1c\x09\x01\x00\x78\x09\x01\x00\xd4\x09\x01\x00\x30\x0a\x01\x00\x8c\x0a\x01\x00\xe8\x0a\x01\x00\x44\x0b\x01\x00\xa0\x0b\x01\x00\xfc\x0b\x01\x00\x58\x0c\x01\x00\xb4\x0c\x01\x00\x10\x0d\x01\x00\x6c\x0d\x01\x00\xc8\x0d\x01\x00\x24\x0e\x01\x00\x80\x0e\x01\x00\xdc\x0e\x01\x00\x38\x0f\x01\x00\x94\x0f\x01\x00\xf0\x0f\x01\x00\x4c\x10\x01\x00\xa8\x10\x01\x00\x04\x11\x01\x00\x60\x11\x01\x00\xbc\x11\x01\x00\x18\x12\x01\x00\x74\x12\x01\x00\xd0\x12\x01\x00\x2c\x13\x01\x00\x88\x13\x01\x00\xe4\x13\x01\x00\x40\x14\x01\x00\x9c\x14\x01\x00\xf8\x14\x01\x00\x54\x15\x01\x00\xb0\x15\x01\x00\x0c\x16\x01\x00\x68\x16\x01\x00\xc4\x16\x01\x00\x20\x17\x01\x00\x7c\x17\x01\x00\xd8\x17\x01\x00\x34\x18\x01\x00\x90\x18\x01\x00\xec\x18\x01\x00\x48\x19\x01\x00\xa4\x19\x01\x00\x00\x1a\x01\x00\x5c\x1a\x01\x00\xb8\x1a\x01\x00\x14\x1b\x01\x00\x70\x1b\x01\x00\xcc\x1b\x01\x00\x28\x1c\x01\x00\x84\x1c\x01\x00\xe0\x1c\x01\x00\x3c\x1d\x01\x00\x98\x1d\x01\x00\xf4\x1d\x01\x00\x50\x1e\x01\x00\xac\x1e\x01\x00\x08\x1f\x01\x00\x64\x1f\x01\x00\xc0\x1f\x01\x00\x1c\x20\x01\x00\x78\x20\x01\x00\xd4\x20\x01\x00\x30\x21\x01\x00\x8c\x21\x01\x00\xe8\x21\x01\x00\x44\x22\x01\x00\xa0\x22\x01\x00\xfc\x22\x01\x00\x58\x23\x01\x00\xb4\x23\x01\x00\x10\x24\x01\x00\x6c\x24\x01\x00\xc8\x24\x01\x00\x24\x25\x01\x00\x80\x25\x01\x00\xdc\x25\x01\x00\x38\x26\x01\x00\x94\x26\x01\x00\xf0\x26\x01\x00\x4c\x27\x01\x00\xa8\x27\x01\x00\x04\x28\x01\x00\x60\x28\x01\x00\xbc\x28\x01\x00\x18\x29\x01\x00\x74\x29\x01\x00\xd0\x29\x01\x00\x2c\x2a\x01\x00\x88\x2a\x01\x00\xe4\x2a\x01\x00\x40\x2b\x01\x00\x9c\x2b\x01\x00\xf8\x2b\x01\x00\x54\x2c\x01\x00\xb0\x2c\x01\x00\x0c\x2d\x01\x00\x68\x2d\x01\x00\xc4\x2d\x01\x00\x20\x2e\x01\x00\x7c\x2e\x01\x00\xd8\x2e\x01\x00\x34\x2f\x01\x00\x90\x2f\x01\x00\xec\x2f\x01\x00\x48\x30\x01\x00\xa4\x30\x01\x00\x00\x31\x01\x00\x5c\x31\x01\x00"#--alex_table :: AlexAddr-alex_table = AlexA# "\x00\x00\x0b\x01\x30\x00\x30\x00\x30\x00\xfe\x00\x33\x00\x3f\x01\x40\x01\x48\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\x30\x00\xdb\x01\x53\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x52\x01\x4a\x01\x4b\x01\xdb\x01\xdb\x01\xdb\x01\x68\x01\x41\x01\xdb\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x43\x01\x42\x01\xdb\x01\x44\x01\xdb\x01\x46\x01\x4e\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x8d\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x4d\x01\xdb\x01\xdb\x01\x45\x01\xdb\x01\xdf\x01\xdb\x01\xbc\x01\x9b\x01\xdd\x01\xb0\x01\xdb\x01\xc8\x01\x3a\x02\xdb\x01\xdb\x01\x85\x01\xb4\x01\xda\x01\x02\x02\xca\x01\xb5\x01\xbd\x01\xc7\x01\xc6\x01\xb8\x01\xdb\x01\x95\x01\xdb\x01\xdb\x01\xdb\x01\x50\x01\x47\x01\x51\x01\xdb\x01\x0c\x01\x30\x00\x30\x00\x30\x00\x00\x00\x00\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x30\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x31\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x09\x00\x30\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x16\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x08\x00\x12\x00\x00\x00\x12\x00\x0b\x01\x30\x00\x30\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\xdb\x01\x53\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x52\x01\x4a\x01\x4b\x01\xdb\x01\xdb\x01\xdb\x01\x68\x01\x41\x01\xdb\x01\x5a\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x43\x01\x42\x01\xdb\x01\x44\x01\xdb\x01\x46\x01\x4e\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x8d\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x4d\x01\xdb\x01\xdb\x01\x45\x01\xdb\x01\xdf\x01\xdb\x01\xbc\x01\x9b\x01\xdd\x01\xb0\x01\xdb\x01\xc8\x01\x3a\x02\xdb\x01\xdb\x01\x85\x01\xb4\x01\xda\x01\x02\x02\xca\x01\xb5\x01\xbd\x01\xc7\x01\xc6\x01\xb8\x01\xdb\x01\x95\x01\xdb\x01\xdb\x01\xdb\x01\x50\x01\x47\x01\x51\x01\xdb\x01\x30\x00\x30\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x09\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x16\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x08\x00\x12\x00\x00\x00\x12\x00\x0b\x01\x30\x00\x30\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x67\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x0c\x00\xdb\x01\xdb\x01\x0b\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x83\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x08\x00\xdb\x01\x00\x00\xdb\x01\x0d\x01\x30\x00\x30\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x09\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x16\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x08\x00\x12\x00\x00\x00\x12\x00\xff\xff\x32\x00\x32\x00\x32\x00\x32\x00\x3e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x00\x00\x00\xdb\x01\x69\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x98\x00\xa1\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x8f\x00\x00\x00\x00\x00\x7b\x00\x9d\x00\xb6\x00\xca\x00\xa4\x00\x00\x00\xa0\x00\xcd\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\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\x00\x00\x00\x68\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x02\x01\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\xff\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x00\x01\x12\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x1d\x02\xdb\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\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\x00\x00\x00\x00\x00\x00\x00\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0e\x00\x1d\x02\x1d\x02\x0d\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x00\x00\x1d\x02\x2c\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x00\x00\x12\x00\x26\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x10\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x12\x00\x12\x00\x12\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x12\x00\x13\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x24\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x65\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0e\x00\x1d\x02\x1d\x02\x0d\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x00\x00\x1d\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2e\x00\x10\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x24\x00\x14\x00\x1d\x00\x1d\x00\x1d\x00\x1e\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xcb\x01\xdb\x01\x88\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xe6\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xff\xff\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\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\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x22\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x23\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x34\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x2e\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x39\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x3b\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xff\xff\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x51\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x5a\x00\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xf6\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\x2d\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xf3\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x2d\x02\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdd\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x87\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xd3\x00\xdb\x01\xdb\x01\xd0\x01\xdb\x01\xdb\x01\xdb\x01\xa7\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xaa\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xd2\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xd0\x00\xdb\x01\xdb\x01\xdb\x01\x8f\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x8d\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xc7\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xc0\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xff\xff\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\x01\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x11\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x15\x00\x1b\x00\x1b\x00\x1b\x00\x1c\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\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\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\x26\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x27\x00\x13\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x18\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\x02\x01\x04\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\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x01\x00\x00\x01\x01\x00\x00\x04\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x27\x00\x13\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x18\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\x02\x01\x04\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\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x01\x00\x00\x04\x01\x00\x00\x04\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x27\x00\x13\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x18\x00\x19\x00\x19\x00\x19\x00\x1a\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\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\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\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\x26\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x27\x00\x13\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x18\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\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\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x07\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x04\x01\x00\x00\x04\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x27\x00\x13\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x18\x00\x19\x00\x19\x00\x19\x00\x1a\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x0a\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x00\x00\x0a\x01\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\x26\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x27\x00\x13\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x18\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\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\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x01\x00\x00\x04\x01\x00\x00\x04\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x27\x00\x13\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x18\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\x08\x01\x05\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\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x01\x00\x00\x01\x01\x00\x00\x04\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x27\x00\x13\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x18\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\x08\x01\x05\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\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x01\x00\x00\x04\x01\x00\x00\x04\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x27\x00\x13\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x18\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\xff\xff\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x05\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\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x01\x00\x00\x04\x01\x00\x00\x04\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x27\x00\x13\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x18\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x49\x01\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\x22\x02\xdb\x01\x6d\x01\x25\x00\xdb\x01\x57\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x55\x01\x55\x01\x55\x01\x55\x01\x54\x01\x55\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x55\x01\x55\x01\x55\x01\x55\x01\x54\x01\x55\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x25\x00\xdb\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x55\x01\x55\x01\x55\x01\x55\x01\x54\x01\x55\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x55\x01\x55\x01\x55\x01\x55\x01\x54\x01\x55\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x25\x00\xdb\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x25\x00\xdb\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x55\x01\x55\x01\x55\x01\x55\x01\x54\x01\x55\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x55\x01\x55\x01\x55\x01\x55\x01\x54\x01\x55\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x1e\x02\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x25\x00\xdb\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x21\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x21\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x25\x00\xdb\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x25\x00\xdb\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x21\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x21\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x25\x02\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x25\x00\xdb\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x26\x02\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x1d\x02\xdb\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x24\x02\x1d\x02\x24\x02\x0f\x00\x1d\x02\x60\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5d\x01\x5e\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5d\x01\x5e\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0f\x00\x1d\x02\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5d\x01\x5e\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5d\x01\x5e\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0f\x00\x1d\x02\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0f\x00\x1d\x02\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5d\x01\x5e\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5d\x01\x5e\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1f\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\xdb\x01\x1d\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x1e\x02\xdb\x01\xdb\x01\x00\x00\xdb\x01\x1d\x02\xdb\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0f\x00\x1d\x02\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x23\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x23\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0f\x00\x1d\x02\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0f\x00\x1d\x02\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x63\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x23\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x23\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x20\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0f\x00\x1d\x02\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1f\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\xdb\x01\x1d\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x08\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xff\x00\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x08\x01\x0f\x00\xdb\x01\x5b\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\x59\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\x4c\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xff\x00\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xd2\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xd3\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdc\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x62\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x10\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x13\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x14\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x15\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x18\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x19\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x1a\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x1d\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x1e\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x1f\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x20\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x26\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x27\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x29\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x31\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x32\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x33\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x36\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x39\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x3a\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x3b\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x3c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x3d\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x3b\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x37\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x34\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x33\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x32\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x31\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x7a\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x30\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x2f\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x2c\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x29\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x7f\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x28\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x84\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x1c\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x1b\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x93\x01\x1a\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x19\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x18\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x17\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x16\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x15\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x14\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x13\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x12\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x11\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x10\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x0f\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x0e\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x89\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x8a\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x0d\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x0c\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x0b\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x8e\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x0a\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x09\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x08\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x07\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x06\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x05\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x04\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x03\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x94\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xed\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x9d\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xc9\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xfb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x01\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xa5\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xf7\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xf1\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xa9\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xab\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xfe\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xc5\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xad\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xaf\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xfa\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xf9\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xf6\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xb1\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xb2\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xf5\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xf4\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xf3\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xf2\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xef\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xee\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xb6\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xb7\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xeb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xe9\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xb9\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xe4\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xd1\x01\xdb\x01\xdb\x01\xc3\x01\xdb\x01\xdb\x01\xe8\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xbf\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xc0\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xc1\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xc2\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xe7\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xe5\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xe3\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xcd\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xce\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xe1\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x69\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6a\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xd5\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xd6\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6b\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xd9\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xd8\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xd7\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xe0\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xcf\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xcc\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xe2\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xbe\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xba\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xea\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xec\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xb3\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xf0\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xfc\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xae\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xac\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xfd\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xa8\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xa6\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xff\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xbb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xa4\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xa3\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xa2\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xa1\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xa0\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x9f\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x9e\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x9c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xde\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xd4\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x9a\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x99\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x98\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x97\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x96\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x92\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x91\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x90\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x8c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x8b\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x87\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x86\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xc4\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x82\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x81\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x80\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x27\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x7e\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x7d\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x7c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x2b\x02\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x2e\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x7b\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x79\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x78\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x77\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x76\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x75\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x35\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x74\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x73\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x72\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x36\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x71\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x70\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x6f\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x38\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x39\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x6e\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x1d\x02\xdb\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0f\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\xdb\x01\x1d\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x1d\x02\xdb\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0f\x00\x1d\x02\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x5f\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0f\x00\x1d\x02\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x5e\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\xdb\x01\x1d\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\x22\x02\xdb\x01\x6d\x01\x0f\x00\xdb\x01\x62\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x62\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\x61\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x1d\x02\xdb\x01\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x24\x02\x1d\x02\x24\x02\x0f\x00\x1d\x02\x66\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x0f\x00\x1d\x02\x66\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x64\x01\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x1d\x02\x00\x00\x1d\x02\xdb\x01\x1d\x02\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\x55\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\x56\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x38\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x37\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x2a\x02\xdb\x01\xdb\x01\x35\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x34\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x30\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x2f\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x2b\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x2a\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x28\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x25\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x24\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x21\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x1c\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x1b\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x17\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x16\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x12\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x11\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xf8\x01\x0f\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\x00\x00\xdb\x01\xdb\x01\xdb\x01\x6c\x01\x0f\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x0e\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\xdb\x01\x00\x00\xdb\x01\x00\x00\xdb\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--alex_check :: AlexAddr-alex_check = AlexA# "\xff\xff\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x23\x00\x2e\x00\x2e\x00\x7c\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\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\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x20\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7e\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\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7e\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7e\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x21\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x21\x00\x23\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\xff\xff\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\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\x7b\x00\xff\xff\x7c\x00\xff\xff\x7e\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x7d\x00\x7e\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x7d\x00\x7e\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\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\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x7c\x00\xff\xff\x7e\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\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\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\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\x7c\x00\xff\xff\x7e\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\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\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\x21\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\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\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\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\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\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\x23\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x59\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x59\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x20\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\x2d\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4f\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x59\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4f\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4f\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x57\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\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\x4f\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x59\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4f\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4f\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4f\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4f\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x52\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\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\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\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x56\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x52\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x52\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x52\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x52\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x52\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x48\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x48\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x44\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x48\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x42\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x52\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x48\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x52\x00\x53\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x48\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\x00\x55\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x52\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x48\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x44\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\x2d\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\x2d\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\x5c\x00\xff\xff\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\xff\xff\x7d\x00\xff\xff\x7f\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\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\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\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\x7c\x00\xff\xff\x7e\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\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\x2d\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\x2d\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x7d\x00\x7e\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x7d\x00\x7e\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x7d\x00\x7e\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x7d\x00\x7e\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x7d\x00\x7e\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x7d\x00\x7e\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x7d\x00\x7e\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\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\xff\xff\x7c\x00\xff\xff\x7e\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"#--alex_deflt :: AlexAddr-alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb9\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\x1f\x00\x1f\x00\x21\x00\x21\x00\x23\x00\x23\x00\x28\x00\x28\x00\x2b\x00\x2b\x00\x2f\x00\x2f\x00\xff\xff\x04\x01\x04\x01\x04\x01\xb9\x00\xb9\x00\xb9\x00\x31\x00\x31\x00\x31\x00\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xff\xff\xff\xff\xff\xff\xff\xff\x04\x01\x03\x01\x03\x01\x04\x01\x0a\x01\x04\x01\x0a\x01\x09\x01\x09\x01\x0a\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--alex_accept = listArray (0::Int,571) [AlexAccNone,AlexAccPred 524 ( not' eof )(AlexAccNone),AlexAccNone,AlexAcc 523,AlexAccNone,AlexAcc 522,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAcc 521,AlexAcc 520,AlexAcc 519,AlexAcc 518,AlexAcc 517,AlexAcc 516,AlexAcc 515,AlexAcc 514,AlexAcc 513,AlexAcc 512,AlexAcc 511,AlexAcc 510,AlexAcc 509,AlexAcc 508,AlexAcc 507,AlexAcc 506,AlexAcc 505,AlexAcc 504,AlexAcc 503,AlexAcc 502,AlexAcc 501,AlexAcc 500,AlexAcc 499,AlexAcc 498,AlexAcc 497,AlexAcc 496,AlexAcc 495,AlexAcc 494,AlexAcc 493,AlexAcc 492,AlexAcc 491,AlexAcc 490,AlexAcc 489,AlexAcc 488,AlexAcc 487,AlexAcc 486,AlexAcc 485,AlexAcc 484,AlexAcc 483,AlexAcc 482,AlexAcc 481,AlexAcc 480,AlexAcc 479,AlexAcc 478,AlexAcc 477,AlexAcc 476,AlexAcc 475,AlexAcc 474,AlexAcc 473,AlexAcc 472,AlexAcc 471,AlexAcc 470,AlexAcc 469,AlexAcc 468,AlexAcc 467,AlexAcc 466,AlexAcc 465,AlexAcc 464,AlexAcc 463,AlexAcc 462,AlexAcc 461,AlexAcc 460,AlexAcc 459,AlexAcc 458,AlexAcc 457,AlexAcc 456,AlexAcc 455,AlexAcc 454,AlexAcc 453,AlexAcc 452,AlexAcc 451,AlexAcc 450,AlexAcc 449,AlexAcc 448,AlexAcc 447,AlexAcc 446,AlexAcc 445,AlexAcc 444,AlexAcc 443,AlexAcc 442,AlexAcc 441,AlexAcc 440,AlexAcc 439,AlexAcc 438,AlexAcc 437,AlexAcc 436,AlexAcc 435,AlexAcc 434,AlexAcc 433,AlexAcc 432,AlexAcc 431,AlexAcc 430,AlexAcc 429,AlexAcc 428,AlexAcc 427,AlexAcc 426,AlexAcc 425,AlexAcc 424,AlexAcc 423,AlexAcc 422,AlexAcc 421,AlexAcc 420,AlexAcc 419,AlexAcc 418,AlexAcc 417,AlexAcc 416,AlexAcc 415,AlexAcc 414,AlexAcc 413,AlexAcc 412,AlexAcc 411,AlexAcc 410,AlexAcc 409,AlexAcc 408,AlexAcc 407,AlexAcc 406,AlexAcc 405,AlexAcc 404,AlexAcc 403,AlexAcc 402,AlexAcc 401,AlexAcc 400,AlexAcc 399,AlexAcc 398,AlexAcc 397,AlexAcc 396,AlexAcc 395,AlexAcc 394,AlexAcc 393,AlexAcc 392,AlexAcc 391,AlexAcc 390,AlexAcc 389,AlexAcc 388,AlexAcc 387,AlexAcc 386,AlexAcc 385,AlexAcc 384,AlexAcc 383,AlexAcc 382,AlexAcc 381,AlexAcc 380,AlexAcc 379,AlexAcc 378,AlexAcc 377,AlexAcc 376,AlexAcc 375,AlexAcc 374,AlexAcc 373,AlexAcc 372,AlexAcc 371,AlexAcc 370,AlexAcc 369,AlexAcc 368,AlexAcc 367,AlexAcc 366,AlexAcc 365,AlexAcc 364,AlexAcc 363,AlexAcc 362,AlexAcc 361,AlexAcc 360,AlexAcc 359,AlexAcc 358,AlexAcc 357,AlexAcc 356,AlexAcc 355,AlexAcc 354,AlexAcc 353,AlexAcc 352,AlexAcc 351,AlexAcc 350,AlexAcc 349,AlexAcc 348,AlexAcc 347,AlexAcc 346,AlexAcc 345,AlexAcc 344,AlexAcc 343,AlexAcc 342,AlexAcc 341,AlexAcc 340,AlexAcc 339,AlexAcc 338,AlexAcc 337,AlexAcc 336,AlexAcc 335,AlexAcc 334,AlexAcc 333,AlexAcc 332,AlexAcc 331,AlexAcc 330,AlexAcc 329,AlexAcc 328,AlexAcc 327,AlexAcc 326,AlexAcc 325,AlexAcc 324,AlexAcc 323,AlexAcc 322,AlexAcc 321,AlexAcc 320,AlexAccPred 319 ( not' (followedBy '#') )(AlexAccNone),AlexAccPred 318 ( not' (followedBy '#') )(AlexAccNone),AlexAcc 317,AlexAcc 316,AlexAcc 315,AlexAccPred 314 ( keepComments .&&. (followedBy '\n' .||. eof) )(AlexAccSkipPred ( followedBy '\n' .||. eof )(AlexAccNone)),AlexAccPred 313 ( keepComments .&&. (followedBy '\n' .||. eof) )(AlexAccSkipPred ( followedBy '\n' .||. eof )(AlexAccNone)),AlexAccPred 312 ( keepComments .&&. (followedBy '\n' .||. eof) )(AlexAccSkipPred ( followedBy '\n' .||. eof )(AlexAccNone)),AlexAccPred 311 ( keepComments .&&. (followedBy '\n' .||. eof) )(AlexAccSkipPred ( followedBy '\n' .||. eof )(AlexAccNone)),AlexAccPred 310 ( keepComments .&&. (followedBy '\n' .||. eof) )(AlexAccSkipPred ( followedBy '\n' .||. eof )(AlexAccNone)),AlexAccPred 309 ( keepComments .&&. (followedBy '\n' .||. eof) )(AlexAccSkipPred ( followedBy '\n' .||. eof )(AlexAccNone)),AlexAccPred 308 ( keepComments .&&. (followedBy '\n' .||. eof) )(AlexAccSkipPred ( followedBy '\n' .||. eof )(AlexAcc 307)),AlexAccPred 306 ( keepComments .&&. (followedBy '\n' .||. eof) )(AlexAccSkipPred ( followedBy '\n' .||. eof )(AlexAcc 305)),AlexAccPred 304 ( keepComments .&&. (followedBy '\n' .||. eof) )(AlexAccSkipPred ( followedBy '\n' .||. eof )(AlexAcc 303)),AlexAcc 302,AlexAccSkip,AlexAccSkip,AlexAcc 301,AlexAcc 300,AlexAcc 299,AlexAcc 298,AlexAcc 297,AlexAcc 296,AlexAcc 295,AlexAcc 294,AlexAcc 293,AlexAcc 292,AlexAcc 291,AlexAcc 290,AlexAcc 289,AlexAcc 288,AlexAcc 287,AlexAcc 286,AlexAcc 285,AlexAcc 284,AlexAcc 283,AlexAcc 282,AlexAcc 281,AlexAcc 280,AlexAcc 279,AlexAcc 278,AlexAcc 277,AlexAcc 276,AlexAcc 275,AlexAcc 274,AlexAcc 273,AlexAcc 272,AlexAcc 271,AlexAcc 270,AlexAcc 269,AlexAcc 268,AlexAcc 267,AlexAcc 266,AlexAcc 265,AlexAcc 264,AlexAcc 263,AlexAcc 262,AlexAcc 261,AlexAcc 260,AlexAcc 259,AlexAcc 258,AlexAcc 257,AlexAcc 256,AlexAcc 255,AlexAcc 254,AlexAcc 253,AlexAcc 252,AlexAcc 251,AlexAcc 250,AlexAcc 249,AlexAcc 248,AlexAcc 247,AlexAcc 246,AlexAcc 245,AlexAcc 244,AlexAccPred 243 (alexRightContext 7)(AlexAccNone),AlexAcc 242,AlexAcc 241,AlexAcc 240,AlexAcc 239,AlexAcc 238,AlexAcc 237,AlexAccPred 236 (alexRightContext 45)(AlexAccNone),AlexAcc 235,AlexAcc 234,AlexAcc 233,AlexAcc 232,AlexAcc 231,AlexAcc 230,AlexAcc 229,AlexAcc 228,AlexAcc 227,AlexAcc 226,AlexAcc 225,AlexAcc 224,AlexAcc 223,AlexAcc 222,AlexAcc 221,AlexAcc 220,AlexAcc 219,AlexAcc 218,AlexAcc 217,AlexAcc 216,AlexAcc 215,AlexAcc 214,AlexAcc 213,AlexAcc 212,AlexAcc 211,AlexAcc 210,AlexAcc 209,AlexAcc 208,AlexAcc 207,AlexAcc 206,AlexAcc 205,AlexAcc 204,AlexAcc 203,AlexAcc 202,AlexAcc 201,AlexAcc 200,AlexAcc 199,AlexAcc 198,AlexAcc 197,AlexAcc 196,AlexAcc 195,AlexAcc 194,AlexAcc 193,AlexAcc 192,AlexAcc 191,AlexAcc 190,AlexAcc 189,AlexAcc 188,AlexAcc 187,AlexAcc 186,AlexAcc 185,AlexAcc 184,AlexAcc 183,AlexAcc 182,AlexAcc 181,AlexAcc 180,AlexAcc 179,AlexAcc 178,AlexAcc 177,AlexAcc 176,AlexAcc 175,AlexAcc 174,AlexAcc 173,AlexAcc 172,AlexAcc 171,AlexAcc 170,AlexAcc 169,AlexAcc 168,AlexAcc 167,AlexAcc 166,AlexAcc 165,AlexAcc 164,AlexAcc 163,AlexAcc 162,AlexAcc 161,AlexAcc 160,AlexAcc 159,AlexAcc 158,AlexAcc 157,AlexAcc 156,AlexAcc 155,AlexAcc 154,AlexAcc 153,AlexAcc 152,AlexAcc 151,AlexAcc 150,AlexAcc 149,AlexAcc 148,AlexAcc 147,AlexAcc 146,AlexAcc 145,AlexAcc 144,AlexAcc 143,AlexAcc 142,AlexAcc 141,AlexAcc 140,AlexAcc 139,AlexAcc 138,AlexAcc 137,AlexAcc 136,AlexAcc 135,AlexAcc 134,AlexAcc 133,AlexAcc 132,AlexAcc 131,AlexAcc 130,AlexAcc 129,AlexAcc 128,AlexAcc 127,AlexAcc 126,AlexAcc 125,AlexAcc 124,AlexAcc 123,AlexAcc 122,AlexAcc 121,AlexAcc 120,AlexAcc 119,AlexAcc 118,AlexAcc 117,AlexAcc 116,AlexAcc 115,AlexAcc 114,AlexAcc 113,AlexAcc 112,AlexAcc 111,AlexAcc 110,AlexAcc 109,AlexAcc 108,AlexAcc 107,AlexAcc 106,AlexAcc 105,AlexAcc 104,AlexAcc 103,AlexAcc 102,AlexAcc 101,AlexAcc 100,AlexAcc 99,AlexAcc 98,AlexAcc 97,AlexAcc 96,AlexAcc 95,AlexAcc 94,AlexAcc 93,AlexAcc 92,AlexAcc 91,AlexAcc 90,AlexAcc 89,AlexAcc 88,AlexAcc 87,AlexAcc 86,AlexAcc 85,AlexAcc 84,AlexAcc 83,AlexAcc 82,AlexAcc 81,AlexAcc 80,AlexAcc 79,AlexAcc 78,AlexAcc 77,AlexAcc 76,AlexAcc 75,AlexAcc 74,AlexAcc 73,AlexAcc 72,AlexAcc 71,AlexAcc 70,AlexAcc 69,AlexAcc 68,AlexAcc 67,AlexAcc 66,AlexAcc 65,AlexAcc 64,AlexAcc 63,AlexAcc 62,AlexAcc 61,AlexAcc 60,AlexAcc 59,AlexAcc 58,AlexAcc 57,AlexAcc 56,AlexAcc 55,AlexAcc 54,AlexAcc 53,AlexAcc 52,AlexAcc 51,AlexAcc 50,AlexAcc 49,AlexAcc 48,AlexAcc 47,AlexAcc 46,AlexAcc 45,AlexAcc 44,AlexAcc 43,AlexAcc 42,AlexAcc 41,AlexAcc 40,AlexAcc 39,AlexAcc 38,AlexAcc 37,AlexAcc 36,AlexAcc 35,AlexAcc 34,AlexAcc 33,AlexAcc 32,AlexAcc 31,AlexAcc 30,AlexAcc 29,AlexAcc 28,AlexAcc 27,AlexAcc 26,AlexAcc 25,AlexAcc 24,AlexAcc 23,AlexAcc 22,AlexAcc 21,AlexAcc 20,AlexAcc 19,AlexAcc 18,AlexAcc 17,AlexAcc 16,AlexAcc 15,AlexAcc 14,AlexAcc 13,AlexAcc 12,AlexAcc 11,AlexAcc 10,AlexAcc 9,AlexAcc 8,AlexAcc 7,AlexAcc 6,AlexAcc 5,AlexAcc 4,AlexAcc 3,AlexAcc 2,AlexAcc 1,AlexAcc 0]--alex_actions = array (0::Int,525) [(524,alex_action_40),(523,alex_action_43),(522,alex_action_42),(521,alex_action_2),(520,alex_action_3),(519,alex_action_4),(518,alex_action_5),(517,alex_action_6),(516,alex_action_7),(515,alex_action_8),(514,alex_action_9),(513,alex_action_10),(512,alex_action_11),(511,alex_action_12),(510,alex_action_13),(509,alex_action_14),(508,alex_action_15),(507,alex_action_16),(506,alex_action_17),(505,alex_action_18),(504,alex_action_19),(503,alex_action_20),(502,alex_action_21),(501,alex_action_22),(500,alex_action_23),(499,alex_action_24),(498,alex_action_25),(497,alex_action_26),(496,alex_action_27),(495,alex_action_28),(494,alex_action_29),(493,alex_action_30),(492,alex_action_31),(491,alex_action_32),(490,alex_action_32),(489,alex_action_32),(488,alex_action_32),(487,alex_action_32),(486,alex_action_32),(485,alex_action_32),(484,alex_action_32),(483,alex_action_32),(482,alex_action_32),(481,alex_action_32),(480,alex_action_32),(479,alex_action_32),(478,alex_action_32),(477,alex_action_32),(476,alex_action_32),(475,alex_action_32),(474,alex_action_32),(473,alex_action_32),(472,alex_action_32),(471,alex_action_32),(470,alex_action_32),(469,alex_action_32),(468,alex_action_32),(467,alex_action_32),(466,alex_action_32),(465,alex_action_32),(464,alex_action_32),(463,alex_action_32),(462,alex_action_32),(461,alex_action_32),(460,alex_action_32),(459,alex_action_32),(458,alex_action_32),(457,alex_action_32),(456,alex_action_32),(455,alex_action_32),(454,alex_action_32),(453,alex_action_32),(452,alex_action_32),(451,alex_action_32),(450,alex_action_32),(449,alex_action_32),(448,alex_action_32),(447,alex_action_32),(446,alex_action_32),(445,alex_action_32),(444,alex_action_32),(443,alex_action_32),(442,alex_action_32),(441,alex_action_32),(440,alex_action_32),(439,alex_action_32),(438,alex_action_32),(437,alex_action_32),(436,alex_action_32),(435,alex_action_32),(434,alex_action_32),(433,alex_action_32),(432,alex_action_32),(431,alex_action_32),(430,alex_action_32),(429,alex_action_32),(428,alex_action_32),(427,alex_action_32),(426,alex_action_32),(425,alex_action_32),(424,alex_action_32),(423,alex_action_32),(422,alex_action_32),(421,alex_action_32),(420,alex_action_32),(419,alex_action_32),(418,alex_action_32),(417,alex_action_32),(416,alex_action_32),(415,alex_action_32),(414,alex_action_32),(413,alex_action_32),(412,alex_action_32),(411,alex_action_32),(410,alex_action_32),(409,alex_action_32),(408,alex_action_32),(407,alex_action_32),(406,alex_action_32),(405,alex_action_32),(404,alex_action_32),(403,alex_action_32),(402,alex_action_32),(401,alex_action_32),(400,alex_action_32),(399,alex_action_32),(398,alex_action_32),(397,alex_action_32),(396,alex_action_32),(395,alex_action_32),(394,alex_action_32),(393,alex_action_32),(392,alex_action_32),(391,alex_action_32),(390,alex_action_32),(389,alex_action_32),(388,alex_action_32),(387,alex_action_32),(386,alex_action_32),(385,alex_action_32),(384,alex_action_32),(383,alex_action_32),(382,alex_action_32),(381,alex_action_32),(380,alex_action_32),(379,alex_action_32),(378,alex_action_32),(377,alex_action_32),(376,alex_action_32),(375,alex_action_32),(374,alex_action_32),(373,alex_action_32),(372,alex_action_32),(371,alex_action_32),(370,alex_action_32),(369,alex_action_32),(368,alex_action_32),(367,alex_action_32),(366,alex_action_32),(365,alex_action_32),(364,alex_action_32),(363,alex_action_32),(362,alex_action_32),(361,alex_action_32),(360,alex_action_32),(359,alex_action_32),(358,alex_action_32),(357,alex_action_32),(356,alex_action_32),(355,alex_action_32),(354,alex_action_32),(353,alex_action_32),(352,alex_action_32),(351,alex_action_32),(350,alex_action_32),(349,alex_action_32),(348,alex_action_32),(347,alex_action_32),(346,alex_action_32),(345,alex_action_32),(344,alex_action_32),(343,alex_action_32),(342,alex_action_32),(341,alex_action_32),(340,alex_action_32),(339,alex_action_32),(338,alex_action_32),(337,alex_action_32),(336,alex_action_32),(335,alex_action_32),(334,alex_action_32),(333,alex_action_32),(332,alex_action_32),(331,alex_action_32),(330,alex_action_32),(329,alex_action_32),(328,alex_action_32),(327,alex_action_32),(326,alex_action_32),(325,alex_action_32),(324,alex_action_32),(323,alex_action_32),(322,alex_action_32),(321,alex_action_32),(320,alex_action_32),(319,alex_action_33),(318,alex_action_33),(317,alex_action_34),(316,alex_action_35),(315,alex_action_35),(314,alex_action_36),(313,alex_action_36),(312,alex_action_36),(311,alex_action_36),(310,alex_action_36),(309,alex_action_36),(308,alex_action_36),(307,alex_action_114),(306,alex_action_36),(305,alex_action_114),(304,alex_action_36),(303,alex_action_114),(302,alex_action_38),(301,alex_action_44),(300,alex_action_45),(299,alex_action_46),(298,alex_action_47),(297,alex_action_48),(296,alex_action_49),(295,alex_action_50),(294,alex_action_51),(293,alex_action_52),(292,alex_action_53),(291,alex_action_54),(290,alex_action_55),(289,alex_action_56),(288,alex_action_57),(287,alex_action_58),(286,alex_action_59),(285,alex_action_60),(284,alex_action_61),(283,alex_action_62),(282,alex_action_63),(281,alex_action_64),(280,alex_action_65),(279,alex_action_66),(278,alex_action_67),(277,alex_action_68),(276,alex_action_69),(275,alex_action_70),(274,alex_action_71),(273,alex_action_72),(272,alex_action_73),(271,alex_action_74),(270,alex_action_74),(269,alex_action_74),(268,alex_action_75),(267,alex_action_76),(266,alex_action_77),(265,alex_action_78),(264,alex_action_79),(263,alex_action_80),(262,alex_action_81),(261,alex_action_82),(260,alex_action_83),(259,alex_action_84),(258,alex_action_85),(257,alex_action_86),(256,alex_action_87),(255,alex_action_88),(254,alex_action_89),(253,alex_action_90),(252,alex_action_91),(251,alex_action_92),(250,alex_action_93),(249,alex_action_94),(248,alex_action_95),(247,alex_action_96),(246,alex_action_97),(245,alex_action_98),(244,alex_action_99),(243,alex_action_100),(242,alex_action_101),(241,alex_action_102),(240,alex_action_103),(239,alex_action_104),(238,alex_action_105),(237,alex_action_106),(236,alex_action_107),(235,alex_action_108),(234,alex_action_109),(233,alex_action_110),(232,alex_action_111),(231,alex_action_112),(230,alex_action_112),(229,alex_action_112),(228,alex_action_112),(227,alex_action_112),(226,alex_action_112),(225,alex_action_112),(224,alex_action_112),(223,alex_action_113),(222,alex_action_113),(221,alex_action_113),(220,alex_action_113),(219,alex_action_113),(218,alex_action_113),(217,alex_action_113),(216,alex_action_113),(215,alex_action_113),(214,alex_action_113),(213,alex_action_113),(212,alex_action_114),(211,alex_action_114),(210,alex_action_114),(209,alex_action_114),(208,alex_action_114),(207,alex_action_114),(206,alex_action_114),(205,alex_action_114),(204,alex_action_114),(203,alex_action_114),(202,alex_action_114),(201,alex_action_114),(200,alex_action_114),(199,alex_action_114),(198,alex_action_114),(197,alex_action_114),(196,alex_action_114),(195,alex_action_114),(194,alex_action_114),(193,alex_action_114),(192,alex_action_114),(191,alex_action_114),(190,alex_action_114),(189,alex_action_114),(188,alex_action_114),(187,alex_action_114),(186,alex_action_114),(185,alex_action_114),(184,alex_action_114),(183,alex_action_114),(182,alex_action_114),(181,alex_action_114),(180,alex_action_114),(179,alex_action_114),(178,alex_action_114),(177,alex_action_114),(176,alex_action_114),(175,alex_action_114),(174,alex_action_114),(173,alex_action_114),(172,alex_action_114),(171,alex_action_114),(170,alex_action_114),(169,alex_action_114),(168,alex_action_114),(167,alex_action_114),(166,alex_action_114),(165,alex_action_114),(164,alex_action_114),(163,alex_action_114),(162,alex_action_114),(161,alex_action_114),(160,alex_action_114),(159,alex_action_114),(158,alex_action_114),(157,alex_action_114),(156,alex_action_114),(155,alex_action_114),(154,alex_action_114),(153,alex_action_114),(152,alex_action_114),(151,alex_action_114),(150,alex_action_114),(149,alex_action_114),(148,alex_action_114),(147,alex_action_114),(146,alex_action_114),(145,alex_action_114),(144,alex_action_114),(143,alex_action_114),(142,alex_action_114),(141,alex_action_114),(140,alex_action_114),(139,alex_action_114),(138,alex_action_114),(137,alex_action_114),(136,alex_action_114),(135,alex_action_114),(134,alex_action_114),(133,alex_action_114),(132,alex_action_114),(131,alex_action_114),(130,alex_action_114),(129,alex_action_114),(128,alex_action_114),(127,alex_action_114),(126,alex_action_114),(125,alex_action_114),(124,alex_action_114),(123,alex_action_114),(122,alex_action_114),(121,alex_action_114),(120,alex_action_114),(119,alex_action_114),(118,alex_action_114),(117,alex_action_114),(116,alex_action_114),(115,alex_action_114),(114,alex_action_114),(113,alex_action_114),(112,alex_action_114),(111,alex_action_114),(110,alex_action_114),(109,alex_action_114),(108,alex_action_114),(107,alex_action_114),(106,alex_action_114),(105,alex_action_114),(104,alex_action_114),(103,alex_action_114),(102,alex_action_114),(101,alex_action_114),(100,alex_action_114),(99,alex_action_114),(98,alex_action_114),(97,alex_action_114),(96,alex_action_114),(95,alex_action_114),(94,alex_action_114),(93,alex_action_114),(92,alex_action_114),(91,alex_action_114),(90,alex_action_114),(89,alex_action_114),(88,alex_action_114),(87,alex_action_114),(86,alex_action_114),(85,alex_action_114),(84,alex_action_114),(83,alex_action_114),(82,alex_action_114),(81,alex_action_114),(80,alex_action_114),(79,alex_action_114),(78,alex_action_114),(77,alex_action_114),(76,alex_action_114),(75,alex_action_114),(74,alex_action_114),(73,alex_action_114),(72,alex_action_114),(71,alex_action_114),(70,alex_action_114),(69,alex_action_114),(68,alex_action_114),(67,alex_action_114),(66,alex_action_114),(65,alex_action_114),(64,alex_action_114),(63,alex_action_114),(62,alex_action_114),(61,alex_action_114),(60,alex_action_114),(59,alex_action_114),(58,alex_action_114),(57,alex_action_114),(56,alex_action_114),(55,alex_action_114),(54,alex_action_114),(53,alex_action_114),(52,alex_action_114),(51,alex_action_114),(50,alex_action_114),(49,alex_action_114),(48,alex_action_114),(47,alex_action_114),(46,alex_action_114),(45,alex_action_114),(44,alex_action_114),(43,alex_action_114),(42,alex_action_114),(41,alex_action_114),(40,alex_action_114),(39,alex_action_114),(38,alex_action_114),(37,alex_action_114),(36,alex_action_114),(35,alex_action_114),(34,alex_action_114),(33,alex_action_114),(32,alex_action_114),(31,alex_action_114),(30,alex_action_114),(29,alex_action_114),(28,alex_action_114),(27,alex_action_114),(26,alex_action_114),(25,alex_action_114),(24,alex_action_114),(23,alex_action_114),(22,alex_action_114),(21,alex_action_114),(20,alex_action_114),(19,alex_action_114),(18,alex_action_114),(17,alex_action_114),(16,alex_action_114),(15,alex_action_114),(14,alex_action_114),(13,alex_action_114),(12,alex_action_114),(11,alex_action_114),(10,alex_action_114),(9,alex_action_114),(8,alex_action_114),(7,alex_action_114),(6,alex_action_114),(5,alex_action_114),(4,alex_action_114),(3,alex_action_114),(2,alex_action_114),(1,alex_action_114),(0,alex_action_114)]--{-# LINE 242 "src/full/Agda/Syntax/Parser/Lexer.x" #-}----- | This is the initial state for parsing a regular, non-literate file.-normal :: LexState-normal = 0---{-| The layout state. Entered when we see a layout keyword ('withLayout') and- exited either when seeing an open brace ('openBrace') or at the next token- ('newLayoutContext').-- Update: we don't use braces for layout anymore.--}-layout :: LexState-layout = layout_---{-| The state inside a pragma.--}-pragma :: LexState-pragma = pragma_--{-| We enter this state from 'newLayoutContext' when the token following a- layout keyword is to the left of (or at the same column as) the current- layout context. Example:-- > data Empty : Set where- > foo : Empty -> Nat-- Here the second line is not part of the @where@ clause since it is has the- same indentation as the @data@ definition. What we have to do is insert an- empty layout block @{}@ after the @where@. The only thing that can happen- in this state is that 'emptyLayout' is executed, generating the closing- brace. The open brace is generated when entering by 'newLayoutContext'.--}-empty_layout :: LexState-empty_layout = empty_layout_----- | This state is entered at the beginning of each line. You can't lex--- anything in this state, and to exit you have to check the layout rule.--- Done with 'offsideRule'.-bol :: LexState-bol = bol_----- | This state can only be entered by the parser. In this state you can only--- lex the keywords @using@, @hiding@, @renaming@ and @to@. Moreover they are--- only keywords in this particular state. The lexer will never enter this--- state by itself, that has to be done in the parser.-imp_dir :: LexState-imp_dir = imp_dir_----- | Return the next token. This is the function used by Happy in the parser.------ @lexer k = 'lexToken' >>= k@-lexer :: (Token -> Parser a) -> Parser a-lexer k = lexToken >>= k---- | Do not use this function; it sets the 'ParseFlags' to--- 'undefined'.-alexScan :: AlexInput -> Int -> AlexReturn (LexAction Token)---- | This is the main lexing function generated by Alex.-alexScanUser :: ([LexState], ParseFlags) -> AlexInput -> Int -> AlexReturn (LexAction Token)----bol_,code,empty_layout_,imp_dir_,layout_,pragma_ :: Int-bol_ = 1-code = 2-empty_layout_ = 3-imp_dir_ = 4-layout_ = 5-pragma_ = 6-alex_action_2 = begin pragma -alex_action_3 = symbol SymOpenPragma -alex_action_4 = endWith $ symbol SymClosePragma -alex_action_5 = keyword KwBUILTIN -alex_action_6 = keyword KwCATCHALL -alex_action_7 = keyword KwCOMPILED -alex_action_8 = keyword KwCOMPILED_DATA -alex_action_9 = keyword KwCOMPILED_DATA_UHC -alex_action_10 = keyword KwCOMPILED_DECLARE_DATA -alex_action_11 = keyword KwCOMPILED_EPIC -alex_action_12 = keyword KwCOMPILED_EXPORT -alex_action_13 = keyword KwCOMPILED_JS -alex_action_14 = keyword KwCOMPILED_TYPE -alex_action_15 = keyword KwCOMPILED_UHC -alex_action_16 = keyword KwHASKELL -alex_action_17 = keyword KwDISPLAY -alex_action_18 = keyword KwIMPORT -alex_action_19 = keyword KwIMPORT_UHC -alex_action_20 = keyword KwIMPOSSIBLE -alex_action_21 = keyword KwINLINE -alex_action_22 = keyword KwLINE -alex_action_23 = keyword KwMEASURE -alex_action_24 = keyword KwNO_POSITIVITY_CHECK -alex_action_25 = keyword KwNO_TERMINATION_CHECK -alex_action_26 = keyword KwNON_TERMINATING -alex_action_27 = keyword KwOPTIONS -alex_action_28 = keyword KwPOLARITY -alex_action_29 = keyword KwREWRITE -alex_action_30 = keyword KwSTATIC -alex_action_31 = keyword KwTERMINATING -alex_action_32 = withInterval $ TokString -alex_action_33 = nestedComment -alex_action_34 = symbol SymEndComment -alex_action_35 = symbol SymEndComment -alex_action_36 = withInterval TokComment -alex_action_38 = begin bol_ -alex_action_40 = offsideRule -alex_action_42 = endWith newLayoutContext -alex_action_43 = emptyLayout -alex_action_44 = keyword KwLet -alex_action_45 = keyword KwIn -alex_action_46 = keyword KwWhere -alex_action_47 = keyword KwField -alex_action_48 = keyword KwWith -alex_action_49 = keyword KwRewrite -alex_action_50 = keyword KwPostulate -alex_action_51 = keyword KwPrimitive -alex_action_52 = keyword KwOpen -alex_action_53 = keyword KwImport -alex_action_54 = keyword KwModule -alex_action_55 = keyword KwData -alex_action_56 = keyword KwCoData -alex_action_57 = keyword KwRecord -alex_action_58 = keyword KwConstructor -alex_action_59 = keyword KwInductive -alex_action_60 = keyword KwCoInductive -alex_action_61 = keyword KwEta -alex_action_62 = keyword KwNoEta -alex_action_63 = keyword KwInfix -alex_action_64 = keyword KwInfixL -alex_action_65 = keyword KwInfixR -alex_action_66 = keyword KwMutual -alex_action_67 = keyword KwAbstract -alex_action_68 = keyword KwPrivate -alex_action_69 = keyword KwInstance -alex_action_70 = keyword KwOverlap -alex_action_71 = keyword KwMacro -alex_action_72 = keyword KwSet -alex_action_73 = keyword KwForall -alex_action_74 = withInterval' (read . drop 3) TokSetN -alex_action_75 = keyword KwQuoteGoal -alex_action_76 = keyword KwQuoteContext -alex_action_77 = keyword KwQuote -alex_action_78 = keyword KwQuoteTerm -alex_action_79 = keyword KwUnquote -alex_action_80 = keyword KwUnquoteDecl -alex_action_81 = keyword KwUnquoteDef -alex_action_82 = keyword KwTactic -alex_action_83 = keyword KwSyntax -alex_action_84 = keyword KwPatternSyn -alex_action_85 = keyword KwUsing -alex_action_86 = keyword KwHiding -alex_action_87 = keyword KwRenaming -alex_action_88 = endWith $ keyword KwTo -alex_action_89 = keyword KwPublic -alex_action_90 = hole -alex_action_91 = symbol SymEllipsis -alex_action_92 = symbol SymDotDot -alex_action_93 = symbol SymDot -alex_action_94 = symbol SymSemi -alex_action_95 = symbol SymColon -alex_action_96 = symbol SymEqual -alex_action_97 = symbol SymUnderscore -alex_action_98 = symbol SymQuestionMark -alex_action_99 = symbol SymBar -alex_action_100 = symbol SymOpenIdiomBracket -alex_action_101 = symbol SymCloseIdiomBracket -alex_action_102 = symbol SymOpenParen -alex_action_103 = symbol SymCloseParen -alex_action_104 = symbol SymArrow -alex_action_105 = symbol SymLambda -alex_action_106 = symbol SymAs -alex_action_107 = symbol SymDoubleOpenBrace -alex_action_108 = symbol SymOpenBrace -alex_action_109 = symbol SymCloseBrace -alex_action_110 = litChar -alex_action_111 = litString -alex_action_112 = literal LitNat -alex_action_113 = literal LitFloat -alex_action_114 = identifier -{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command-line>" #-}-{-# LINE 9 "<command-line>" #-}-{-# LINE 1 "/usr/local/stow/ghc-8.0.2-rc2/lib/ghc-8.0.1.20161213/include/ghcversion.h" #-}-------------------{-# LINE 9 "<command-line>" #-}-{-# LINE 1 "/tmp/ghc18762_0/ghc_2.h" #-}-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------{-# LINE 9 "<command-line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- -------------------------------------------------------------------------------- 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--{-# LINE 21 "templates/GenericTemplate.hs" #-}-------- 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-{-# LINE 51 "templates/GenericTemplate.hs" #-}---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 (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- indexInt16OffAddr# arr off-#endif------{-# INLINE alexIndexInt32OffAddr #-}-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- indexInt32OffAddr# arr off-#endif-------#if __GLASGOW_HASKELL__ < 503-quickIndex arr i = arr ! i-#else--- GHC >= 503, unsafeAt is available from Data.Array.Base.-quickIndex = unsafeAt-#endif------- -------------------------------------------------------------------------------- Main lexing routines--data AlexReturn a- = AlexEOF- | AlexError !AlexInput- | AlexSkip !AlexInput !Int- | AlexToken !AlexInput !Int a---- alexScan :: AlexInput -> StartCode -> AlexReturn a-alexScan input (I# (sc))- = alexScanUser undefined input (I# (sc))--alexScanUser user input (I# (sc))- = case alex_scan_tkn user input 0# input sc AlexNone of- (AlexNone, input') ->- case alexGetByte input of- Nothing ->---- AlexEOF- Just _ ->---- AlexError input'-- (AlexLastSkip input'' len, _) ->---- AlexSkip input'' len-- (AlexLastAcc k input''' len, _) ->---- 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` (I# (s))))- in- new_acc `seq`- case alexGetByte input of- Nothing -> (new_acc, input)- Just (c, new_input) ->---- case fromIntegral c of { (I# (ord_c)) ->- let- base = alexIndexInt32OffAddr alex_base s- offset = (base +# ord_c)- check = alexIndexInt16OffAddr alex_check offset-- new_s = if GTE(offset,0#) && EQ(check,ord_c)- then alexIndexInt16OffAddr alex_table offset- else alexIndexInt16OffAddr alex_deflt s- in- case new_s of- -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 (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)- -- note that the length is increased ONLY if this is the 1st byte in a char encoding)- new_input new_s new_acc- }- where- check_accs (AlexAccNone) = last_acc- check_accs (AlexAcc a ) = AlexLastAcc a input (I# (len))- check_accs (AlexAccSkip) = AlexLastSkip input (I# (len))-- check_accs (AlexAccPred a predx rest)- | predx user orig_input (I# (len)) input- = AlexLastAcc a input (I# (len))- | otherwise- = check_accs rest- check_accs (AlexAccSkipPred predx rest)- | predx user orig_input (I# (len)) input- = AlexLastSkip input (I# (len))- | otherwise- = check_accs rest---data AlexLastAcc- = AlexNone- | AlexLastAcc !Int !AlexInput !Int- | AlexLastSkip !AlexInput !Int--data AlexAcc user- = AlexAccNone- | AlexAcc Int- | AlexAccSkip-- | 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 (I# (sc)) user _ _ input =- case alex_scan_tkn user input 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.
− dist/build/Agda/Syntax/Parser/Parser.hs
@@ -1,7338 +0,0 @@-{-# OPTIONS_GHC -w #-}-{-# OPTIONS -fglasgow-exts -cpp #-}-{-# LANGUAGE TupleSections #-}--{-| The parser is generated by Happy (<http://www.haskell.org/happy>).- -- - Ideally, ranges should be as precise as possible, to get messages that- - emphasize precisely the faulting term(s) upon error.- -- - However, interactive highlighting is only applied at the end of each- - mutual block, keywords are only highlighted once (see- - `TypeChecking.Rules.Decl'). So if the ranges of two declarations- - interleave, one must ensure that keyword ranges are not included in- - the intersection. (Otherwise they are uncolored by the interactive- - highlighting.)- -- -}-module Agda.Syntax.Parser.Parser (- moduleParser- , moduleNameParser- , exprParser- , exprWhereParser- , tokensParser- , splitOnDots -- only used by the internal test-suite- ) where--import Control.Monad--import Data.Char-import Data.Functor-import Data.List-import Data.Maybe-import Data.Monoid-import qualified Data.Traversable as T--import Debug.Trace--import Agda.Syntax.Position hiding (tests)-import Agda.Syntax.Parser.Monad-import Agda.Syntax.Parser.Lexer-import Agda.Syntax.Parser.Tokens-import Agda.Syntax.Concrete as C-import Agda.Syntax.Concrete.Pretty ()-import Agda.Syntax.Common-import Agda.Syntax.Fixity-import Agda.Syntax.Notation-import Agda.Syntax.Literal--import Agda.TypeChecking.Positivity.Occurrence hiding (tests)--import Agda.Utils.Either hiding (tests)-import Agda.Utils.Hash-import Agda.Utils.List ( spanJust, chopWhen )-import Agda.Utils.Monad-import Agda.Utils.Pretty-import Agda.Utils.Singleton-import Agda.Utils.Tuple--import Agda.Utils.Impossible-#include "undefined.h"-import qualified Data.Array as Happy_Data_Array-import qualified GHC.Exts as Happy_GHC_Exts-import Control.Applicative(Applicative(..))-import Control.Monad (ap)---- parser produced by Happy Version 1.19.5--newtype HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84 = HappyAbsSyn HappyAny-#if __GLASGOW_HASKELL__ >= 607-type HappyAny = Happy_GHC_Exts.Any-#else-type HappyAny = forall a . a-#endif-happyIn9 :: ([Token]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn9 #-}-happyOut9 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Token])-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut9 #-}-happyIn10 :: ([Token]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn10 #-}-happyOut10 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Token])-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut10 #-}-happyIn11 :: (Token) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn11 #-}-happyOut11 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Token)-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut11 #-}-happyIn12 :: (([Pragma], [Declaration])) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn12 #-}-happyOut12 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (([Pragma], [Declaration]))-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut12 #-}-happyIn13 :: t13 -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn13 #-}-happyOut13 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> t13-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut13 #-}-happyIn14 :: t14 -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn14 #-}-happyOut14 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> t14-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut14 #-}-happyIn15 :: t15 -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn15 #-}-happyOut15 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> t15-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut15 #-}-happyIn16 :: (()) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn16 #-}-happyOut16 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (())-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut16 #-}-happyIn17 :: (Integer) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn17 #-}-happyOut17 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Integer)-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut17 #-}-happyIn18 :: (Name) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn18 #-}-happyOut18 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Name)-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut18 #-}-happyIn19 :: ([Name]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn19 #-}-happyOut19 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Name])-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut19 #-}-happyIn20 :: (Range) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn20 #-}-happyOut20 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Range)-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut20 #-}-happyIn21 :: (Arg Name) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn21 #-}-happyOut21 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Arg Name)-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut21 #-}-happyIn22 :: ([Arg Name]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn22 #-}-happyOut22 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Arg Name])-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut22 #-}-happyIn23 :: ([Arg Name]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn23 #-}-happyOut23 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Arg Name])-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut23 #-}-happyIn24 :: (QName) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn24 #-}-happyOut24 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (QName)-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut24 #-}-happyIn25 :: (QName) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn25 #-}-happyOut25 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (QName)-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut25 #-}-happyIn26 :: (Name) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn26 #-}-happyOut26 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Name)-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut26 #-}-happyIn27 :: ([Name]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn27 #-}-happyOut27 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Name])-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut27 #-}-happyIn28 :: ([Name]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn28 #-}-happyOut28 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Name])-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut28 #-}-happyIn29 :: (Either [Name] [Expr]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn29 #-}-happyOut29 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Either [Name] [Expr])-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut29 #-}-happyIn30 :: ([WithHiding Name]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn30 #-}-happyOut30 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([WithHiding Name])-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut30 #-}-happyIn31 :: ([String]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn31 #-}-happyOut31 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([String])-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut31 #-}-happyIn32 :: (String) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn32 #-}-happyOut32 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (String)-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut32 #-}-happyIn33 :: ([(Interval, String)]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn33 #-}-happyOut33 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([(Interval, String)])-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut33 #-}-happyIn34 :: (Name) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn34 #-}-happyOut34 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Name)-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut34 #-}-happyIn35 :: (QName) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn35 #-}-happyOut35 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (QName)-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut35 #-}-happyIn36 :: ([QName]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn36 #-}-happyOut36 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([QName])-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut36 #-}-happyIn37 :: (Expr) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn37 #-}-happyOut37 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Expr)-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut37 #-}-happyIn38 :: t38 -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn38 #-}-happyOut38 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> t38-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut38 #-}-happyIn39 :: ([Expr]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn39 #-}-happyOut39 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Expr])-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut39 #-}-happyIn40 :: ([Expr]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn40 #-}-happyOut40 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Expr])-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut40 #-}-happyIn41 :: t41 -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn41 #-}-happyOut41 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> t41-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut41 #-}-happyIn42 :: (Expr) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn42 #-}-happyOut42 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Expr)-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut42 #-}-happyIn43 :: ([Expr]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn43 #-}-happyOut43 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Expr])-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut43 #-}-happyIn44 :: t44 -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn44 #-}-happyOut44 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> t44-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut44 #-}-happyIn45 :: t45 -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn45 #-}-happyOut45 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> t45-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut45 #-}-happyIn46 :: t46 -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn46 #-}-happyOut46 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> t46-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut46 #-}-happyIn47 :: (RecordAssignments) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn47 #-}-happyOut47 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (RecordAssignments)-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut47 #-}-happyIn48 :: (RecordAssignments) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn48 #-}-happyOut48 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (RecordAssignments)-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut48 #-}-happyIn49 :: (RecordAssignment) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn49 #-}-happyOut49 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (RecordAssignment)-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut49 #-}-happyIn50 :: (ModuleAssignment) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn50 #-}-happyOut50 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (ModuleAssignment)-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut50 #-}-happyIn51 :: ([FieldAssignment]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn51 #-}-happyOut51 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([FieldAssignment])-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut51 #-}-happyIn52 :: ([FieldAssignment]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn52 #-}-happyOut52 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([FieldAssignment])-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut52 #-}-happyIn53 :: (FieldAssignment) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn53 #-}-happyOut53 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (FieldAssignment)-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut53 #-}-happyIn54 :: t54 -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn54 #-}-happyOut54 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> t54-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut54 #-}-happyIn55 :: t55 -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn55 #-}-happyOut55 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> t55-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut55 #-}-happyIn56 :: ([TypedBindings]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn56 #-}-happyOut56 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([TypedBindings])-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut56 #-}-happyIn57 :: (TypedBindings) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn57 #-}-happyOut57 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (TypedBindings)-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut57 #-}-happyIn58 :: (TypedBindings) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn58 #-}-happyOut58 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (TypedBindings)-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut58 #-}-happyIn59 :: (TypedBindings) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn59 #-}-happyOut59 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (TypedBindings)-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut59 #-}-happyIn60 :: ([LamBinding]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn60 #-}-happyOut60 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([LamBinding])-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut60 #-}-happyIn61 :: (Either ([LamBinding], Hiding) [Expr]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn61 #-}-happyOut61 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Either ([LamBinding], Hiding) [Expr])-happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut61 #-}-happyIn62 :: ([Either Hiding LamBinding]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn62 #-}-happyOut62 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Either Hiding LamBinding])-happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut62 #-}-happyIn63 :: (Either [Either Hiding LamBinding] [Expr]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn63 #-}-happyOut63 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Either [Either Hiding LamBinding] [Expr])-happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut63 #-}-happyIn64 :: ((LHS,RHS,WhereClause,Bool)) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn64 #-}-happyOut64 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ((LHS,RHS,WhereClause,Bool))-happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut64 #-}-happyIn65 :: ((LHS,RHS,WhereClause,Bool)) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn65 #-}-happyOut65 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ((LHS,RHS,WhereClause,Bool))-happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut65 #-}-happyIn66 :: ((LHS,RHS,WhereClause,Bool)) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn66 #-}-happyOut66 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ((LHS,RHS,WhereClause,Bool))-happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut66 #-}-happyIn67 :: ([(LHS,RHS,WhereClause,Bool)]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn67 #-}-happyOut67 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([(LHS,RHS,WhereClause,Bool)])-happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut67 #-}-happyIn68 :: ([LamBinding]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn68 #-}-happyOut68 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([LamBinding])-happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut68 #-}-happyIn69 :: ([LamBinding]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn69 #-}-happyOut69 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([LamBinding])-happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut69 #-}-happyIn70 :: ([LamBinding]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn70 #-}-happyOut70 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([LamBinding])-happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut70 #-}-happyIn71 :: ([LamBinding]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn71 #-}-happyOut71 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([LamBinding])-happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut71 #-}-happyIn72 :: (Either [LamBinding] [Expr]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn72 #-}-happyOut72 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Either [LamBinding] [Expr])-happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut72 #-}-happyIn73 :: (ImportDirective) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn73 #-}-happyOut73 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (ImportDirective)-happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut73 #-}-happyIn74 :: ([ImportDirective]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn74 #-}-happyOut74 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([ImportDirective])-happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut74 #-}-happyIn75 :: (ImportDirective) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn75 #-}-happyOut75 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (ImportDirective)-happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut75 #-}-happyIn76 :: ((Using, Range)) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn76 #-}-happyOut76 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ((Using, Range))-happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut76 #-}-happyIn77 :: (([ImportedName], Range)) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn77 #-}-happyOut77 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (([ImportedName], Range))-happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut77 #-}-happyIn78 :: (([Renaming] , Range)) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn78 #-}-happyOut78 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (([Renaming] , Range))-happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut78 #-}-happyIn79 :: ([Renaming]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn79 #-}-happyOut79 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Renaming])-happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut79 #-}-happyIn80 :: (Renaming) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn80 #-}-happyOut80 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Renaming)-happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut80 #-}-happyIn81 :: (ImportedName) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn81 #-}-happyOut81 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (ImportedName)-happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut81 #-}-happyIn82 :: (ImportedName) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn82 #-}-happyOut82 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (ImportedName)-happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut82 #-}-happyIn83 :: ([ImportedName]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn83 #-}-happyOut83 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([ImportedName])-happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut83 #-}-happyIn84 :: t84 -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn84 #-}-happyOut84 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> t84-happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut84 #-}-happyIn85 :: (LHS) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn85 #-}-happyOut85 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (LHS)-happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut85 #-}-happyIn86 :: ([Pattern]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn86 #-}-happyOut86 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Pattern])-happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut86 #-}-happyIn87 :: ([Expr]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn87 #-}-happyOut87 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Expr])-happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut87 #-}-happyIn88 :: ([Expr]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn88 #-}-happyOut88 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Expr])-happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut88 #-}-happyIn89 :: (WhereClause) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn89 #-}-happyOut89 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (WhereClause)-happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut89 #-}-happyIn90 :: (ExprWhere) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn90 #-}-happyOut90 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (ExprWhere)-happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut90 #-}-happyIn91 :: ([Declaration]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn91 #-}-happyOut91 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Declaration])-happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut91 #-}-happyIn92 :: ([Declaration]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn92 #-}-happyOut92 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Declaration])-happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut92 #-}-happyIn93 :: ([Arg Declaration]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn93 #-}-happyOut93 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Arg Declaration])-happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut93 #-}-happyIn94 :: ([Declaration]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn94 #-}-happyOut94 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Declaration])-happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut94 #-}-happyIn95 :: (RHSOrTypeSigs) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn95 #-}-happyOut95 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (RHSOrTypeSigs)-happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut95 #-}-happyIn96 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn96 #-}-happyOut96 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut96 #-}-happyIn97 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn97 #-}-happyOut97 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut97 #-}-happyIn98 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn98 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn98 #-}-happyOut98 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut98 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut98 #-}-happyIn99 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn99 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn99 #-}-happyOut99 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut99 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut99 #-}-happyIn100 :: ((Name, IsInstance)) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn100 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn100 #-}-happyOut100 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ((Name, IsInstance))-happyOut100 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut100 #-}-happyIn101 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn101 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn101 #-}-happyOut101 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut101 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut101 #-}-happyIn102 :: ([Declaration]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn102 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn102 #-}-happyOut102 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Declaration])-happyOut102 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut102 #-}-happyIn103 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn103 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn103 #-}-happyOut103 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut103 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut103 #-}-happyIn104 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn104 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn104 #-}-happyOut104 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut104 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut104 #-}-happyIn105 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn105 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn105 #-}-happyOut105 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut105 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut105 #-}-happyIn106 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn106 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn106 #-}-happyOut106 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut106 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut106 #-}-happyIn107 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn107 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn107 #-}-happyOut107 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut107 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut107 #-}-happyIn108 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn108 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn108 #-}-happyOut108 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut108 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut108 #-}-happyIn109 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn109 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn109 #-}-happyOut109 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut109 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut109 #-}-happyIn110 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn110 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn110 #-}-happyOut110 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut110 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut110 #-}-happyIn111 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn111 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn111 #-}-happyOut111 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut111 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut111 #-}-happyIn112 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn112 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn112 #-}-happyOut112 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut112 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut112 #-}-happyIn113 :: ([Arg Name]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn113 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn113 #-}-happyOut113 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Arg Name])-happyOut113 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut113 #-}-happyIn114 :: ([RString]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn114 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn114 #-}-happyOut114 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([RString])-happyOut114 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut114 #-}-happyIn115 :: ([NamedArg HoleName]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn115 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn115 #-}-happyOut115 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([NamedArg HoleName])-happyOut115 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut115 #-}-happyIn116 :: (NamedArg HoleName) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn116 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn116 #-}-happyOut116 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (NamedArg HoleName)-happyOut116 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut116 #-}-happyIn117 :: (HoleName) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn117 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn117 #-}-happyOut117 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (HoleName)-happyOut117 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut117 #-}-happyIn118 :: (HoleName) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn118 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn118 #-}-happyOut118 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (HoleName)-happyOut118 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut118 #-}-happyIn119 :: (RString) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn119 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn119 #-}-happyOut119 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (RString)-happyOut119 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut119 #-}-happyIn120 :: (Maybe Range) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn120 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn120 #-}-happyOut120 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Maybe Range)-happyOut120 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut120 #-}-happyIn121 :: ([Declaration]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn121 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn121 #-}-happyOut121 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Declaration])-happyOut121 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut121 #-}-happyIn122 :: ([Expr]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn122 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn122 #-}-happyOut122 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Expr])-happyOut122 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut122 #-}-happyIn123 :: ([TypedBindings] -> Parser ModuleApplication) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn123 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn123 #-}-happyOut123 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([TypedBindings] -> Parser ModuleApplication)-happyOut123 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut123 #-}-happyIn124 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn124 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn124 #-}-happyOut124 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut124 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut124 #-}-happyIn125 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn125 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn125 #-}-happyOut125 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut125 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut125 #-}-happyIn126 :: (Name) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn126 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn126 #-}-happyOut126 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Name)-happyOut126 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut126 #-}-happyIn127 :: ([Declaration]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn127 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn127 #-}-happyOut127 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Declaration])-happyOut127 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut127 #-}-happyIn128 :: (Declaration) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn128 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn128 #-}-happyOut128 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Declaration)-happyOut128 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut128 #-}-happyIn129 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn129 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn129 #-}-happyOut129 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut129 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut129 #-}-happyIn130 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn130 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn130 #-}-happyOut130 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut130 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut130 #-}-happyIn131 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn131 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn131 #-}-happyOut131 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut131 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut131 #-}-happyIn132 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn132 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn132 #-}-happyOut132 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut132 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut132 #-}-happyIn133 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn133 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn133 #-}-happyOut133 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut133 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut133 #-}-happyIn134 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn134 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn134 #-}-happyOut134 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut134 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut134 #-}-happyIn135 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn135 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn135 #-}-happyOut135 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut135 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut135 #-}-happyIn136 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn136 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn136 #-}-happyOut136 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut136 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut136 #-}-happyIn137 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn137 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn137 #-}-happyOut137 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut137 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut137 #-}-happyIn138 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn138 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn138 #-}-happyOut138 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut138 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut138 #-}-happyIn139 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn139 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn139 #-}-happyOut139 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut139 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut139 #-}-happyIn140 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn140 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn140 #-}-happyOut140 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut140 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut140 #-}-happyIn141 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn141 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn141 #-}-happyOut141 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut141 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut141 #-}-happyIn142 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn142 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn142 #-}-happyOut142 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut142 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut142 #-}-happyIn143 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn143 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn143 #-}-happyOut143 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut143 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut143 #-}-happyIn144 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn144 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn144 #-}-happyOut144 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut144 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut144 #-}-happyIn145 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn145 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn145 #-}-happyOut145 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut145 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut145 #-}-happyIn146 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn146 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn146 #-}-happyOut146 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut146 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut146 #-}-happyIn147 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn147 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn147 #-}-happyOut147 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut147 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut147 #-}-happyIn148 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn148 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn148 #-}-happyOut148 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut148 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut148 #-}-happyIn149 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn149 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn149 #-}-happyOut149 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut149 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut149 #-}-happyIn150 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn150 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn150 #-}-happyOut150 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut150 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut150 #-}-happyIn151 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn151 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn151 #-}-happyOut151 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut151 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut151 #-}-happyIn152 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn152 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn152 #-}-happyOut152 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut152 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut152 #-}-happyIn153 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn153 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn153 #-}-happyOut153 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut153 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut153 #-}-happyIn154 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn154 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn154 #-}-happyOut154 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut154 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut154 #-}-happyIn155 :: (Pragma) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn155 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn155 #-}-happyOut155 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Pragma)-happyOut155 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut155 #-}-happyIn156 :: ([(Range, Occurrence)]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn156 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn156 #-}-happyOut156 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([(Range, Occurrence)])-happyOut156 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut156 #-}-happyIn157 :: ((Range, Occurrence)) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn157 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn157 #-}-happyOut157 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ((Range, Occurrence))-happyOut157 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut157 #-}-happyIn158 :: ([TypeSignature]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn158 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn158 #-}-happyOut158 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([TypeSignature])-happyOut158 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut158 #-}-happyIn159 :: ([TypeSignature]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn159 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn159 #-}-happyOut159 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([TypeSignature])-happyOut159 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut159 #-}-happyIn160 :: ([Arg TypeSignature]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn160 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn160 #-}-happyOut160 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Arg TypeSignature])-happyOut160 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut160 #-}-happyIn161 :: ([Arg TypeSignature]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn161 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn161 #-}-happyOut161 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Arg TypeSignature])-happyOut161 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut161 #-}-happyIn162 :: (((Maybe (Ranged Induction), Maybe Bool, Maybe (Name, IsInstance)), [Declaration])) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn162 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn162 #-}-happyOut162 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (((Maybe (Ranged Induction), Maybe Bool, Maybe (Name, IsInstance)), [Declaration]))-happyOut162 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut162 #-}-happyIn163 :: ([RecordDirective]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn163 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn163 #-}-happyOut163 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([RecordDirective])-happyOut163 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut163 #-}-happyIn164 :: (RecordDirective) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn164 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn164 #-}-happyOut164 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (RecordDirective)-happyOut164 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut164 #-}-happyIn165 :: (Ranged Bool) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn165 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn165 #-}-happyOut165 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Ranged Bool)-happyOut165 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut165 #-}-happyIn166 :: (Ranged Induction) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn166 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn166 #-}-happyOut166 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Ranged Induction)-happyOut166 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut166 #-}-happyIn167 :: ([Declaration]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn167 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn167 #-}-happyOut167 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Declaration])-happyOut167 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut167 #-}-happyIn168 :: ([Declaration]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn168 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn168 #-}-happyOut168 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Declaration])-happyOut168 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut168 #-}-happyIn169 :: ([Declaration]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn169 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn169 #-}-happyOut169 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Declaration])-happyOut169 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut169 #-}-happyIn170 :: ([Declaration]) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyIn170 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn170 #-}-happyOut170 :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> ([Declaration])-happyOut170 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut170 #-}-happyInTok :: (Token) -> (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84)-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyInTok #-}-happyOutTok :: (HappyAbsSyn t13 t14 t15 t38 t41 t44 t45 t46 t54 t55 t84) -> (Token)-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOutTok #-}---happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\x00\x00\xd4\x0b\xd4\x0b\xf6\x06\xde\x04\xb6\x0b\x00\x00\x9d\x04\xff\x06\x00\x00\x2c\x07\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x06\x00\x00\x00\x00\xb7\x09\xef\x04\xe8\x06\xd6\x0a\xec\x06\x00\x00\x00\x00\x00\x00\xe5\x06\x00\x00\xb2\x0d\x00\x00\x67\x0d\x00\x00\x00\x00\xf1\x06\x67\x0d\x00\x00\x00\x00\x1b\x03\x9c\x09\x68\x0b\x9a\x07\x4e\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x06\xde\x06\x34\x04\xc6\x00\xea\x06\x51\x01\x68\x0b\xed\x06\x00\x00\x05\x02\xcf\x06\x25\x03\x4e\x0d\x7c\x07\x24\x07\x4e\x09\xcf\x06\xcf\x06\xe7\x06\x00\x00\xda\x06\x1b\x02\xd5\x06\x00\x00\x00\x00\xb2\xff\xb2\xff\x00\x00\xca\x06\xe3\x06\xd9\x06\xb6\x01\xd8\x06\x12\x07\xd1\x06\xc3\x06\xd8\x04\x00\x00\x00\x00\x30\x09\x24\x07\xe2\x08\x22\x0c\x22\x0c\x22\x0c\x00\x00\x20\x01\x4a\x0b\x22\x0c\x22\x0c\x00\x00\x00\x00\xf5\x0a\x22\x0c\xf5\x0a\x00\x00\x6f\x01\xbf\x06\x04\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\x00\x00\x00\x00\x00\x00\x00\xc0\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\xbb\x06\xb5\x06\xb5\x06\xb9\x06\xab\x06\xab\x06\xab\x06\xac\x06\xac\x06\xc6\xff\xac\x06\xff\xff\x9d\x06\xa8\x06\xa3\x06\xa0\x06\x03\x0d\x93\x06\xe5\x00\x93\x06\xf1\x12\x9c\x06\x00\x00\x00\x00\x49\x08\xf5\x0a\x00\x00\xa2\x06\x00\x00\x66\x0a\xb8\x05\x95\x06\xbd\x05\xf9\x01\x00\x00\xc4\x08\x6c\x08\x51\x08\xd0\x06\xea\x0c\x9b\x06\xea\x0c\x91\x06\xd8\x04\xe2\x06\xe0\x06\x3d\x06\xfd\x09\xf5\x0a\x96\x06\xfd\x09\x00\x00\x22\x0c\x22\x0c\xc6\x00\xf5\x0a\xf5\x0a\x00\x00\x00\x00\xb0\x06\x22\x0c\xea\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x0a\x00\x00\x00\x00\x00\x00\x8a\x06\x00\x00\x22\x0c\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\xf5\x0a\xf5\x0a\x92\x06\xea\x0c\x85\x06\x00\x00\x8d\x06\x00\x00\x00\x00\x7b\x06\x22\x0c\x84\x06\xa7\x06\x61\x01\x7f\x06\x00\x00\x04\x01\xf5\x00\x22\x0c\x7e\x06\x77\x06\x7d\x06\x00\x00\x7c\x06\x00\x00\x22\x0c\x22\x0c\x22\x0c\x00\x00\x22\x0c\x22\x0c\xd7\x0a\x94\x09\x7a\x06\x94\x09\x03\x08\xe8\x07\x89\x0a\x00\x00\x00\x00\x75\x06\x00\x00\x5c\x00\x5e\x06\x61\x06\x61\x06\x61\x06\x61\x06\x61\x06\x61\x06\x61\x06\x61\x06\x61\x06\x5f\x06\x5d\x06\x53\x06\x52\x06\x46\x06\x4e\x06\x3a\x06\x44\x06\x42\x06\x3b\x06\x36\x06\x35\x06\x33\x06\x2f\x06\x30\x06\x2e\x06\x40\x06\x3c\x06\x6e\x0a\xee\x02\xc3\x08\x00\x00\x00\x00\x27\x06\x00\x00\x23\x04\x9f\x0c\x27\x06\x00\x00\xaf\x03\xaf\x03\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\xd2\x00\xd2\x00\x00\x00\x75\x01\xaf\x03\xaf\x03\x00\x00\x00\x00\x00\x00\x3d\x06\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x03\x5b\x06\x5a\x06\x00\x00\x00\x00\x00\x00\x22\x0c\x22\x0c\x26\x06\xb2\xff\x2b\x06\x24\x06\xb2\xff\x25\x06\x39\x00\x00\x00\xd8\x04\x00\x00\x00\x00\x6e\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x0a\x00\x00\x00\x00\x86\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x06\x1a\x06\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x03\x6c\x00\xaf\x03\xe7\xff\x00\x00\x8b\x01\x29\x06\x00\x00\x69\x00\x18\x06\x8b\x01\x79\x01\x96\x00\x52\x00\x52\x00\xd2\x00\x00\x00\x00\x00\x00\x00\x43\x06\xdd\xff\xaf\x03\x86\x0c\x24\x00\x06\x07\x00\x00\x1e\x06\x1d\x06\x00\x00\x69\x00\xd9\xff\x22\x0c\xbb\x03\x00\x00\x00\x00\x00\x00\xe7\x05\x68\x00\x68\x00\x00\x00\x00\x00\x6e\x0a\x6e\x0a\x00\x00\x00\x00\x0a\x06\x00\x00\x00\x00\x08\x06\x03\x06\x00\x00\x00\x00\x05\x06\xfa\x05\x00\x00\x00\x00\x00\x00\xfc\x05\xf6\x05\x00\x00\xef\x05\xea\x05\xe2\x05\xdf\x05\xcf\x05\xcf\x05\xcf\x05\xce\x05\xcd\x05\xcd\x05\xc9\x05\xc7\x05\xc5\x05\x00\x00\xc4\x05\xc4\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x05\x01\xf9\x00\x78\x00\xf9\x00\x00\x00\xd2\x05\x20\x0a\x00\x00\x20\x0a\x05\x0a\x00\x00\x00\x00\x00\x00\xd8\x05\xc6\x05\x00\x00\xb3\x05\xd8\x04\x00\x00\x24\x00\x05\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\xcc\x05\x00\x00\xc8\x05\xab\x05\x00\x00\xb7\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x05\xb4\x05\xad\x05\xb0\x05\xb0\x05\xaa\x05\xa9\x05\xa5\x05\x00\x00\xa4\x05\xa3\x05\xa0\x05\x00\x00\x9d\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x05\xa7\x05\x64\x00\x9c\x05\x9a\x05\xe1\xff\x00\x00\x8d\x05\x7a\x01\x86\x05\x05\x0a\x00\x00\x76\x05\x05\x0a\x05\x0a\xb2\xff\x00\x00\x00\x00\x7e\x05\x74\x05\xd8\x04\x74\x05\x00\x00\x52\x00\x82\x05\x73\x05\x73\x05\xb2\xff\x00\x00\x73\x05\x73\x05\x00\x00\x73\x05\x73\x05\x7d\x05\x00\x00\x00\x00\x75\x01\x05\x0a\x00\x00\x6e\x05\x05\x0a\x00\x00\x6e\x05\x05\x0a\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x9f\x05\x00\x00\x9b\x05\x00\x00\x00\x00\x00\x00\x05\x0a\x6b\x05\xb2\xff\x5e\x05\xb2\xff\x8b\x01\x8b\x01\x00\x00\x00\x00\x3b\x0c\x24\x00\x00\x00\xd8\x04\x24\x00\x00\x00\x00\x00\x00\x00\x99\x05\x00\x00\x05\x05\x55\x05\x00\x00\x70\x05\x6f\x05\x68\x00\x00\x00\x6a\x05\x68\x05\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x05\x53\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\xf4\xff\x2c\x00\x00\x00\x00\x00\x5d\x05\x52\x05\x00\x00\x49\x05\x49\x05\x4d\x05\x58\x05\x75\x05\x00\x00\x00\x00\x4c\x05\x00\x00\x00\x00\x4a\x05\x00\x00\x48\x05\x48\x05\x44\x05\x43\x05\x43\x05\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x37\x05\x00\x00\x00\x00\x42\x05\x00\x00\x40\x05\x00\x00\x24\x00\x00\x00\x00\x00\xb8\x06\x00\x00\x00\x00\x8b\x01\x8b\x01\x8b\x01\x8b\x01\x00\x00\x3e\x05\x3e\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\xff\x00\x00\x00\x00\xd5\x05\x00\x00\x00\x00\x00\x00\x6d\x05\x41\x05\x3c\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x05\x2c\x05\x7c\x05\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x25\x05\x00\x00\x1d\x05\x00\x00\x00\x00\x00\x00"#--happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\x38\x05\xef\x12\x42\x03\x69\x05\x40\x03\xcb\x02\x66\x05\x64\x05\x00\x00\x00\x00\x16\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x0b\x0e\x05\x00\x00\xb6\x02\xc4\x04\x00\x00\x00\x00\x00\x00\x57\x05\x00\x00\xcd\x00\x00\x00\x7f\x03\x00\x00\x00\x00\x11\x05\xe0\x03\x00\x00\x00\x00\xb2\x06\xd2\x12\xb5\x12\xa6\x0f\x98\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x0c\x05\x00\x00\x00\x00\x7b\x12\x00\x00\x00\x00\xf9\x04\x00\x00\x00\x00\xe0\x03\x8f\x06\x29\x0e\x6f\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x05\x4b\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x04\x30\x02\x00\x00\x00\x00\xcf\x0d\x00\x0e\x4c\x0e\x53\x04\x89\x0f\x76\x0f\x00\x00\x00\x00\x5c\x06\x63\x0f\x50\x0f\x00\x00\x00\x00\x5e\x12\x44\x09\x41\x12\x00\x00\xf9\xff\xf5\x03\x4f\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x04\x47\x05\x46\x05\xaa\x04\x3d\x05\x32\x05\x06\x05\x96\x04\x8f\x04\x21\x00\x84\x04\x30\x02\x0d\x05\x72\x04\x06\x04\xfa\x03\xb5\x00\x8d\x04\x81\x04\x7a\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x24\x12\x00\x00\x00\x00\x00\x00\xbe\x06\x00\x00\x00\x00\x3e\x01\x61\x00\x00\x00\x5c\x06\x90\x05\x03\x00\x40\x04\xba\x02\x00\x00\xb3\x02\x00\x00\x1a\x01\x00\x00\x00\x00\x38\x03\xfe\x06\x07\x12\x00\x00\x3c\x03\x00\x00\x3d\x0f\x2a\x0f\x41\x04\xea\x11\xcd\x11\x00\x00\x00\x00\x3f\x04\x90\x07\xf5\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x02\x73\x04\x00\x00\x00\x00\x00\x00\x00\x00\x77\x04\x93\x11\x76\x11\x00\x00\xdf\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\xd8\x08\x04\x04\x21\x04\x00\x00\x00\x00\x00\x00\x3a\x04\x2d\x04\xeb\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x02\x17\x0f\x04\x0f\x00\x00\xf1\x0e\xde\x0e\xa5\x01\x02\x06\x00\x00\xf9\x03\x5c\x06\x28\x05\xcb\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x04\x2b\x04\x20\x04\x09\x04\x03\x04\xfc\x03\xee\x03\xec\x03\xe5\x03\xe2\x03\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x03\xdb\x03\x00\x00\x00\x00\x00\x00\xda\x03\xc4\x03\x27\x00\xb1\x03\x00\x00\x70\x04\x00\x00\x00\x00\x59\x11\xa4\x03\xbc\x06\x00\x00\x00\x00\x04\x00\x00\x00\xff\x01\x36\x01\x9c\x03\x00\x00\x79\x06\x09\x06\x00\x00\x00\x00\x00\x00\xaf\x02\x00\x00\x88\x02\xd9\x01\x00\x00\xfb\xff\xa1\x05\x39\x05\x00\x00\x00\x00\x00\x00\xae\x02\x00\x00\x00\x00\x00\x00\x00\x00\xfc\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x0e\xa5\x0e\x00\x00\x95\x03\x00\x00\x00\x00\x81\x03\x00\x00\x00\x00\x00\x00\xfc\x01\x00\x00\x00\x00\x3c\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x11\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x03\xb9\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x4f\x02\x00\x00\x00\x00\x19\x04\x00\x00\x00\x00\x26\x04\xe5\x02\xf2\x03\x6d\x03\x65\x03\x29\x05\x9d\x03\x70\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\xac\x00\xae\x08\xa6\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x16\x04\x00\x00\x92\x0e\x0f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x03\x62\x03\x00\x00\x00\x00\x02\x11\xe5\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x02\xbf\x02\x00\x00\x00\x00\x3e\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x03\x00\x00\x09\x03\x00\x03\xf3\x02\xcd\x02\xe9\x02\xdd\x02\x00\x00\x00\x00\xcc\x02\x00\x00\xc1\x02\xa4\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x03\x00\x00\xce\x02\x00\x00\xbb\x02\x00\x00\x00\x00\x19\x01\x00\x00\x8e\x00\xc8\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\x3f\x08\xab\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x02\x80\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\xfe\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x01\x00\x00\x00\x00\xf4\x01\x00\x00\xb7\x00\x00\x00\xc6\x01\x71\x10\x00\x00\x41\x00\x54\x10\x37\x10\x25\x02\x00\x00\x00\x00\x00\x00\xe0\x02\x29\x00\xd6\x02\x00\x00\x2f\x02\x00\x00\x53\x02\x43\x02\xfb\x01\x00\x00\x61\x03\x39\x03\x00\x00\x1a\x03\x12\x03\x00\x00\x00\x00\x00\x00\x41\x02\x1a\x10\x00\x00\x63\x02\xfd\x0f\x00\x00\x1c\x02\xe0\x0f\x00\x00\x00\x00\x00\x00\x9b\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x0f\x00\x00\xe2\x01\x00\x00\xd0\x01\xc9\x03\x7d\x03\x00\x00\x00\x00\x43\x00\x66\x07\x00\x00\x26\x00\x32\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01\x68\x01\x00\x00\x00\x00\x00\x00\x22\x02\x00\x00\x00\x00\x00\x00\x07\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\x00\x28\x02\x27\x02\x15\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x01\x5a\x01\x00\x00\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x00\xef\x00\x00\x00\xbe\x00\xae\x00\x00\x00\x00\x00\xdb\x01\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x08\x00\x00\x00\x29\x04\x00\x00\x00\x00\xa6\x0f\x00\x00\x00\x00\x79\x03\xd7\x02\xbc\x02\x4d\x02\x00\x00\x14\x01\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x00\x00\x00\x00\x00\x24\x02\x00\x00\x00\x00\x00\x00\x9a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x35\x00\x9d\x01\x00\x00\x00\x00\x00\x00\x00\x00\xfa\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyDefActions :: HappyAddr-happyDefActions = HappyA# "\xf7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\xff\x6c\xff\x43\xff\xc9\xfe\x57\xff\x55\xff\x54\xff\x51\xff\x00\x00\x2f\xff\x2e\xff\x4e\xff\xa6\xfe\x00\x00\x00\x00\x00\x00\x3f\xff\x3d\xff\x3b\xff\x00\x00\x3c\xff\x00\x00\x3e\xff\x00\x00\x3a\xff\x39\xff\xcd\xfe\x00\x00\x40\xff\x41\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\xff\x6d\xff\x42\xff\x6c\xff\x6b\xff\x00\x00\x00\x00\x78\xfe\xc7\xfe\x58\xff\x00\x00\x00\x00\x00\x00\x20\xff\x1e\xff\x00\x00\x00\x00\x00\x00\x78\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\xff\x00\x00\x65\xff\x00\x00\x44\xff\x34\xff\x00\x00\x00\x00\x82\xff\x00\x00\x00\x00\x00\x00\x64\xff\x00\x00\x00\x00\x00\x00\x00\x00\x79\xfe\x35\xff\x32\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\x00\x00\x78\xfe\x00\x00\x00\x00\x21\xff\x5b\xff\x00\x00\x00\x00\x00\x00\xc3\xfe\x00\x00\x00\x00\x1a\xfe\xc1\xfe\xc0\xfe\xbf\xfe\xbe\xfe\xbd\xfe\xbc\xfe\xc2\xfe\xbb\xfe\xba\xfe\xb9\xfe\xb8\xfe\xb7\xfe\xb6\xfe\xb5\xfe\xae\xfe\xb0\xfe\xaf\xfe\xb4\xfe\xb3\xfe\xb2\xfe\x8d\xff\xb1\xfe\x6a\xfe\x50\xfe\x69\xfe\x68\xfe\x67\xfe\x66\xfe\x64\xfe\x63\xfe\x65\xfe\x62\xfe\x61\xfe\x60\xfe\x5f\xfe\x5e\xfe\x5d\xfe\x5c\xfe\x53\xfe\x56\xfe\x57\xfe\x58\xfe\x55\xfe\x54\xfe\x5b\xfe\x5a\xfe\x59\xfe\x52\xfe\x51\xfe\x18\xfe\x6b\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\xff\xee\xfe\x04\xff\x00\x00\x48\xff\x00\x00\x0f\xff\x0c\xff\x05\xff\x00\x00\x00\x00\x00\x00\x69\xff\x78\xfe\x00\x00\x00\x00\xc9\xfe\x00\x00\x4c\xff\x47\xff\x00\x00\x2d\xff\x00\x00\x00\x00\x78\xfe\xf3\xfe\x00\x00\x00\x00\xf4\xfe\xef\xfe\x00\x00\x00\x00\xc7\xfe\x00\x00\x00\x00\x53\xff\x46\xff\xcb\xfe\x00\x00\x00\x00\xf8\xff\xf6\xff\xf5\xff\xf4\xff\xf3\xff\xf2\xff\xf1\xff\xf0\xff\xef\xff\xee\xff\xed\xff\xec\xff\xeb\xff\xea\xff\xe9\xff\xe8\xff\xe7\xff\xe6\xff\xe5\xff\xe4\xff\xe3\xff\xe2\xff\xe1\xff\xe0\xff\xdf\xff\xde\xff\xdd\xff\xdc\xff\xdb\xff\xda\xff\xd9\xff\xd8\xff\xd7\xff\xd6\xff\xd5\xff\xd4\xff\xd3\xff\xd2\xff\xd1\xff\xd0\xff\xcf\xff\xce\xff\xcd\xff\xcc\xff\xcb\xff\xca\xff\xc9\xff\xc8\xff\xc7\xff\xc6\xff\xc5\xff\xc4\xff\xc3\xff\xc2\xff\xc1\xff\xc0\xff\xbf\xff\xbe\xff\xbd\xff\xbc\xff\xbb\xff\xba\xff\xb9\xff\xb8\xff\xb7\xff\xb6\xff\xb5\xff\xb4\xff\xb3\xff\xb2\xff\xb1\xff\xb0\xff\xaf\xff\xae\xff\xad\xff\xac\xff\xab\xff\xaa\xff\xa9\xff\xa8\xff\xa7\xff\xa6\xff\xa5\xff\xa4\xff\xa3\xff\xa2\xff\xa1\xff\xa0\xff\x9f\xff\x9e\xff\x9d\xff\x9c\xff\x9b\xff\x9a\xff\x99\xff\x98\xff\x97\xff\x96\xff\x95\xff\x94\xff\x93\xff\x92\xff\x91\xff\x90\xff\x8f\xff\x33\xff\xc8\xfe\xcf\xfe\x00\x00\xa8\xfe\xa7\xfe\xa9\xfe\x66\xff\x65\xff\x4e\xff\x00\x00\xf6\xfe\xf7\xfe\x50\xff\xf5\xfe\x00\x00\x00\x00\x00\x00\x6c\xff\x74\xfe\x00\x00\x2c\xff\x2b\xff\x28\xff\x29\xff\x26\xff\x00\x00\xcd\xfe\xcb\xfe\xfe\xfe\x00\x00\xf8\xfe\x00\x00\x00\x00\x00\x00\x02\xff\x00\x00\x01\xff\x64\xff\x03\xff\xed\xfe\x00\x00\x00\x00\x00\x00\xec\xfe\x00\x00\x00\x00\x00\x00\x0b\xff\x07\xff\x0c\xff\x78\xfe\x00\x00\x00\x00\x10\xff\x52\xff\x06\xff\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\xff\x00\x00\x60\xff\x00\x00\x00\x00\x83\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xfe\x95\xfe\x91\xfe\x00\x00\x92\xfe\x8b\xfe\x74\xfe\x00\x00\x97\xfe\xf0\xfe\xf0\xfe\x6c\xfe\x93\xfe\x94\xfe\x00\x00\x86\xff\x00\x00\x00\x00\x98\xfe\x00\x00\xf0\xfe\xf0\xfe\x96\xfe\x8e\xff\x8c\xff\x78\xfe\x89\xff\x88\xff\x1c\xfe\xc6\xfe\x00\x00\x00\x00\x00\x00\x59\xff\x56\xff\x5a\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\xff\x00\x00\x17\xff\x37\xff\x00\x00\x81\xff\x16\xff\x38\xff\x15\xff\x45\xff\x00\x00\x12\xff\x11\xff\x74\xfe\x13\xff\x1d\xff\x1b\xff\x1c\xff\x1a\xff\x18\xff\x19\xff\x00\x00\x00\x00\x1d\xfe\x8a\xff\x8b\xff\x1b\xfe\xf0\xfe\x00\x00\xf0\xfe\x00\x00\x7e\xff\x7a\xff\x00\x00\x2c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\xff\x9b\xfe\x9a\xfe\x99\xfe\x00\x00\x00\x00\xf0\xfe\x74\xfe\xe3\xfe\x00\x00\x8a\xfe\x00\x00\x00\x00\x2f\xfe\x00\x00\x00\x00\x26\xff\x00\x00\x87\xfe\x85\xfe\x80\xfe\x00\x00\x00\x00\x00\x00\x7a\xfe\x90\xfe\x00\x00\x00\x00\x84\xff\x3c\xfe\x00\x00\x5d\xff\x5c\xff\x00\x00\x60\xff\x34\xfe\x5e\xff\x00\x00\x63\xff\x3d\xfe\x36\xfe\x3e\xfe\x00\x00\x00\x00\x37\xfe\x00\x00\x00\x00\x63\xff\x00\x00\x63\xff\x63\xff\x63\xff\x00\x00\x63\xff\x63\xff\x00\x00\x00\x00\x63\xff\x3a\xfe\x00\x00\x00\x00\x09\xff\x08\xff\x0a\xff\x0e\xff\x0d\xff\xfe\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xfe\x00\x00\x00\x00\x4a\xff\x00\x00\x00\x00\xce\xfe\xcc\xfe\x4b\xff\x00\x00\x00\x00\x25\xff\x24\xff\x00\x00\x31\xff\xe3\xfe\x00\x00\x4d\xff\x4f\xff\x1e\xfe\xea\xfe\xeb\xfe\xca\xfe\x22\xff\x27\xff\xe5\xfe\xe3\xfe\xe1\xfe\xe0\xfe\xdf\xfe\x00\x00\xe2\xfe\x00\x00\x00\x00\x2a\xff\x00\x00\x30\xff\x00\xff\xfc\xfe\xfb\xfe\xf9\xfe\xfa\xfe\x00\x00\xe8\xfe\xe9\xfe\xe6\xfe\xe7\xfe\x49\xff\x00\x00\x00\x00\x00\x00\x63\xff\x63\xff\x00\x00\x00\x00\x00\x00\x61\xff\x00\x00\x00\x00\x00\x00\x42\xfe\x00\x00\x39\xfe\x38\xfe\x40\xfe\x3b\xfe\x62\xff\x4f\xfe\x00\x00\x5f\xff\x4c\xfe\x41\xfe\x8e\xfe\x8f\xfe\x00\x00\x7d\xfe\x00\x00\x00\x00\x7d\xfe\x00\x00\x86\xfe\x00\x00\x6c\xff\x00\x00\x00\x00\x31\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x76\xfe\x73\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x68\xff\x7c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\x00\x00\x00\x00\x80\xff\x00\x00\x00\x00\x00\x00\xaa\xfe\x2e\xfe\x00\x00\x00\x00\x7b\xff\x00\x00\x00\x00\xf2\xfe\x00\x00\x00\x00\xf1\xfe\xc5\xfe\xc4\xfe\xe3\xfe\x77\xfe\x00\x00\xa2\xfe\xa1\xfe\xa3\xfe\xac\xfe\x2d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\xff\x76\xff\x7d\xff\x6d\xfe\x74\xfe\xe3\xfe\x6e\xfe\x00\x00\xe3\xfe\x8c\xfe\xad\xfe\x30\xfe\x9e\xfe\x9f\xfe\x28\xfe\x8d\xfe\x89\xfe\x00\x00\x00\x00\x00\x00\x83\xfe\x00\x00\x00\x00\x00\x00\x84\xfe\x33\xfe\x35\xfe\x32\xfe\x3f\xfe\x44\xfe\x48\xfe\x45\xfe\x4a\xfe\x46\xfe\x49\xfe\x00\x00\x00\x00\x4b\xfe\x4d\xfe\x4e\xfe\xff\xfe\x23\xff\xd3\xfe\x87\xff\xd3\xfe\xe4\xfe\xd5\xfe\xd1\xfe\x00\x00\xd2\xfe\x00\x00\x00\x00\x00\x00\xd9\xfe\x00\x00\x87\xff\xdb\xfe\x00\x00\x47\xfe\x43\xfe\x00\x00\x7d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xfe\x25\xfe\x00\x00\x26\xfe\x23\xfe\x24\xfe\x00\x00\x1f\xfe\x00\x00\x22\xfe\x20\xfe\x00\x00\x21\xfe\x00\x00\x75\xfe\xe3\xfe\x70\xfe\x71\xfe\x00\x00\x77\xff\x79\xff\x72\xff\x74\xff\x6e\xff\x70\xff\xab\xfe\x00\x00\x00\x00\xa4\xfe\xa5\xfe\x71\xff\x6f\xff\x75\xff\x73\xff\x00\x00\x6f\xfe\xa0\xfe\x78\xfe\x9d\xfe\x29\xfe\x2b\xfe\x78\xfe\x00\x00\x00\x00\x81\xfe\x7c\xfe\x7b\xfe\x82\xfe\xde\xfe\x00\x00\x00\x00\x87\xff\xdc\xfe\xd7\xfe\xd4\xfe\xdd\xfe\x00\x00\xd0\xfe\xda\xfe\xd8\xfe\xd6\xfe\x7e\xfe\x7f\xfe\x27\xfe\x00\x00\x00\x00\x72\xfe\x00\x00\x2a\xfe\x9c\xfe"#--happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x05\x00\x09\x00\x09\x00\x09\x00\x09\x00\x2d\x00\x0c\x00\x14\x00\x0e\x00\x2d\x00\x0f\x00\x09\x00\x09\x00\x0a\x00\x5d\x00\x00\x00\x5f\x00\x0f\x00\x14\x00\x2d\x00\x09\x00\x13\x00\x14\x00\x52\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x50\x00\x09\x00\x65\x00\x66\x00\x09\x00\x51\x00\x09\x00\x0f\x00\x10\x00\x09\x00\x52\x00\x31\x00\x0f\x00\x10\x00\x50\x00\x0f\x00\x10\x00\x37\x00\x38\x00\x05\x00\x3a\x00\x09\x00\x18\x00\x14\x00\x1d\x00\x1b\x00\x49\x00\x0b\x00\x4b\x00\x65\x00\x23\x00\x4c\x00\x09\x00\x09\x00\x0a\x00\x09\x00\x59\x00\x52\x00\x54\x00\x2c\x00\x55\x00\x0f\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x53\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\x65\x00\x66\x00\x23\x00\x24\x00\x25\x00\x00\x00\x09\x00\x6f\x00\x70\x00\x0b\x00\x75\x00\x73\x00\x74\x00\x61\x00\x11\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\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\x09\x00\x8d\x00\x65\x00\x59\x00\x98\x00\x53\x00\x0f\x00\x75\x00\x09\x00\x72\x00\x2d\x00\x96\x00\x72\x00\xa0\x00\x0f\x00\x09\x00\x4d\x00\x4e\x00\x99\x00\x46\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x9e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x71\x00\x09\x00\x52\x00\x65\x00\x4f\x00\x09\x00\x09\x00\x0f\x00\x50\x00\x55\x00\x09\x00\x0f\x00\x2b\x00\x2c\x00\x11\x00\x67\x00\x0f\x00\x37\x00\x38\x00\x39\x00\x50\x00\x65\x00\x61\x00\x62\x00\x09\x00\x65\x00\x05\x00\x23\x00\x24\x00\x25\x00\x4c\x00\x23\x00\x24\x00\x25\x00\x09\x00\x5f\x00\x52\x00\x24\x00\x14\x00\x55\x00\x0f\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x30\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\x3d\x00\x3e\x00\x3f\x00\x24\x00\x5c\x00\x2d\x00\x5e\x00\x6f\x00\x70\x00\x9e\x00\x9f\x00\x73\x00\x74\x00\x65\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\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\x09\x00\x07\x00\x8d\x00\x6e\x00\x71\x00\x09\x00\x0f\x00\x69\x00\x71\x00\x09\x00\x09\x00\x52\x00\x6e\x00\xa0\x00\xa1\x00\x0f\x00\x0f\x00\x10\x00\x09\x00\x6e\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x51\x00\x65\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\x26\x00\x27\x00\x28\x00\x29\x00\x4f\x00\x0f\x00\x2c\x00\x09\x00\x64\x00\x50\x00\x65\x00\x67\x00\x2a\x00\x2b\x00\x2c\x00\x11\x00\x37\x00\x38\x00\x39\x00\x4f\x00\x5f\x00\x50\x00\x5d\x00\x62\x00\x5f\x00\x23\x00\x24\x00\x25\x00\x4c\x00\x6e\x00\x49\x00\x4a\x00\x4b\x00\x6e\x00\x52\x00\x09\x00\x5f\x00\x55\x00\x62\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\x58\x00\x09\x00\x6b\x00\x6c\x00\x5c\x00\x6e\x00\x5e\x00\x6f\x00\x70\x00\x11\x00\x12\x00\x73\x00\x74\x00\x10\x00\x11\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\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\x09\x00\x07\x00\x54\x00\x8d\x00\x71\x00\x57\x00\x0f\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x09\x00\x09\x00\xa0\x00\x50\x00\x9e\x00\x9f\x00\x0f\x00\x0f\x00\x10\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x5f\x00\x52\x00\x4d\x00\x4e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x51\x00\x09\x00\x27\x00\x28\x00\x29\x00\x56\x00\x5c\x00\x2c\x00\x5e\x00\x65\x00\x5c\x00\x6e\x00\x5e\x00\x4d\x00\x4e\x00\x65\x00\x0b\x00\x37\x00\x38\x00\x65\x00\x3a\x00\x05\x00\x06\x00\x09\x00\x46\x00\x47\x00\x48\x00\x4c\x00\x5c\x00\x09\x00\x5e\x00\x11\x00\x12\x00\x52\x00\x0b\x00\x0f\x00\x55\x00\x65\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\x23\x00\x24\x00\x25\x00\x09\x00\x0b\x00\x51\x00\x09\x00\x6f\x00\x70\x00\x0f\x00\x10\x00\x73\x00\x74\x00\x59\x00\x11\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\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\x09\x00\x07\x00\x30\x00\x0b\x00\x09\x00\x8d\x00\x0f\x00\x35\x00\x9b\x00\x9c\x00\x9d\x00\x09\x00\x09\x00\xa0\x00\x0c\x00\x0d\x00\x3e\x00\x3f\x00\x0f\x00\x10\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\x52\x00\x09\x00\x0c\x00\x09\x00\x0e\x00\x71\x00\x58\x00\x4d\x00\x4e\x00\x0f\x00\x5c\x00\x09\x00\x5e\x00\x09\x00\x0c\x00\x15\x00\x0e\x00\x09\x00\x58\x00\x65\x00\x99\x00\x11\x00\x5c\x00\x6e\x00\x5e\x00\x1f\x00\x20\x00\x21\x00\x68\x00\x23\x00\x24\x00\x25\x00\x6e\x00\x51\x00\x46\x00\x47\x00\x48\x00\x4c\x00\x49\x00\x4a\x00\x4b\x00\x6d\x00\x6e\x00\x52\x00\x32\x00\x5d\x00\x55\x00\x5f\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x30\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\x3d\x00\x3e\x00\x3f\x00\x6d\x00\x6e\x00\x09\x00\x94\x00\x6f\x00\x70\x00\x54\x00\x16\x00\x73\x00\x74\x00\x11\x00\x12\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\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\x09\x00\x09\x00\x16\x00\x9e\x00\x9f\x00\x09\x00\x0f\x00\x1a\x00\x09\x00\x11\x00\x12\x00\x0f\x00\x09\x00\xa0\x00\x09\x00\x0b\x00\x11\x00\x0c\x00\x0f\x00\x0e\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\x22\x00\x23\x00\x24\x00\x25\x00\x0b\x00\x0f\x00\x1a\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\x09\x00\x16\x00\x0c\x00\x17\x00\x0e\x00\x30\x00\x0f\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x3b\x00\x3c\x00\x16\x00\x3e\x00\x3f\x00\x18\x00\x1f\x00\x20\x00\x21\x00\x4c\x00\x23\x00\x24\x00\x25\x00\x09\x00\x16\x00\x52\x00\x9e\x00\x9f\x00\x55\x00\x0f\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x16\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\x16\x00\x4c\x00\x23\x00\x24\x00\x25\x00\x09\x00\x0a\x00\x6f\x00\x70\x00\x16\x00\x55\x00\x73\x00\x74\x00\x09\x00\x0a\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\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\x09\x00\x09\x00\x0a\x00\x16\x00\x09\x00\x58\x00\x0f\x00\x2d\x00\x09\x00\x5c\x00\x09\x00\x5e\x00\x11\x00\xa0\x00\x0f\x00\x10\x00\x0f\x00\x93\x00\x65\x00\x16\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x4d\x00\x4e\x00\x09\x00\x0a\x00\x30\x00\x52\x00\x09\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x58\x00\x9e\x00\x9f\x00\x09\x00\x5c\x00\x3c\x00\x5e\x00\x3e\x00\x3f\x00\x97\x00\x58\x00\x9e\x00\x9f\x00\x65\x00\x5c\x00\x09\x00\x5e\x00\x4c\x00\x0c\x00\x09\x00\x0e\x00\x09\x00\x0c\x00\x52\x00\x0e\x00\x0b\x00\x55\x00\x0f\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x51\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\x0b\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\x09\x00\x6f\x00\x70\x00\x0c\x00\x0d\x00\x73\x00\x74\x00\x05\x00\x06\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\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\x1a\x00\x00\x00\x01\x00\x02\x00\x6d\x00\x6e\x00\x05\x00\x09\x00\x07\x00\x08\x00\x0c\x00\x0a\x00\x0e\x00\xa0\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x19\x00\x12\x00\x13\x00\x14\x00\x15\x00\x1a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x09\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x0f\x00\x16\x00\x25\x00\x26\x00\x27\x00\x19\x00\x29\x00\x2a\x00\x2b\x00\x6d\x00\x6e\x00\x18\x00\x09\x00\x4d\x00\x4e\x00\x0c\x00\x1a\x00\x0e\x00\x52\x00\x09\x00\x23\x00\x24\x00\x25\x00\x1a\x00\x58\x00\x1a\x00\x09\x00\x11\x00\x5c\x00\x51\x00\x5e\x00\x6a\x00\x6b\x00\x6c\x00\x11\x00\x6e\x00\x58\x00\x65\x00\x49\x00\x1a\x00\x5c\x00\x4c\x00\x5e\x00\x4e\x00\x05\x00\x06\x00\x1a\x00\x52\x00\x53\x00\x65\x00\x55\x00\x09\x00\x1a\x00\x58\x00\x0c\x00\x5a\x00\x0e\x00\x5c\x00\x30\x00\x5e\x00\x05\x00\x06\x00\x61\x00\x35\x00\x63\x00\x30\x00\x65\x00\x66\x00\x06\x00\x68\x00\x01\x00\x02\x00\x3e\x00\x3f\x00\x05\x00\x1a\x00\x07\x00\x08\x00\x3d\x00\x3e\x00\x3f\x00\x06\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x1a\x00\x12\x00\x13\x00\x14\x00\x15\x00\x1a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x4d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x9e\x00\x9f\x00\x25\x00\x26\x00\x27\x00\x09\x00\x29\x00\x2a\x00\x2b\x00\x9e\x00\x9f\x00\x0f\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x15\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x4e\x00\x4d\x00\x4e\x00\x1f\x00\x20\x00\x21\x00\x52\x00\x23\x00\x24\x00\x25\x00\x09\x00\x0a\x00\x58\x00\x05\x00\x49\x00\x0b\x00\x5c\x00\x4c\x00\x5e\x00\x4e\x00\x09\x00\x0a\x00\x32\x00\x52\x00\x53\x00\x65\x00\x55\x00\x09\x00\x0a\x00\x58\x00\x4e\x00\x5a\x00\x4f\x00\x5c\x00\x50\x00\x5e\x00\x9e\x00\x9f\x00\x61\x00\x09\x00\x63\x00\x9e\x00\x65\x00\x66\x00\x95\x00\x68\x00\x69\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\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x08\x00\x0a\x00\x9e\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x09\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x9e\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x2f\x00\x30\x00\x25\x00\x26\x00\x27\x00\x9e\x00\x29\x00\x2a\x00\x2b\x00\x09\x00\x09\x00\x0b\x00\x9e\x00\x0c\x00\x0d\x00\x0f\x00\x00\x00\x01\x00\x08\x00\x13\x00\x14\x00\x65\x00\x66\x00\x50\x00\x51\x00\x97\x00\x09\x00\x65\x00\x66\x00\x08\x00\x9e\x00\x1f\x00\x20\x00\x21\x00\x11\x00\x23\x00\x24\x00\x25\x00\x49\x00\x09\x00\x09\x00\x4c\x00\x04\x00\x4e\x00\x9e\x00\x06\x00\x0b\x00\x52\x00\x53\x00\x31\x00\x55\x00\x0b\x00\x50\x00\x58\x00\x4d\x00\x5a\x00\x09\x00\x5c\x00\x9e\x00\x5e\x00\x56\x00\x4f\x00\x02\x00\x01\x00\x63\x00\x30\x00\x65\x00\x66\x00\x03\x00\x68\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x3d\x00\x3e\x00\x3f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x61\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x65\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x14\x00\x65\x00\x25\x00\x26\x00\x27\x00\x59\x00\x29\x00\x2a\x00\x2b\x00\x09\x00\x59\x00\x0b\x00\x65\x00\x28\x00\x60\x00\x0f\x00\x60\x00\x5d\x00\x60\x00\x13\x00\x14\x00\x59\x00\x59\x00\x4f\x00\x65\x00\x5f\x00\x09\x00\x59\x00\x4f\x00\x65\x00\x65\x00\x1f\x00\x20\x00\x21\x00\x11\x00\x23\x00\x24\x00\x25\x00\x49\x00\x64\x00\x64\x00\x4c\x00\x65\x00\x4e\x00\x54\x00\x5f\x00\x54\x00\x52\x00\x53\x00\x31\x00\x55\x00\x54\x00\x54\x00\x58\x00\x2d\x00\x5a\x00\x2d\x00\x5c\x00\x5f\x00\x5e\x00\x2d\x00\x50\x00\x60\x00\x51\x00\x63\x00\x30\x00\x65\x00\x66\x00\x60\x00\x68\x00\x01\x00\x02\x00\x65\x00\x04\x00\x05\x00\x65\x00\x07\x00\x08\x00\x3d\x00\x3e\x00\x3f\x00\x5f\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x60\x00\x12\x00\x13\x00\x14\x00\x15\x00\x51\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x65\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x51\x00\x5d\x00\x25\x00\x26\x00\x27\x00\x5f\x00\x29\x00\x2a\x00\x2b\x00\x64\x00\x4f\x00\x58\x00\x64\x00\x4d\x00\x4e\x00\x64\x00\x64\x00\x64\x00\x52\x00\x09\x00\x54\x00\x64\x00\x64\x00\x52\x00\x58\x00\x64\x00\x09\x00\x11\x00\x5c\x00\x58\x00\x5e\x00\x67\x00\x64\x00\x5c\x00\x11\x00\x5e\x00\x65\x00\x65\x00\x49\x00\x64\x00\x58\x00\x4c\x00\x65\x00\x4e\x00\x58\x00\x5f\x00\x54\x00\x52\x00\x53\x00\x51\x00\x55\x00\x67\x00\x67\x00\x58\x00\x67\x00\x5a\x00\x67\x00\x5c\x00\x30\x00\x5e\x00\x67\x00\x67\x00\x67\x00\x35\x00\x63\x00\x30\x00\x65\x00\x66\x00\x55\x00\x68\x00\x01\x00\x02\x00\x3e\x00\x3f\x00\x05\x00\x64\x00\x07\x00\x08\x00\x3d\x00\x3e\x00\x3f\x00\x67\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x64\x00\x12\x00\x13\x00\x14\x00\x15\x00\x64\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x64\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x64\x00\x67\x00\x25\x00\x26\x00\x27\x00\x09\x00\x29\x00\x2a\x00\x2b\x00\x64\x00\x67\x00\x0f\x00\x64\x00\x50\x00\x64\x00\x51\x00\x2d\x00\x15\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x60\x00\x50\x00\x60\x00\x1f\x00\x20\x00\x21\x00\x59\x00\x23\x00\x24\x00\x25\x00\x09\x00\x5f\x00\x59\x00\x5f\x00\x49\x00\x2d\x00\x2d\x00\x4c\x00\x11\x00\x4e\x00\x65\x00\x51\x00\x32\x00\x52\x00\x53\x00\x51\x00\x55\x00\x65\x00\x64\x00\x58\x00\x67\x00\x5a\x00\x09\x00\x5c\x00\x67\x00\x5e\x00\x67\x00\x67\x00\x0f\x00\x64\x00\x63\x00\x67\x00\x65\x00\x66\x00\x15\x00\x68\x00\x64\x00\x30\x00\x64\x00\x30\x00\x64\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x67\x00\x3d\x00\x3e\x00\x3f\x00\x67\x00\x67\x00\x09\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x08\x00\x32\x00\x64\x00\x11\x00\x67\x00\x09\x00\x67\x00\x09\x00\x67\x00\x54\x00\x12\x00\x6f\x00\x70\x00\x11\x00\x54\x00\x11\x00\x54\x00\x54\x00\x54\x00\x54\x00\x1c\x00\x2e\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x57\x00\x4f\x00\x25\x00\x2e\x00\x27\x00\x65\x00\x29\x00\x30\x00\x51\x00\x5f\x00\x33\x00\x34\x00\x35\x00\x36\x00\x5f\x00\x54\x00\x0b\x00\x30\x00\x0b\x00\x30\x00\x5e\x00\x3e\x00\x3f\x00\x57\x00\x35\x00\x24\x00\x60\x00\x54\x00\x5b\x00\x65\x00\x3d\x00\x3e\x00\x3f\x00\x3e\x00\x3f\x00\x6f\x00\x70\x00\x60\x00\x49\x00\x65\x00\x60\x00\x4c\x00\x4d\x00\x4e\x00\x09\x00\x60\x00\x09\x00\x52\x00\x53\x00\x60\x00\x55\x00\x08\x00\x11\x00\x58\x00\x11\x00\x5a\x00\x68\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x12\x00\x60\x00\x65\x00\x60\x00\x0a\x00\x65\x00\x66\x00\x60\x00\x68\x00\x61\x00\x1c\x00\x60\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x5f\x00\x59\x00\x25\x00\x08\x00\x27\x00\x30\x00\x29\x00\x30\x00\x59\x00\x59\x00\x50\x00\x5f\x00\x35\x00\x12\x00\x50\x00\x69\x00\x5f\x00\x3c\x00\x51\x00\x3e\x00\x3f\x00\x3e\x00\x3f\x00\x1c\x00\x54\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x69\x00\x57\x00\x25\x00\x65\x00\x27\x00\x60\x00\x29\x00\x57\x00\x49\x00\x24\x00\x69\x00\x4c\x00\x4d\x00\x4e\x00\x56\x00\x60\x00\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x49\x00\x68\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x68\x00\xff\xff\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x09\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x0f\x00\xff\xff\x25\x00\x08\x00\x27\x00\xff\xff\x29\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x12\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\x49\x00\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x65\x00\x66\x00\x49\x00\x68\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\x08\x00\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x68\x00\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x08\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x65\x00\x66\x00\xff\xff\x68\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\x08\x00\xff\xff\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x68\x00\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x08\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\x12\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x4d\x00\x4e\x00\xff\xff\xff\xff\x49\x00\x52\x00\xff\xff\x54\x00\xff\xff\x4e\x00\xff\xff\x58\x00\xff\xff\x52\x00\x53\x00\x5c\x00\x55\x00\x5e\x00\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x65\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\x63\x00\x49\x00\x65\x00\x66\x00\xff\xff\x68\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x68\x00\xff\xff\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x09\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x0f\x00\xff\xff\x25\x00\x08\x00\x27\x00\xff\xff\x29\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x12\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\x49\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x4e\x00\xff\xff\xff\xff\x52\x00\x52\x00\x53\x00\xff\xff\x55\x00\xff\xff\x58\x00\x58\x00\x59\x00\x5a\x00\x5c\x00\x5c\x00\x5e\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x65\x00\x66\x00\x49\x00\x68\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\x08\x00\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x68\x00\xff\xff\x1c\x00\x09\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x0f\x00\xff\xff\x25\x00\x08\x00\x27\x00\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\x49\x00\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x49\x00\x68\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\x08\x00\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x68\x00\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x08\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x4d\x00\x4e\x00\xff\xff\xff\xff\x49\x00\x52\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\xff\xff\x58\x00\xff\xff\x52\x00\x53\x00\x5c\x00\x55\x00\x5e\x00\xff\xff\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\x65\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x65\x00\x66\x00\xff\xff\x68\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x08\x00\x57\x00\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x68\x00\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x08\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x4d\x00\x4e\x00\xff\xff\xff\xff\x49\x00\x52\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\xff\xff\x58\x00\xff\xff\x52\x00\x53\x00\x5c\x00\x55\x00\x5e\x00\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x65\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x65\x00\x66\x00\xff\xff\x68\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\x08\x00\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x12\x00\xff\xff\xff\xff\x63\x00\xff\xff\x65\x00\x66\x00\xff\xff\x68\x00\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x08\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x4d\x00\x4e\x00\xff\xff\xff\xff\x49\x00\x52\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\xff\xff\x58\x00\xff\xff\x52\x00\x53\x00\x5c\x00\x55\x00\x5e\x00\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x65\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x65\x00\x66\x00\xff\xff\x68\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\x08\x00\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x68\x00\xff\xff\x1c\x00\x09\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x0f\x00\xff\xff\x25\x00\x08\x00\x27\x00\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\xff\xff\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\x49\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x4e\x00\xff\xff\xff\xff\x52\x00\x52\x00\x53\x00\xff\xff\x55\x00\xff\xff\x58\x00\x58\x00\xff\xff\x5a\x00\x5c\x00\x5c\x00\x5e\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x63\x00\x65\x00\x65\x00\x66\x00\x49\x00\x68\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x08\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x12\x00\x68\x00\xff\xff\xff\xff\xff\xff\x17\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x09\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x0f\x00\xff\xff\x25\x00\x08\x00\x27\x00\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\xff\xff\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x49\x00\x68\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\x08\x00\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x68\x00\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\x08\x00\x27\x00\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\x49\x00\xff\xff\xff\xff\x4c\x00\xff\xff\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x49\x00\x68\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\x08\x00\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x68\x00\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\x65\x00\x66\x00\x4e\x00\x68\x00\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x1c\x00\x68\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\x65\x00\x66\x00\x4e\x00\x68\x00\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x1c\x00\x68\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\x65\x00\x66\x00\x4e\x00\x68\x00\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x1c\x00\x68\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\x65\x00\x66\x00\x4e\x00\x68\x00\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x1c\x00\x68\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\x09\x00\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x4e\x00\x32\x00\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\x09\x00\x58\x00\x0b\x00\x5a\x00\xff\xff\x5c\x00\x0f\x00\x5e\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x68\x00\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\xff\xff\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x09\x00\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\x1f\x00\x20\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\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\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xe1\x01\xbc\x01\xf1\x02\xe9\x01\x08\x00\x90\x02\xea\x01\xfb\x02\xeb\x01\x9a\x02\x09\x00\x08\x00\x98\x01\x00\x02\x4b\x00\xe3\x01\x4c\x00\x09\x00\xa5\x01\xaf\x02\x49\x03\x41\x00\x4b\x01\xa9\x01\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x61\x01\x0d\x00\x0e\x00\x62\x01\x10\x00\x11\x00\x12\x00\x91\x02\x2d\x00\x2b\x00\x2c\x00\x5b\x02\x9b\x02\x2d\x00\x2e\x00\xa6\x01\x2d\x00\xd6\x02\x45\x00\x2e\x00\xc7\x02\xb0\x02\x2e\x00\xc7\x02\x63\x01\x64\x01\x4a\x03\x65\x01\x41\x03\x14\x02\xf6\x02\x5c\x02\x15\x02\xf2\x02\x55\x01\x3f\x03\x0d\x02\x5d\x02\x13\x00\x42\x03\x98\x01\x00\x02\x08\x00\xfc\x02\x69\x00\xec\x01\x5e\x02\x6a\x00\x09\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x01\x02\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2b\x00\x2c\x00\x10\x00\x11\x00\xfb\x01\xe3\x01\xb3\x00\x50\x00\x7b\x00\x48\x03\xbd\x01\x7c\x00\x7d\x00\xe4\x01\x6c\x01\x7f\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\x08\x00\x66\x01\x2b\x00\xd9\x01\xed\x01\xce\x02\x09\x00\xa7\x01\x08\x00\x15\x03\xb2\x02\x02\x02\xc8\x02\x53\x01\x09\x00\x45\x02\xa0\x02\xa1\x02\x2a\x03\x30\x02\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\xaa\x01\x36\x02\x0d\x00\x0e\x00\x62\x01\x10\x00\x11\x00\x12\x00\x17\x03\x08\x00\xda\x02\x2b\x00\xb8\x01\x08\x00\xb3\x00\x09\x00\xb3\x02\x89\x02\x08\x00\x09\x00\xec\x02\x48\x02\xb4\x00\x31\x02\x09\x00\x62\x02\x63\x02\x64\x02\xd5\x01\x0d\x02\xe4\x01\xb9\x01\x2c\x03\x0d\x02\x2d\x03\x10\x00\x11\x00\xfb\x01\x13\x00\x10\x00\x11\x00\xfb\x01\x08\x00\x69\x02\x69\x00\x9d\x01\x68\x00\x6a\x00\x09\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\xe5\x01\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x98\x02\xe7\x01\xd0\x00\xc7\x00\xa4\x02\x69\x00\xa5\x02\x50\x00\x7b\x00\xb9\x01\x22\x03\x7c\x00\x7d\x00\x2b\x00\x7e\x00\x7f\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\x08\x00\x37\x03\x66\x01\x30\x03\x97\x02\xf1\x02\x09\x00\xd2\x02\xb6\x02\x08\x00\x56\x01\xc0\x00\xd3\x02\x9b\x00\x9c\x00\x09\x00\x2e\x00\x57\x01\x45\x02\x31\x03\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x9c\x01\x2b\x00\x36\x02\x0d\x00\x0e\x00\x62\x01\x10\x00\x11\x00\x12\x00\x08\x00\x58\x01\x59\x01\x5a\x01\x5b\x01\xb8\x01\x09\x00\x5c\x01\xb3\x00\xde\x02\xd5\x01\x2b\x00\xdf\x02\x46\x02\x47\x02\x48\x02\x70\x01\x62\x02\x63\x02\x65\x02\xb8\x01\x40\x02\xd5\x01\x4b\x00\xb9\x01\x4c\x00\x10\x00\x11\x00\xfb\x01\x13\x00\x33\x03\xf2\x02\xf3\x02\xf4\x02\x34\x03\x69\x00\x3b\x03\x6b\x02\x6a\x00\xb9\x01\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x07\x03\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x6e\x01\xb3\x00\x8c\x02\x07\x02\xc2\x01\x08\x02\xc3\x01\x50\x00\x7b\x00\xf4\x01\x9c\x02\x7c\x00\x7d\x00\xef\x01\xf0\x01\x7f\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\x08\x00\xf6\x02\x64\x00\x66\x01\xfc\x01\x65\x00\x09\x00\x08\x03\x09\x03\x0a\x03\x0b\x03\x08\x00\x56\x01\x0c\x03\x65\xff\xb9\x01\x23\x03\x09\x00\x2e\x00\x57\x01\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x65\xff\xa9\x01\xf1\x01\xf2\x01\x36\x02\x0d\x00\x0e\x00\x62\x01\x10\x00\x11\x00\x12\x00\x4d\x02\x3c\x03\x5e\x02\x5a\x01\x5b\x01\xdb\x00\xf3\x01\x5c\x01\xf4\x01\x2b\x00\xa7\x02\x06\x03\xa8\x02\xf1\x01\xf2\x01\x2b\x00\x1b\x03\x63\x01\x64\x01\x2b\x00\x37\x02\x2e\x03\x2f\x03\xb3\x00\x40\x03\xf8\x02\xf9\x02\x13\x00\xf3\x01\x08\x00\xf4\x01\xf4\x01\xf5\x01\x69\x00\x1d\x03\x09\x00\x6a\x00\x2b\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x07\x03\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x10\x00\x11\x00\xfb\x01\x2d\x00\xc3\x02\x55\xff\xb3\x00\x50\x00\x7b\x00\x2e\x00\xd7\x01\x7c\x00\x7d\x00\x55\xff\xb4\x00\x7f\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\x08\x00\xf6\x02\x74\x01\xcb\x02\xf1\x02\x66\x01\x09\x00\xfe\x01\x45\x03\x0a\x03\x0b\x03\xe9\x01\x2d\x00\x46\x03\x9d\x02\xc5\x02\x76\x01\xd0\x00\x2e\x00\xa3\x01\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\xe9\x01\xc0\x00\xa2\x02\xea\x01\x08\x00\xeb\x01\x4b\x02\x6e\x01\x3b\x00\x5e\x00\x09\x00\x6f\x01\xe9\x01\x70\x01\xb3\x00\xea\x01\x4c\x00\x24\x03\xa5\x02\x5f\x00\x2b\x00\xd0\x02\xb4\x00\x60\x00\xd4\x02\x61\x00\x6a\x01\x0d\x00\x0e\x00\xff\x01\x10\x00\x11\x00\x4d\x01\xd8\x02\x55\xff\xf7\x02\xf8\x02\xf9\x02\x13\x00\xf2\x02\xfc\x02\xf4\x02\xff\x02\x00\x03\x69\x00\xc8\x01\x55\xff\x6a\x00\x55\xff\x6b\x00\x6c\x00\x6d\x00\x6e\x00\xe5\x01\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xb0\x02\xe7\x01\xd0\x00\x03\x03\x00\x03\xb3\x00\xdc\x02\x50\x00\x7b\x00\xbd\x02\xe6\x02\x7c\x00\x7d\x00\xf4\x01\xf6\x01\x7f\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\x08\x00\xb3\x00\xe7\x02\xb9\x01\xb9\x02\x08\x00\x09\x00\x6c\x02\xb3\x00\xf4\x01\xf7\x01\x09\x00\x08\x00\x53\x01\xe9\x01\x67\x02\xb4\x00\xea\x01\x09\x00\x25\x03\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x08\x00\xd7\x00\x10\x00\x11\x00\xc6\x00\x69\x02\x09\x00\x6d\x02\x5f\x01\x10\x00\x11\x00\xc6\x00\xe9\x01\x08\x00\x6e\x02\xea\x01\x73\x02\x26\x03\xcc\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\xcd\x00\xce\x00\x71\x02\xcf\x00\xd0\x00\x81\x02\xd6\x00\x0d\x00\x0e\x00\x13\x00\x10\x00\x11\x00\x4d\x01\x08\x00\x72\x02\x69\x00\xb9\x01\xbb\x02\x6a\x00\x09\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x75\x02\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x76\x02\x13\x00\x10\x00\x11\x00\x44\x01\x98\x01\xbf\x02\x50\x00\x7b\x00\x77\x02\x14\x00\x7c\x00\x7d\x00\x98\x01\xc0\x02\x7f\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\x08\x00\x98\x01\xc1\x02\x79\x02\xb3\x00\x0a\x02\x09\x00\xbd\x00\x2d\x00\x0b\x02\x08\x00\x0c\x02\xb4\x00\xe4\x01\x2e\x00\x2f\x00\x09\x00\x80\x02\x0d\x02\x7e\x02\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x32\x00\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\xbe\x00\xbf\x00\x98\x01\xc2\x02\xcc\x00\xc0\x00\xa2\x02\x35\x00\x36\x00\x37\x00\x38\x00\xc1\x00\xb9\x01\xc6\x02\xa5\x02\xc2\x00\x4f\x01\xc3\x00\xcf\x00\xd0\x00\xa9\x02\x5a\x00\xb9\x01\xc9\x02\x2b\x00\x5b\x00\xe9\x01\x5c\x00\x13\x00\xea\x01\xe9\x01\x27\x03\x08\x00\xea\x01\x69\x00\x19\x03\xda\x01\x6a\x00\x09\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x39\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\xdd\x01\xc5\x00\x10\x00\x11\x00\xc6\x00\xfa\x01\xe9\x01\x50\x00\x7b\x00\x9d\x02\x9e\x02\x7c\x00\x7d\x00\x6b\x02\x3e\x02\x7f\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\x12\x02\xe3\x01\x9e\x00\x9f\x00\x86\x02\x87\x02\xa0\x00\xe9\x01\xa1\x00\x16\x00\xea\x01\x78\xfe\x1a\x03\x53\x01\xa2\x00\xa3\x00\xa4\x00\xa5\x00\x17\x02\x17\x00\xa6\x00\xa7\x00\xa8\x00\x1f\x02\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\x18\x00\x08\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xae\x00\x09\x00\x19\x02\x1e\x00\xaf\x00\x1f\x00\x1e\x02\x20\x00\xb0\x00\xb1\x00\x89\x02\x8a\x02\x24\x02\xe9\x01\xbe\x00\xbf\x00\xea\x01\x25\x02\xa8\x02\xc0\x00\xb3\x00\x10\x00\x11\x00\x55\x00\x26\x02\x5f\x00\x27\x02\xb3\x00\xb4\x00\xd2\x00\x8e\x02\xd3\x00\x05\x02\x06\x02\x07\x02\xb4\x00\x08\x02\x0a\x02\x2b\x00\x21\x00\x28\x02\x0b\x02\x22\x00\x0c\x02\x23\x00\x91\x02\x92\x02\x29\x02\x24\x00\x25\x00\x0d\x02\x26\x00\xe9\x01\x2a\x02\x27\x00\xea\x01\x28\x00\xad\x02\x29\x00\x74\x01\x2a\x00\xaa\x02\xab\x02\xe4\x01\x34\x02\xb2\x00\xe5\x01\x2b\x00\x2c\x00\x3e\x02\x2d\x00\x9e\x00\x9f\x00\x76\x01\xd0\x00\xa0\x00\x2b\x02\xa1\x00\x16\x00\xb3\x02\xe7\x01\xd0\x00\x40\x02\xa2\x00\xa3\x00\xa4\x00\xa5\x00\x2c\x02\x17\x00\xa6\x00\xa7\x00\xa8\x00\x2d\x02\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\x18\x00\x43\x02\x19\x00\x1a\x00\x1b\x00\x1c\x00\xae\x00\xb9\x01\xb4\x02\x1e\x00\xaf\x00\x1f\x00\x08\x00\x20\x00\xb0\x00\xb1\x00\xb9\x01\xb5\x02\x09\x00\xf0\x02\x56\x02\x57\x02\x58\x02\x59\x02\x4c\x00\x29\x03\x55\x02\x56\x02\x57\x02\x58\x02\x59\x02\x42\x02\xbe\x00\xbf\x00\x6a\x01\x0d\x00\x0e\x00\xc0\x00\x10\x00\x11\x00\x4d\x01\x98\x01\x10\x02\x78\x01\x4f\x02\x21\x00\x50\x02\x79\x01\x22\x00\x7a\x01\x23\x00\x98\x01\x99\x01\xc5\x01\x24\x00\x25\x00\x2b\x00\x26\x00\x98\x01\x9a\x01\x27\x00\x46\x01\x28\x00\x60\x01\x29\x00\x4a\x01\x2a\x00\xb9\x01\xba\x01\x19\xfe\x9c\x01\xb2\x00\x9e\x01\x2b\x00\x2c\x00\x9f\x01\x2d\x00\x19\xfe\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\x01\x01\x01\x02\x01\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x21\x01\x22\x01\x23\x01\x24\x01\x25\x01\x26\x01\x27\x01\x28\x01\x29\x01\x2a\x01\x2b\x01\x2c\x01\x2d\x01\x2e\x01\x2f\x01\x30\x01\x31\x01\x32\x01\x33\x01\x34\x01\x35\x01\x36\x01\x37\x01\x38\x01\x39\x01\x3a\x01\x3b\x01\x3c\x01\x3d\x01\x3e\x01\x3f\x01\x40\x01\x41\x01\x42\x01\x43\x01\x44\x01\x9e\x00\x9f\x00\x0e\x03\x0f\x03\xa0\x00\x10\x03\xa1\x00\x16\x00\xab\x01\x78\xfe\xa1\x01\x11\x03\xa2\x00\xa3\x00\xa4\x00\x12\x03\xa2\x01\x17\x00\xa6\x00\xa7\x00\xa8\x00\x13\x03\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\x18\x00\xa5\x01\x19\x00\x1a\x00\x1b\x00\x1c\x00\xae\x00\x5c\x00\x38\x00\x1e\x00\xaf\x00\x1f\x00\xa9\x01\x20\x00\xb0\x00\xb1\x00\x08\x00\xe9\x01\x32\x02\xaa\x01\x9d\x02\xa1\x02\x09\x00\x40\x00\x07\x00\xad\x01\x4e\x01\x42\x00\x2b\x00\x2c\x00\xd5\x00\xd6\x00\xaf\x01\xb3\x00\x2b\x00\x2c\x00\xae\x01\xb3\x01\x4c\x01\x0d\x00\x0e\x00\xb4\x00\x10\x00\x11\x00\x4d\x01\x21\x00\xb1\x01\xb2\x01\x22\x00\xb4\x01\x23\x00\xc9\x01\xb6\x01\xd0\x01\x24\x00\x25\x00\x49\x00\x26\x00\xd1\x01\x66\x00\x27\x00\xc3\x00\x28\x00\xc9\x00\x29\x00\xca\x00\x2a\x00\xd3\x00\xd8\x00\xdb\x00\x07\x00\xb2\x00\xe5\x01\x2b\x00\x2c\x00\x30\x00\x2d\x00\x9e\x00\x9f\x00\x0e\x03\x0f\x03\xa0\x00\x10\x03\xa1\x00\x16\x00\xe6\x01\xe7\x01\xd0\x00\x11\x03\xa2\x00\xa3\x00\xa4\x00\x12\x03\x4c\x03\x17\x00\xa6\x00\xa7\x00\xa8\x00\x13\x03\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\x18\x00\x2b\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xae\x00\xfb\x02\x2b\x00\x1e\x00\xaf\x00\x1f\x00\x44\x03\x20\x00\xb0\x00\xb1\x00\x08\x00\x45\x03\x69\x01\x2b\x00\x39\x03\xbc\x01\x09\x00\xd2\x02\x33\x03\x2c\x03\x4e\x01\x42\x00\x37\x03\x3b\x03\x3a\x03\x0d\x02\x36\x03\xb3\x00\x3e\x03\x3f\x03\x0d\x02\x2b\x00\x4c\x01\x0d\x00\x0e\x00\xb4\x00\x10\x00\x11\x00\x4d\x01\x21\x00\xfe\x02\xff\x02\x22\x00\x0d\x02\x23\x00\x02\x03\x1d\x03\x03\x03\x24\x00\x25\x00\x49\x00\x26\x00\x05\x03\x06\x03\x27\x00\x14\x03\x28\x00\x21\x03\x29\x00\x1f\x03\x2a\x00\x22\x03\xbf\x02\xbc\x01\xcb\x02\xb2\x00\xe5\x01\x2b\x00\x2c\x00\xbc\x01\x2d\x00\x9e\x00\x9f\x00\x2b\x00\x48\x03\xa0\x00\x2b\x00\xa1\x00\x16\x00\xe8\x01\xe7\x01\xd0\x00\xc5\x02\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xd2\x02\x17\x00\xa6\x00\xa7\x00\xa8\x00\xd7\x02\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\x18\x00\x0d\x02\x19\x00\x1a\x00\x1b\x00\x1c\x00\xae\x00\xdb\x02\xd8\x02\x1e\x00\xaf\x00\x1f\x00\xdc\x02\x20\x00\xb0\x00\xb1\x00\xe0\x02\x60\x02\xee\x02\xe1\x02\xef\xfe\xef\xfe\xe2\x02\xe3\x02\xe4\x02\xef\xfe\xb3\x00\xef\xfe\xe5\x02\xe6\x02\xc0\x00\xef\xfe\xe9\x02\xb3\x00\xb4\x00\xef\xfe\x5a\x00\xef\xfe\x1b\x02\xea\x02\x72\x01\xb4\x00\x73\x01\x2b\x00\xef\xfe\x21\x00\xeb\x02\xef\x02\x22\x00\x2b\x00\x23\x00\xf0\x02\x61\x02\x67\x02\x24\x00\x25\x00\x4d\x02\x26\x00\x14\x02\x1b\x02\x27\x00\x70\x02\x28\x00\x71\x02\x29\x00\x74\x01\x2a\x00\x1b\x02\x75\x02\x1b\x02\x35\x02\xb2\x00\xe5\x01\x2b\x00\x2c\x00\x8c\x02\x2d\x00\x9e\x00\x9f\x00\x76\x01\xd0\x00\xa0\x00\x79\x02\xa1\x00\x16\x00\xf8\x01\xe7\x01\xd0\x00\x1b\x02\xa2\x00\xa3\x00\xa4\x00\xa5\x00\x7b\x02\x17\x00\xa6\x00\xa7\x00\xa8\x00\x7c\x02\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\x18\x00\x7d\x02\x19\x00\x1a\x00\x1b\x00\x1c\x00\xae\x00\x7e\x02\x1b\x02\x1e\x00\xaf\x00\x1f\x00\x08\x00\x20\x00\xb0\x00\xb1\x00\x80\x02\x17\x02\x09\x00\x83\x02\x94\x02\x84\x02\x95\x02\x9c\x02\x4c\x00\x14\x03\x55\x02\x56\x02\x57\x02\x58\x02\x59\x02\xb1\x01\xad\x02\xbc\x01\x6a\x01\x0d\x00\x0e\x00\xda\x01\x10\x00\x11\x00\x4d\x01\xb3\x00\xdc\x01\xdd\x01\xdf\x01\x21\x00\xe0\x01\xe1\x01\x22\x00\xb4\x00\x23\x00\x2b\x00\x0f\x02\x4f\x00\x24\x00\x25\x00\x10\x02\x26\x00\x2b\x00\x12\x02\x27\x00\x14\x02\x28\x00\x08\x00\x29\x00\x17\x02\x2a\x00\x19\x02\x1b\x02\x09\x00\x1c\x02\xb2\x00\x19\x02\x2b\x00\x2c\x00\x4c\x00\x2d\x00\x1d\x02\x80\x01\x1e\x02\xe5\x01\x21\x02\x4d\x00\x33\x00\x0b\x00\x4e\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x14\x02\xf9\x01\xe7\x01\xd0\x00\x22\x02\x23\x02\xb3\x00\x35\x00\x36\x00\x37\x00\x38\x00\x16\x00\x4f\x00\x2f\x02\xb4\x00\x24\x02\xb3\x00\x17\x02\xb3\x00\x14\x02\x0d\xff\x17\x00\x50\x00\x51\x00\xb4\x00\x0e\xff\xb4\x00\x0a\xff\x08\xff\x09\xff\x42\x02\x18\x00\x48\x01\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\xc5\x00\x4a\x02\x1e\x00\x48\x01\x1f\x00\x2b\x00\x20\x00\xb5\x00\x4d\x02\x4b\x02\xb6\x00\xb7\x00\xb8\x00\xb9\x00\x52\x02\x51\x01\x55\x01\xe5\x01\x56\x01\x74\x01\x5e\x01\xba\x00\xbb\x00\x5f\x01\x75\x01\xda\x00\x74\x01\x7b\x01\x7e\x01\x2b\x00\x03\x02\xe7\x01\xd0\x00\x76\x01\xd0\x00\x50\x00\x51\x00\xcc\x00\x21\x00\x2b\x00\xa1\x01\x29\x03\x3b\x00\x3c\x00\xb3\x00\xcc\x00\xb3\x00\x24\x00\x25\x00\xcc\x00\x26\x00\x16\x00\xb4\x00\x3d\x00\xb4\x00\x28\x00\xad\x01\x3e\x00\x4b\x00\x3f\x00\x4c\x00\x17\x00\xb1\x01\x2b\x00\xcc\x00\xcc\x01\x2b\x00\x2c\x00\xbc\x01\x2d\x00\xb6\x01\x18\x00\xcc\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\xd0\x01\xcb\x01\x1e\x00\x16\x00\x1f\x00\xcc\x00\x20\x00\x74\x01\xcd\x01\xce\x01\xcf\x01\xd3\x01\x7c\x01\x17\x00\xd5\x01\xff\xff\xd4\x01\x52\x01\x66\x00\xcf\x00\xd0\x00\x76\x01\xd0\x00\x18\x00\x62\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\xc5\x00\x1e\x00\x2b\x00\x1f\x00\xcc\x00\x20\x00\x65\x00\x21\x00\xda\x00\xff\xff\x96\x02\x3b\x00\x3c\x00\xdb\x00\x32\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x28\x00\x00\x00\x3e\x00\x4b\x00\x3f\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x21\x00\x2d\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x28\x00\x00\x00\x3e\x00\x4b\x00\x3f\x00\x4c\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x08\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x09\x00\x00\x00\x1e\x00\x16\x00\x1f\x00\x00\x00\x20\x00\x16\x03\x55\x02\x56\x02\x57\x02\x58\x02\x59\x02\x17\x00\x45\x01\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x3d\x00\x55\x00\x28\x00\x00\x00\x3e\x00\x00\x00\x3f\x00\xb7\x02\x55\x02\x56\x02\x57\x02\x58\x02\x59\x02\x2b\x00\x2c\x00\x21\x00\x2d\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x16\x00\x00\x00\x3d\x00\x00\x00\x28\x00\x00\x00\x3e\x00\x4b\x00\x3f\x00\x4c\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x16\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x4b\x00\x2a\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x23\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x16\x00\x00\x00\x27\x00\x34\x02\x28\x00\x00\x00\x29\x00\x00\x00\x2a\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x16\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x17\x00\x54\x02\x55\x02\x56\x02\x57\x02\x58\x02\x59\x02\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\xbe\x00\xbf\x00\x00\x00\x00\x00\x21\x00\xc0\x00\x00\x00\x0b\xff\x00\x00\x23\x00\x00\x00\x78\x01\x00\x00\x24\x00\x25\x00\x79\x01\x26\x00\x7a\x01\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x2b\x00\x2a\x00\x68\x01\x00\x00\x00\x00\x00\x00\x69\x01\x21\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x23\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x4b\x00\x2a\x00\x4c\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x08\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x09\x00\x00\x00\x1e\x00\x16\x00\x1f\x00\x00\x00\x20\x00\x96\x02\x55\x02\x56\x02\x57\x02\x58\x02\x59\x02\x17\x00\x00\x00\x44\x02\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x00\x00\x21\x00\x00\x00\x00\x00\xbe\x00\xbf\x00\x23\x00\x00\x00\x00\x00\xc0\x00\x24\x00\x25\x00\x00\x00\x26\x00\x00\x00\x5f\x00\x27\x00\x6c\x01\x28\x00\xd2\x00\x29\x00\x05\x02\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2c\x00\x21\x00\x2d\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x16\x00\x00\x00\x3d\x00\x00\x00\x28\x00\x00\x00\x3e\x00\x00\x00\x3f\x00\x47\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x18\x00\x08\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x09\x00\x00\x00\x1e\x00\x16\x00\x1f\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\xbf\x01\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x3d\x00\x55\x00\x28\x00\x00\x00\x3e\x00\x00\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x21\x00\x2d\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x16\x00\x00\x00\x3d\x00\x00\x00\x28\x00\x00\x00\x3e\x00\x00\x00\x3f\x00\x47\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x16\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\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\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\xbe\x00\xbf\x00\x00\x00\x00\x00\x21\x00\xc0\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x78\x01\x00\x00\x24\x00\x25\x00\x79\x01\x26\x00\x7a\x01\x00\x00\x3d\x00\x55\x00\x28\x00\x00\x00\x3e\x00\x2b\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x23\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x47\xff\x26\x00\x16\x00\x47\xff\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x00\x00\x2a\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x16\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\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\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\xbe\x00\xbf\x00\x00\x00\x00\x00\x21\x00\xc0\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x5f\x00\x00\x00\x24\x00\x25\x00\xd2\x00\x26\x00\xd3\x00\x00\x00\x3d\x00\x00\x00\x28\x00\x00\x00\x3e\x00\x2b\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x23\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x16\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x00\x00\x2a\x00\x00\x00\x17\x00\x00\x00\x00\x00\x69\x01\x00\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x16\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\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\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\xbe\x00\xbf\x00\x00\x00\x00\x00\x21\x00\xc0\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x78\x01\x00\x00\x24\x00\x25\x00\x79\x01\x26\x00\x7a\x01\x00\x00\x3d\x00\x00\x00\x28\x00\x00\x00\x3e\x00\x2b\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x23\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x16\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x00\x00\x2a\x00\x32\x02\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x18\x00\x08\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x09\x00\x00\x00\x1e\x00\x16\x00\x1f\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x3c\x02\x0d\x00\x0e\x00\x3d\x02\x10\x00\x11\x00\x12\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x00\x00\x21\x00\x00\x00\x00\x00\xbe\x00\xbf\x00\x23\x00\x00\x00\x00\x00\xc0\x00\x24\x00\x25\x00\x00\x00\x26\x00\x00\x00\x5f\x00\x27\x00\x00\x00\x28\x00\xd2\x00\x29\x00\xd3\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x01\x2b\x00\x2b\x00\x2c\x00\x21\x00\x2d\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x28\x00\x00\x00\x3e\x00\x16\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x53\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x08\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x09\x00\x00\x00\x1e\x00\x16\x00\x1f\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\xd6\x00\x0d\x00\x0e\x00\xd7\x00\x10\x00\x11\x00\x12\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x21\x00\x2d\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x16\x00\x00\x00\x3d\x00\x00\x00\x28\x00\x00\x00\x3e\x00\x00\x00\x3f\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x16\x00\x1f\x00\x00\x00\x20\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\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x00\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x21\x00\x2d\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x16\x00\x00\x00\x3d\x00\x00\x00\x28\x00\x00\x00\x3e\x00\x00\x00\x3f\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1f\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\x18\x00\x00\x00\x19\x00\x1a\x00\x00\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x23\x00\x2d\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x19\x03\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x18\x00\x2d\x00\x19\x00\x1a\x00\x00\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\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\x18\x00\x00\x00\x19\x00\x1a\x00\x00\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x23\x00\x2d\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\xfe\x01\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x18\x00\x2d\x00\x19\x00\x1a\x00\x00\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\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\x18\x00\x00\x00\x19\x00\x1a\x00\x00\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x23\x00\x2d\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x18\x00\x2d\x00\x19\x00\x1a\x00\x00\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\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\x18\x00\x00\x00\x19\x00\x1a\x00\x00\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x28\x00\x00\x00\x58\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x23\x00\x2d\x00\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x29\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x18\x00\x2d\x00\x19\x00\x1a\x00\x00\x00\x1c\x00\x1d\x00\x00\x00\x00\x00\x1e\x00\x08\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x33\x00\x0b\x00\x4e\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x35\x00\x36\x00\x37\x00\x38\x00\x23\x00\xc8\x01\x00\x00\x00\x00\x24\x00\x25\x00\x00\x00\x00\x00\x00\x00\x08\x00\x27\x00\x47\x00\x28\x00\x00\x00\x29\x00\x09\x00\xc9\x00\x00\x00\x00\x00\x41\x00\x42\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x48\x00\x33\x00\x0b\x00\x44\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x36\x00\x37\x00\x38\x00\xc7\x01\x08\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x33\x00\x0b\x00\x44\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x35\x00\x36\x00\x37\x00\x38\x00\x49\x00\x09\x00\x00\x00\x00\x00\x00\x00\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x33\x00\x0b\x00\x44\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x35\x00\x36\x00\x37\x00\x38\x00\xc6\x01\x09\x00\x00\x00\x00\x00\x00\x00\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x33\x00\x0b\x00\x44\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x02\x35\x00\x36\x00\x37\x00\x38\x00\x45\x00\x09\x00\x00\x00\x00\x00\x00\x00\x41\x00\x4b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x41\x00\x42\x00\x00\x00\x00\x00\x46\x02\x47\x02\x48\x02\x00\x00\x00\x00\x08\x00\x00\x00\x45\x00\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\xc6\x01\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x41\x00\x4b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\xc7\x01\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x38\x02\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x45\x00\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x39\x02\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\xc3\x01\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x3a\x02\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\xc4\x01\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x3b\x02\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\xc6\x01\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x41\x00\x4b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\xc7\x01\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x4e\x01\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x45\x00\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x49\x00\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x45\x00\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x49\x00\x4c\x01\x0d\x00\x0e\x00\x09\x00\x10\x00\x11\x00\x4d\x01\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x01\x4c\x01\x0d\x00\x0e\x00\x00\x00\x10\x00\x11\x00\x4d\x01\x08\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x03\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x01\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x01\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x02\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x01\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x01\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x01\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x01\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x01\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x01\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x00\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x35\x00\x36\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x33\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x34\x00\x10\x00\x11\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x36\x00\x37\x00\x38\x00\x7f\x01\x80\x01\x81\x01\x82\x01\x83\x01\x84\x01\x85\x01\x86\x01\x87\x01\x88\x01\x89\x01\x8a\x01\x8b\x01\x8c\x01\x8d\x01\x8e\x01\x8f\x01\x90\x01\x91\x01\x92\x01\x93\x01\x94\x01\x95\x01\x96\x01\x97\x01\x98\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 (6, 487) [- (6 , happyReduce_6),- (7 , happyReduce_7),- (8 , happyReduce_8),- (9 , happyReduce_9),- (10 , happyReduce_10),- (11 , happyReduce_11),- (12 , happyReduce_12),- (13 , happyReduce_13),- (14 , happyReduce_14),- (15 , happyReduce_15),- (16 , happyReduce_16),- (17 , happyReduce_17),- (18 , happyReduce_18),- (19 , happyReduce_19),- (20 , happyReduce_20),- (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),- (110 , happyReduce_110),- (111 , happyReduce_111),- (112 , happyReduce_112),- (113 , happyReduce_113),- (114 , happyReduce_114),- (115 , happyReduce_115),- (116 , happyReduce_116),- (117 , happyReduce_117),- (118 , happyReduce_118),- (119 , happyReduce_119),- (120 , happyReduce_120),- (121 , happyReduce_121),- (122 , happyReduce_122),- (123 , happyReduce_123),- (124 , happyReduce_124),- (125 , happyReduce_125),- (126 , happyReduce_126),- (127 , happyReduce_127),- (128 , happyReduce_128),- (129 , happyReduce_129),- (130 , happyReduce_130),- (131 , happyReduce_131),- (132 , happyReduce_132),- (133 , happyReduce_133),- (134 , happyReduce_134),- (135 , happyReduce_135),- (136 , happyReduce_136),- (137 , happyReduce_137),- (138 , happyReduce_138),- (139 , happyReduce_139),- (140 , happyReduce_140),- (141 , happyReduce_141),- (142 , happyReduce_142),- (143 , happyReduce_143),- (144 , happyReduce_144),- (145 , happyReduce_145),- (146 , happyReduce_146),- (147 , happyReduce_147),- (148 , happyReduce_148),- (149 , happyReduce_149),- (150 , happyReduce_150),- (151 , happyReduce_151),- (152 , happyReduce_152),- (153 , happyReduce_153),- (154 , happyReduce_154),- (155 , happyReduce_155),- (156 , happyReduce_156),- (157 , happyReduce_157),- (158 , happyReduce_158),- (159 , happyReduce_159),- (160 , happyReduce_160),- (161 , happyReduce_161),- (162 , happyReduce_162),- (163 , happyReduce_163),- (164 , happyReduce_164),- (165 , happyReduce_165),- (166 , happyReduce_166),- (167 , happyReduce_167),- (168 , happyReduce_168),- (169 , happyReduce_169),- (170 , happyReduce_170),- (171 , happyReduce_171),- (172 , happyReduce_172),- (173 , happyReduce_173),- (174 , happyReduce_174),- (175 , happyReduce_175),- (176 , happyReduce_176),- (177 , happyReduce_177),- (178 , happyReduce_178),- (179 , happyReduce_179),- (180 , happyReduce_180),- (181 , happyReduce_181),- (182 , happyReduce_182),- (183 , happyReduce_183),- (184 , happyReduce_184),- (185 , happyReduce_185),- (186 , happyReduce_186),- (187 , happyReduce_187),- (188 , happyReduce_188),- (189 , happyReduce_189),- (190 , happyReduce_190),- (191 , happyReduce_191),- (192 , happyReduce_192),- (193 , happyReduce_193),- (194 , happyReduce_194),- (195 , happyReduce_195),- (196 , happyReduce_196),- (197 , happyReduce_197),- (198 , happyReduce_198),- (199 , happyReduce_199),- (200 , happyReduce_200),- (201 , happyReduce_201),- (202 , happyReduce_202),- (203 , happyReduce_203),- (204 , happyReduce_204),- (205 , happyReduce_205),- (206 , happyReduce_206),- (207 , happyReduce_207),- (208 , happyReduce_208),- (209 , happyReduce_209),- (210 , happyReduce_210),- (211 , happyReduce_211),- (212 , happyReduce_212),- (213 , happyReduce_213),- (214 , happyReduce_214),- (215 , happyReduce_215),- (216 , happyReduce_216),- (217 , happyReduce_217),- (218 , happyReduce_218),- (219 , happyReduce_219),- (220 , happyReduce_220),- (221 , happyReduce_221),- (222 , happyReduce_222),- (223 , happyReduce_223),- (224 , happyReduce_224),- (225 , happyReduce_225),- (226 , happyReduce_226),- (227 , happyReduce_227),- (228 , happyReduce_228),- (229 , happyReduce_229),- (230 , happyReduce_230),- (231 , happyReduce_231),- (232 , happyReduce_232),- (233 , happyReduce_233),- (234 , happyReduce_234),- (235 , happyReduce_235),- (236 , happyReduce_236),- (237 , happyReduce_237),- (238 , happyReduce_238),- (239 , happyReduce_239),- (240 , happyReduce_240),- (241 , happyReduce_241),- (242 , happyReduce_242),- (243 , happyReduce_243),- (244 , happyReduce_244),- (245 , happyReduce_245),- (246 , happyReduce_246),- (247 , happyReduce_247),- (248 , happyReduce_248),- (249 , happyReduce_249),- (250 , happyReduce_250),- (251 , happyReduce_251),- (252 , happyReduce_252),- (253 , happyReduce_253),- (254 , happyReduce_254),- (255 , happyReduce_255),- (256 , happyReduce_256),- (257 , happyReduce_257),- (258 , happyReduce_258),- (259 , happyReduce_259),- (260 , happyReduce_260),- (261 , happyReduce_261),- (262 , happyReduce_262),- (263 , happyReduce_263),- (264 , happyReduce_264),- (265 , happyReduce_265),- (266 , happyReduce_266),- (267 , happyReduce_267),- (268 , happyReduce_268),- (269 , happyReduce_269),- (270 , happyReduce_270),- (271 , happyReduce_271),- (272 , happyReduce_272),- (273 , happyReduce_273),- (274 , happyReduce_274),- (275 , happyReduce_275),- (276 , happyReduce_276),- (277 , happyReduce_277),- (278 , happyReduce_278),- (279 , happyReduce_279),- (280 , happyReduce_280),- (281 , happyReduce_281),- (282 , happyReduce_282),- (283 , happyReduce_283),- (284 , happyReduce_284),- (285 , happyReduce_285),- (286 , happyReduce_286),- (287 , happyReduce_287),- (288 , happyReduce_288),- (289 , happyReduce_289),- (290 , happyReduce_290),- (291 , happyReduce_291),- (292 , happyReduce_292),- (293 , happyReduce_293),- (294 , happyReduce_294),- (295 , happyReduce_295),- (296 , happyReduce_296),- (297 , happyReduce_297),- (298 , happyReduce_298),- (299 , happyReduce_299),- (300 , happyReduce_300),- (301 , happyReduce_301),- (302 , happyReduce_302),- (303 , happyReduce_303),- (304 , happyReduce_304),- (305 , happyReduce_305),- (306 , happyReduce_306),- (307 , happyReduce_307),- (308 , happyReduce_308),- (309 , happyReduce_309),- (310 , happyReduce_310),- (311 , happyReduce_311),- (312 , happyReduce_312),- (313 , happyReduce_313),- (314 , happyReduce_314),- (315 , happyReduce_315),- (316 , happyReduce_316),- (317 , happyReduce_317),- (318 , happyReduce_318),- (319 , happyReduce_319),- (320 , happyReduce_320),- (321 , happyReduce_321),- (322 , happyReduce_322),- (323 , happyReduce_323),- (324 , happyReduce_324),- (325 , happyReduce_325),- (326 , happyReduce_326),- (327 , happyReduce_327),- (328 , happyReduce_328),- (329 , happyReduce_329),- (330 , happyReduce_330),- (331 , happyReduce_331),- (332 , happyReduce_332),- (333 , happyReduce_333),- (334 , happyReduce_334),- (335 , happyReduce_335),- (336 , happyReduce_336),- (337 , happyReduce_337),- (338 , happyReduce_338),- (339 , happyReduce_339),- (340 , happyReduce_340),- (341 , happyReduce_341),- (342 , happyReduce_342),- (343 , happyReduce_343),- (344 , happyReduce_344),- (345 , happyReduce_345),- (346 , happyReduce_346),- (347 , happyReduce_347),- (348 , happyReduce_348),- (349 , happyReduce_349),- (350 , happyReduce_350),- (351 , happyReduce_351),- (352 , happyReduce_352),- (353 , happyReduce_353),- (354 , happyReduce_354),- (355 , happyReduce_355),- (356 , happyReduce_356),- (357 , happyReduce_357),- (358 , happyReduce_358),- (359 , happyReduce_359),- (360 , happyReduce_360),- (361 , happyReduce_361),- (362 , happyReduce_362),- (363 , happyReduce_363),- (364 , happyReduce_364),- (365 , happyReduce_365),- (366 , happyReduce_366),- (367 , happyReduce_367),- (368 , happyReduce_368),- (369 , happyReduce_369),- (370 , happyReduce_370),- (371 , happyReduce_371),- (372 , happyReduce_372),- (373 , happyReduce_373),- (374 , happyReduce_374),- (375 , happyReduce_375),- (376 , happyReduce_376),- (377 , happyReduce_377),- (378 , happyReduce_378),- (379 , happyReduce_379),- (380 , happyReduce_380),- (381 , happyReduce_381),- (382 , happyReduce_382),- (383 , happyReduce_383),- (384 , happyReduce_384),- (385 , happyReduce_385),- (386 , happyReduce_386),- (387 , happyReduce_387),- (388 , happyReduce_388),- (389 , happyReduce_389),- (390 , happyReduce_390),- (391 , happyReduce_391),- (392 , happyReduce_392),- (393 , happyReduce_393),- (394 , happyReduce_394),- (395 , happyReduce_395),- (396 , happyReduce_396),- (397 , happyReduce_397),- (398 , happyReduce_398),- (399 , happyReduce_399),- (400 , happyReduce_400),- (401 , happyReduce_401),- (402 , happyReduce_402),- (403 , happyReduce_403),- (404 , happyReduce_404),- (405 , happyReduce_405),- (406 , happyReduce_406),- (407 , happyReduce_407),- (408 , happyReduce_408),- (409 , happyReduce_409),- (410 , happyReduce_410),- (411 , happyReduce_411),- (412 , happyReduce_412),- (413 , happyReduce_413),- (414 , happyReduce_414),- (415 , happyReduce_415),- (416 , happyReduce_416),- (417 , happyReduce_417),- (418 , happyReduce_418),- (419 , happyReduce_419),- (420 , happyReduce_420),- (421 , happyReduce_421),- (422 , happyReduce_422),- (423 , happyReduce_423),- (424 , happyReduce_424),- (425 , happyReduce_425),- (426 , happyReduce_426),- (427 , happyReduce_427),- (428 , happyReduce_428),- (429 , happyReduce_429),- (430 , happyReduce_430),- (431 , happyReduce_431),- (432 , happyReduce_432),- (433 , happyReduce_433),- (434 , happyReduce_434),- (435 , happyReduce_435),- (436 , happyReduce_436),- (437 , happyReduce_437),- (438 , happyReduce_438),- (439 , happyReduce_439),- (440 , happyReduce_440),- (441 , happyReduce_441),- (442 , happyReduce_442),- (443 , happyReduce_443),- (444 , happyReduce_444),- (445 , happyReduce_445),- (446 , happyReduce_446),- (447 , happyReduce_447),- (448 , happyReduce_448),- (449 , happyReduce_449),- (450 , happyReduce_450),- (451 , happyReduce_451),- (452 , happyReduce_452),- (453 , happyReduce_453),- (454 , happyReduce_454),- (455 , happyReduce_455),- (456 , happyReduce_456),- (457 , happyReduce_457),- (458 , happyReduce_458),- (459 , happyReduce_459),- (460 , happyReduce_460),- (461 , happyReduce_461),- (462 , happyReduce_462),- (463 , happyReduce_463),- (464 , happyReduce_464),- (465 , happyReduce_465),- (466 , happyReduce_466),- (467 , happyReduce_467),- (468 , happyReduce_468),- (469 , happyReduce_469),- (470 , happyReduce_470),- (471 , happyReduce_471),- (472 , happyReduce_472),- (473 , happyReduce_473),- (474 , happyReduce_474),- (475 , happyReduce_475),- (476 , happyReduce_476),- (477 , happyReduce_477),- (478 , happyReduce_478),- (479 , happyReduce_479),- (480 , happyReduce_480),- (481 , happyReduce_481),- (482 , happyReduce_482),- (483 , happyReduce_483),- (484 , happyReduce_484),- (485 , happyReduce_485),- (486 , happyReduce_486),- (487 , happyReduce_487)- ]--happy_n_terms = 106 :: Int-happy_n_nonterms = 162 :: Int--happyReduce_6 = happySpecReduce_1 0# happyReduction_6-happyReduction_6 happy_x_1- = case happyOut10 happy_x_1 of { happy_var_1 -> - happyIn9- (reverse happy_var_1- )}--happyReduce_7 = happySpecReduce_2 1# happyReduction_7-happyReduction_7 happy_x_2- happy_x_1- = case happyOut10 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - happyIn10- (happy_var_2 : happy_var_1- )}}--happyReduce_8 = happySpecReduce_0 1# happyReduction_8-happyReduction_8 = happyIn10- ([]- )--happyReduce_9 = happySpecReduce_1 2# happyReduction_9-happyReduction_9 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwAbstract happy_var_1) -> - happyIn11- (TokKeyword KwAbstract happy_var_1- )}--happyReduce_10 = happySpecReduce_1 2# happyReduction_10-happyReduction_10 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCoData happy_var_1) -> - happyIn11- (TokKeyword KwCoData happy_var_1- )}--happyReduce_11 = happySpecReduce_1 2# happyReduction_11-happyReduction_11 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCoInductive happy_var_1) -> - happyIn11- (TokKeyword KwCoInductive happy_var_1- )}--happyReduce_12 = happySpecReduce_1 2# happyReduction_12-happyReduction_12 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwConstructor happy_var_1) -> - happyIn11- (TokKeyword KwConstructor happy_var_1- )}--happyReduce_13 = happySpecReduce_1 2# happyReduction_13-happyReduction_13 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> - happyIn11- (TokKeyword KwData happy_var_1- )}--happyReduce_14 = happySpecReduce_1 2# happyReduction_14-happyReduction_14 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwEta happy_var_1) -> - happyIn11- (TokKeyword KwEta happy_var_1- )}--happyReduce_15 = happySpecReduce_1 2# happyReduction_15-happyReduction_15 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwField happy_var_1) -> - happyIn11- (TokKeyword KwField happy_var_1- )}--happyReduce_16 = happySpecReduce_1 2# happyReduction_16-happyReduction_16 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwForall happy_var_1) -> - happyIn11- (TokKeyword KwForall happy_var_1- )}--happyReduce_17 = happySpecReduce_1 2# happyReduction_17-happyReduction_17 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwHiding happy_var_1) -> - happyIn11- (TokKeyword KwHiding happy_var_1- )}--happyReduce_18 = happySpecReduce_1 2# happyReduction_18-happyReduction_18 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwImport happy_var_1) -> - happyIn11- (TokKeyword KwImport happy_var_1- )}--happyReduce_19 = happySpecReduce_1 2# happyReduction_19-happyReduction_19 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwIn happy_var_1) -> - happyIn11- (TokKeyword KwIn happy_var_1- )}--happyReduce_20 = happySpecReduce_1 2# happyReduction_20-happyReduction_20 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInductive happy_var_1) -> - happyIn11- (TokKeyword KwInductive happy_var_1- )}--happyReduce_21 = happySpecReduce_1 2# happyReduction_21-happyReduction_21 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInfix happy_var_1) -> - happyIn11- (TokKeyword KwInfix happy_var_1- )}--happyReduce_22 = happySpecReduce_1 2# happyReduction_22-happyReduction_22 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInfixL happy_var_1) -> - happyIn11- (TokKeyword KwInfixL happy_var_1- )}--happyReduce_23 = happySpecReduce_1 2# happyReduction_23-happyReduction_23 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInfixR happy_var_1) -> - happyIn11- (TokKeyword KwInfixR happy_var_1- )}--happyReduce_24 = happySpecReduce_1 2# happyReduction_24-happyReduction_24 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInstance happy_var_1) -> - happyIn11- (TokKeyword KwInstance happy_var_1- )}--happyReduce_25 = happySpecReduce_1 2# happyReduction_25-happyReduction_25 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwOverlap happy_var_1) -> - happyIn11- (TokKeyword KwOverlap happy_var_1- )}--happyReduce_26 = happySpecReduce_1 2# happyReduction_26-happyReduction_26 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwLet happy_var_1) -> - happyIn11- (TokKeyword KwLet happy_var_1- )}--happyReduce_27 = happySpecReduce_1 2# happyReduction_27-happyReduction_27 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwMacro happy_var_1) -> - happyIn11- (TokKeyword KwMacro happy_var_1- )}--happyReduce_28 = happySpecReduce_1 2# happyReduction_28-happyReduction_28 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> - happyIn11- (TokKeyword KwModule happy_var_1- )}--happyReduce_29 = happySpecReduce_1 2# happyReduction_29-happyReduction_29 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwMutual happy_var_1) -> - happyIn11- (TokKeyword KwMutual happy_var_1- )}--happyReduce_30 = happySpecReduce_1 2# happyReduction_30-happyReduction_30 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwNoEta happy_var_1) -> - happyIn11- (TokKeyword KwNoEta happy_var_1- )}--happyReduce_31 = happySpecReduce_1 2# happyReduction_31-happyReduction_31 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> - happyIn11- (TokKeyword KwOpen happy_var_1- )}--happyReduce_32 = happySpecReduce_1 2# happyReduction_32-happyReduction_32 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPatternSyn happy_var_1) -> - happyIn11- (TokKeyword KwPatternSyn happy_var_1- )}--happyReduce_33 = happySpecReduce_1 2# happyReduction_33-happyReduction_33 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPostulate happy_var_1) -> - happyIn11- (TokKeyword KwPostulate happy_var_1- )}--happyReduce_34 = happySpecReduce_1 2# happyReduction_34-happyReduction_34 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPrimitive happy_var_1) -> - happyIn11- (TokKeyword KwPrimitive happy_var_1- )}--happyReduce_35 = happySpecReduce_1 2# happyReduction_35-happyReduction_35 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPrivate happy_var_1) -> - happyIn11- (TokKeyword KwPrivate happy_var_1- )}--happyReduce_36 = happySpecReduce_1 2# happyReduction_36-happyReduction_36 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwProp happy_var_1) -> - happyIn11- (TokKeyword KwProp happy_var_1- )}--happyReduce_37 = happySpecReduce_1 2# happyReduction_37-happyReduction_37 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPublic happy_var_1) -> - happyIn11- (TokKeyword KwPublic happy_var_1- )}--happyReduce_38 = happySpecReduce_1 2# happyReduction_38-happyReduction_38 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwQuote happy_var_1) -> - happyIn11- (TokKeyword KwQuote happy_var_1- )}--happyReduce_39 = happySpecReduce_1 2# happyReduction_39-happyReduction_39 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteContext happy_var_1) -> - happyIn11- (TokKeyword KwQuoteContext happy_var_1- )}--happyReduce_40 = happySpecReduce_1 2# happyReduction_40-happyReduction_40 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteGoal happy_var_1) -> - happyIn11- (TokKeyword KwQuoteGoal happy_var_1- )}--happyReduce_41 = happySpecReduce_1 2# happyReduction_41-happyReduction_41 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteTerm happy_var_1) -> - happyIn11- (TokKeyword KwQuoteTerm happy_var_1- )}--happyReduce_42 = happySpecReduce_1 2# happyReduction_42-happyReduction_42 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> - happyIn11- (TokKeyword KwRecord happy_var_1- )}--happyReduce_43 = happySpecReduce_1 2# happyReduction_43-happyReduction_43 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwRenaming happy_var_1) -> - happyIn11- (TokKeyword KwRenaming happy_var_1- )}--happyReduce_44 = happySpecReduce_1 2# happyReduction_44-happyReduction_44 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwRewrite happy_var_1) -> - happyIn11- (TokKeyword KwRewrite happy_var_1- )}--happyReduce_45 = happySpecReduce_1 2# happyReduction_45-happyReduction_45 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwSet happy_var_1) -> - happyIn11- (TokKeyword KwSet happy_var_1- )}--happyReduce_46 = happySpecReduce_1 2# happyReduction_46-happyReduction_46 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwSyntax happy_var_1) -> - happyIn11- (TokKeyword KwSyntax happy_var_1- )}--happyReduce_47 = happySpecReduce_1 2# happyReduction_47-happyReduction_47 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwTactic happy_var_1) -> - happyIn11- (TokKeyword KwTactic happy_var_1- )}--happyReduce_48 = happySpecReduce_1 2# happyReduction_48-happyReduction_48 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwTo happy_var_1) -> - happyIn11- (TokKeyword KwTo happy_var_1- )}--happyReduce_49 = happySpecReduce_1 2# happyReduction_49-happyReduction_49 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwUnquote happy_var_1) -> - happyIn11- (TokKeyword KwUnquote happy_var_1- )}--happyReduce_50 = happySpecReduce_1 2# happyReduction_50-happyReduction_50 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwUnquoteDecl happy_var_1) -> - happyIn11- (TokKeyword KwUnquoteDecl happy_var_1- )}--happyReduce_51 = happySpecReduce_1 2# happyReduction_51-happyReduction_51 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwUnquoteDef happy_var_1) -> - happyIn11- (TokKeyword KwUnquoteDef happy_var_1- )}--happyReduce_52 = happySpecReduce_1 2# happyReduction_52-happyReduction_52 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwUsing happy_var_1) -> - happyIn11- (TokKeyword KwUsing happy_var_1- )}--happyReduce_53 = happySpecReduce_1 2# happyReduction_53-happyReduction_53 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwWhere happy_var_1) -> - happyIn11- (TokKeyword KwWhere happy_var_1- )}--happyReduce_54 = happySpecReduce_1 2# happyReduction_54-happyReduction_54 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwWith happy_var_1) -> - happyIn11- (TokKeyword KwWith happy_var_1- )}--happyReduce_55 = happySpecReduce_1 2# happyReduction_55-happyReduction_55 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwBUILTIN happy_var_1) -> - happyIn11- (TokKeyword KwBUILTIN happy_var_1- )}--happyReduce_56 = happySpecReduce_1 2# happyReduction_56-happyReduction_56 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCATCHALL happy_var_1) -> - happyIn11- (TokKeyword KwCATCHALL happy_var_1- )}--happyReduce_57 = happySpecReduce_1 2# happyReduction_57-happyReduction_57 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED happy_var_1) -> - happyIn11- (TokKeyword KwCOMPILED happy_var_1- )}--happyReduce_58 = happySpecReduce_1 2# happyReduction_58-happyReduction_58 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_DATA happy_var_1) -> - happyIn11- (TokKeyword KwCOMPILED_DATA happy_var_1- )}--happyReduce_59 = happySpecReduce_1 2# happyReduction_59-happyReduction_59 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_DATA_UHC happy_var_1) -> - happyIn11- (TokKeyword KwCOMPILED_DATA_UHC happy_var_1- )}--happyReduce_60 = happySpecReduce_1 2# happyReduction_60-happyReduction_60 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_DECLARE_DATA happy_var_1) -> - happyIn11- (TokKeyword KwCOMPILED_DECLARE_DATA happy_var_1- )}--happyReduce_61 = happySpecReduce_1 2# happyReduction_61-happyReduction_61 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_EPIC happy_var_1) -> - happyIn11- (TokKeyword KwCOMPILED_EPIC happy_var_1- )}--happyReduce_62 = happySpecReduce_1 2# happyReduction_62-happyReduction_62 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_EXPORT happy_var_1) -> - happyIn11- (TokKeyword KwCOMPILED_EXPORT happy_var_1- )}--happyReduce_63 = happySpecReduce_1 2# happyReduction_63-happyReduction_63 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_JS happy_var_1) -> - happyIn11- (TokKeyword KwCOMPILED_JS happy_var_1- )}--happyReduce_64 = happySpecReduce_1 2# happyReduction_64-happyReduction_64 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_TYPE happy_var_1) -> - happyIn11- (TokKeyword KwCOMPILED_TYPE happy_var_1- )}--happyReduce_65 = happySpecReduce_1 2# happyReduction_65-happyReduction_65 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_UHC happy_var_1) -> - happyIn11- (TokKeyword KwCOMPILED_UHC happy_var_1- )}--happyReduce_66 = happySpecReduce_1 2# happyReduction_66-happyReduction_66 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwHASKELL happy_var_1) -> - happyIn11- (TokKeyword KwHASKELL happy_var_1- )}--happyReduce_67 = happySpecReduce_1 2# happyReduction_67-happyReduction_67 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwDISPLAY happy_var_1) -> - happyIn11- (TokKeyword KwDISPLAY happy_var_1- )}--happyReduce_68 = happySpecReduce_1 2# happyReduction_68-happyReduction_68 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwIMPORT happy_var_1) -> - happyIn11- (TokKeyword KwIMPORT happy_var_1- )}--happyReduce_69 = happySpecReduce_1 2# happyReduction_69-happyReduction_69 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwIMPORT_UHC happy_var_1) -> - happyIn11- (TokKeyword KwIMPORT_UHC happy_var_1- )}--happyReduce_70 = happySpecReduce_1 2# happyReduction_70-happyReduction_70 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwIMPOSSIBLE happy_var_1) -> - happyIn11- (TokKeyword KwIMPOSSIBLE happy_var_1- )}--happyReduce_71 = happySpecReduce_1 2# happyReduction_71-happyReduction_71 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwINLINE happy_var_1) -> - happyIn11- (TokKeyword KwINLINE happy_var_1- )}--happyReduce_72 = happySpecReduce_1 2# happyReduction_72-happyReduction_72 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwMEASURE happy_var_1) -> - happyIn11- (TokKeyword KwMEASURE happy_var_1- )}--happyReduce_73 = happySpecReduce_1 2# happyReduction_73-happyReduction_73 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwNO_TERMINATION_CHECK happy_var_1) -> - happyIn11- (TokKeyword KwNO_TERMINATION_CHECK happy_var_1- )}--happyReduce_74 = happySpecReduce_1 2# happyReduction_74-happyReduction_74 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwNO_POSITIVITY_CHECK happy_var_1) -> - happyIn11- (TokKeyword KwNO_POSITIVITY_CHECK happy_var_1- )}--happyReduce_75 = happySpecReduce_1 2# happyReduction_75-happyReduction_75 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwNON_TERMINATING happy_var_1) -> - happyIn11- (TokKeyword KwNON_TERMINATING happy_var_1- )}--happyReduce_76 = happySpecReduce_1 2# happyReduction_76-happyReduction_76 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwOPTIONS happy_var_1) -> - happyIn11- (TokKeyword KwOPTIONS happy_var_1- )}--happyReduce_77 = happySpecReduce_1 2# happyReduction_77-happyReduction_77 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPOLARITY happy_var_1) -> - happyIn11- (TokKeyword KwPOLARITY happy_var_1- )}--happyReduce_78 = happySpecReduce_1 2# happyReduction_78-happyReduction_78 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwREWRITE happy_var_1) -> - happyIn11- (TokKeyword KwREWRITE happy_var_1- )}--happyReduce_79 = happySpecReduce_1 2# happyReduction_79-happyReduction_79 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwSTATIC happy_var_1) -> - happyIn11- (TokKeyword KwSTATIC happy_var_1- )}--happyReduce_80 = happySpecReduce_1 2# happyReduction_80-happyReduction_80 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwTERMINATING happy_var_1) -> - happyIn11- (TokKeyword KwTERMINATING happy_var_1- )}--happyReduce_81 = happySpecReduce_1 2# happyReduction_81-happyReduction_81 happy_x_1- = case happyOutTok happy_x_1 of { (TokSetN happy_var_1) -> - happyIn11- (TokSetN happy_var_1- )}--happyReduce_82 = happySpecReduce_1 2# happyReduction_82-happyReduction_82 happy_x_1- = case happyOutTok happy_x_1 of { (TokTeX happy_var_1) -> - happyIn11- (TokTeX happy_var_1- )}--happyReduce_83 = happySpecReduce_1 2# happyReduction_83-happyReduction_83 happy_x_1- = case happyOutTok happy_x_1 of { (TokComment happy_var_1) -> - happyIn11- (TokComment happy_var_1- )}--happyReduce_84 = happySpecReduce_1 2# happyReduction_84-happyReduction_84 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymEllipsis happy_var_1) -> - happyIn11- (TokSymbol SymEllipsis happy_var_1- )}--happyReduce_85 = happySpecReduce_1 2# happyReduction_85-happyReduction_85 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDotDot happy_var_1) -> - happyIn11- (TokSymbol SymDotDot happy_var_1- )}--happyReduce_86 = happySpecReduce_1 2# happyReduction_86-happyReduction_86 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDot happy_var_1) -> - happyIn11- (TokSymbol SymDot happy_var_1- )}--happyReduce_87 = happySpecReduce_1 2# happyReduction_87-happyReduction_87 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymSemi happy_var_1) -> - happyIn11- (TokSymbol SymSemi happy_var_1- )}--happyReduce_88 = happySpecReduce_1 2# happyReduction_88-happyReduction_88 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymColon happy_var_1) -> - happyIn11- (TokSymbol SymColon happy_var_1- )}--happyReduce_89 = happySpecReduce_1 2# happyReduction_89-happyReduction_89 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymEqual happy_var_1) -> - happyIn11- (TokSymbol SymEqual happy_var_1- )}--happyReduce_90 = happySpecReduce_1 2# happyReduction_90-happyReduction_90 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> - happyIn11- (TokSymbol SymUnderscore happy_var_1- )}--happyReduce_91 = happySpecReduce_1 2# happyReduction_91-happyReduction_91 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymQuestionMark happy_var_1) -> - happyIn11- (TokSymbol SymQuestionMark happy_var_1- )}--happyReduce_92 = happySpecReduce_1 2# happyReduction_92-happyReduction_92 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymArrow happy_var_1) -> - happyIn11- (TokSymbol SymArrow happy_var_1- )}--happyReduce_93 = happySpecReduce_1 2# happyReduction_93-happyReduction_93 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> - happyIn11- (TokSymbol SymLambda happy_var_1- )}--happyReduce_94 = happySpecReduce_1 2# happyReduction_94-happyReduction_94 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymAs happy_var_1) -> - happyIn11- (TokSymbol SymAs happy_var_1- )}--happyReduce_95 = happySpecReduce_1 2# happyReduction_95-happyReduction_95 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymBar happy_var_1) -> - happyIn11- (TokSymbol SymBar happy_var_1- )}--happyReduce_96 = happySpecReduce_1 2# happyReduction_96-happyReduction_96 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> - happyIn11- (TokSymbol SymOpenParen happy_var_1- )}--happyReduce_97 = happySpecReduce_1 2# happyReduction_97-happyReduction_97 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymCloseParen happy_var_1) -> - happyIn11- (TokSymbol SymCloseParen happy_var_1- )}--happyReduce_98 = happySpecReduce_1 2# happyReduction_98-happyReduction_98 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenIdiomBracket happy_var_1) -> - happyIn11- (TokSymbol SymOpenIdiomBracket happy_var_1- )}--happyReduce_99 = happySpecReduce_1 2# happyReduction_99-happyReduction_99 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymCloseIdiomBracket happy_var_1) -> - happyIn11- (TokSymbol SymCloseIdiomBracket happy_var_1- )}--happyReduce_100 = happySpecReduce_1 2# happyReduction_100-happyReduction_100 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> - happyIn11- (TokSymbol SymDoubleOpenBrace happy_var_1- )}--happyReduce_101 = happySpecReduce_1 2# happyReduction_101-happyReduction_101 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleCloseBrace happy_var_1) -> - happyIn11- (TokSymbol SymDoubleCloseBrace happy_var_1- )}--happyReduce_102 = happySpecReduce_1 2# happyReduction_102-happyReduction_102 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> - happyIn11- (TokSymbol SymOpenBrace happy_var_1- )}--happyReduce_103 = happySpecReduce_1 2# happyReduction_103-happyReduction_103 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymCloseBrace happy_var_1) -> - happyIn11- (TokSymbol SymCloseBrace happy_var_1- )}--happyReduce_104 = happySpecReduce_1 2# happyReduction_104-happyReduction_104 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenVirtualBrace happy_var_1) -> - happyIn11- (TokSymbol SymOpenVirtualBrace happy_var_1- )}--happyReduce_105 = happySpecReduce_1 2# happyReduction_105-happyReduction_105 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymCloseVirtualBrace happy_var_1) -> - happyIn11- (TokSymbol SymCloseVirtualBrace happy_var_1- )}--happyReduce_106 = happySpecReduce_1 2# happyReduction_106-happyReduction_106 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymVirtualSemi happy_var_1) -> - happyIn11- (TokSymbol SymVirtualSemi happy_var_1- )}--happyReduce_107 = happySpecReduce_1 2# happyReduction_107-happyReduction_107 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - happyIn11- (TokSymbol SymOpenPragma happy_var_1- )}--happyReduce_108 = happySpecReduce_1 2# happyReduction_108-happyReduction_108 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymClosePragma happy_var_1) -> - happyIn11- (TokSymbol SymClosePragma happy_var_1- )}--happyReduce_109 = happySpecReduce_1 2# happyReduction_109-happyReduction_109 happy_x_1- = case happyOutTok happy_x_1 of { (TokId happy_var_1) -> - happyIn11- (TokId happy_var_1- )}--happyReduce_110 = happySpecReduce_1 2# happyReduction_110-happyReduction_110 happy_x_1- = case happyOutTok happy_x_1 of { (TokQId happy_var_1) -> - happyIn11- (TokQId happy_var_1- )}--happyReduce_111 = happySpecReduce_1 2# happyReduction_111-happyReduction_111 happy_x_1- = case happyOutTok happy_x_1 of { (TokString happy_var_1) -> - happyIn11- (TokString happy_var_1- )}--happyReduce_112 = happySpecReduce_1 2# happyReduction_112-happyReduction_112 happy_x_1- = case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> - happyIn11- (TokLiteral happy_var_1- )}--happyReduce_113 = happySpecReduce_3 3# happyReduction_113-happyReduction_113 happy_x_3- happy_x_2- happy_x_1- = case happyOut127 happy_x_2 of { happy_var_2 -> - happyIn12- (takeOptionsPragmas happy_var_2- )}--happyReduce_114 = happySpecReduce_0 4# happyReduction_114-happyReduction_114 = happyIn13- (()- )--happyReduce_115 = happySpecReduce_1 4# happyReduction_115-happyReduction_115 happy_x_1- = happyIn13- (()- )--happyReduce_116 = happySpecReduce_1 5# happyReduction_116-happyReduction_116 happy_x_1- = happyIn14- (()- )--happyReduce_117 = happyMonadReduce 1# 5# happyReduction_117-happyReduction_117 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (( popContext)- ) (\r -> happyReturn (happyIn14 r))--happyReduce_118 = happySpecReduce_1 6# happyReduction_118-happyReduction_118 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymSemi happy_var_1) -> - happyIn15- (happy_var_1- )}--happyReduce_119 = happySpecReduce_1 6# happyReduction_119-happyReduction_119 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymVirtualSemi happy_var_1) -> - happyIn15- (happy_var_1- )}--happyReduce_120 = happyMonadReduce 0# 7# happyReduction_120-happyReduction_120 (happyRest) tk- = happyThen (( pushLexState imp_dir)- ) (\r -> happyReturn (happyIn16 r))--happyReduce_121 = happyMonadReduce 1# 8# happyReduction_121-happyReduction_121 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> - ( case happy_var_1 of {- LitNat _ i -> return i;- _ -> fail $ "Expected integer"- })}- ) (\r -> happyReturn (happyIn17 r))--happyReduce_122 = happyMonadReduce 1# 9# happyReduction_122-happyReduction_122 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokId happy_var_1) -> - ( mkName happy_var_1)}- ) (\r -> happyReturn (happyIn18 r))--happyReduce_123 = happySpecReduce_2 10# happyReduction_123-happyReduction_123 happy_x_2- happy_x_1- = case happyOut18 happy_x_1 of { happy_var_1 -> - case happyOut19 happy_x_2 of { happy_var_2 -> - happyIn19- (happy_var_1 : happy_var_2- )}}--happyReduce_124 = happySpecReduce_1 10# happyReduction_124-happyReduction_124 happy_x_1- = case happyOut18 happy_x_1 of { happy_var_1 -> - happyIn19- ([happy_var_1]- )}--happyReduce_125 = happySpecReduce_1 11# happyReduction_125-happyReduction_125 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleCloseBrace happy_var_1) -> - happyIn20- (getRange happy_var_1- )}--happyReduce_126 = happyMonadReduce 2# 11# happyReduction_126-happyReduction_126 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymCloseBrace happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymCloseBrace happy_var_2) -> - (- if posPos (fromJust (rEnd' (getRange happy_var_2))) -- posPos (fromJust (rStart' (getRange happy_var_1))) > 2- then parseErrorAt (fromJust (rStart' (getRange happy_var_2)))- "Expecting '}}', found separated '}'s."- else return $ getRange (happy_var_1, happy_var_2))}}- ) (\r -> happyReturn (happyIn20 r))--happyReduce_127 = happySpecReduce_2 12# happyReduction_127-happyReduction_127 happy_x_2- happy_x_1- = case happyOut18 happy_x_2 of { happy_var_2 -> - happyIn21- (setRelevance NonStrict $ defaultArg happy_var_2- )}--happyReduce_128 = happySpecReduce_2 12# happyReduction_128-happyReduction_128 happy_x_2- happy_x_1- = case happyOut18 happy_x_2 of { happy_var_2 -> - happyIn21- (setRelevance Irrelevant $ defaultArg happy_var_2- )}--happyReduce_129 = happySpecReduce_1 12# happyReduction_129-happyReduction_129 happy_x_1- = case happyOut18 happy_x_1 of { happy_var_1 -> - happyIn21- (defaultArg happy_var_1- )}--happyReduce_130 = happySpecReduce_2 13# happyReduction_130-happyReduction_130 happy_x_2- happy_x_1- = case happyOut21 happy_x_1 of { happy_var_1 -> - case happyOut22 happy_x_2 of { happy_var_2 -> - happyIn22- (happy_var_1 : happy_var_2- )}}--happyReduce_131 = happySpecReduce_1 13# happyReduction_131-happyReduction_131 happy_x_1- = case happyOut21 happy_x_1 of { happy_var_1 -> - happyIn22- ([happy_var_1]- )}--happyReduce_132 = happySpecReduce_2 14# happyReduction_132-happyReduction_132 happy_x_2- happy_x_1- = case happyOut21 happy_x_1 of { happy_var_1 -> - case happyOut23 happy_x_2 of { happy_var_2 -> - happyIn23- (happy_var_1 : happy_var_2- )}}--happyReduce_133 = happySpecReduce_1 14# happyReduction_133-happyReduction_133 happy_x_1- = case happyOut21 happy_x_1 of { happy_var_1 -> - happyIn23- ([happy_var_1]- )}--happyReduce_134 = happyReduce 4# 14# happyReduction_134-happyReduction_134 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut22 happy_x_2 of { happy_var_2 -> - case happyOut23 happy_x_4 of { happy_var_4 -> - happyIn23- (map makeInstance happy_var_2 ++ happy_var_4- ) `HappyStk` happyRest}}--happyReduce_135 = happySpecReduce_3 14# happyReduction_135-happyReduction_135 happy_x_3- happy_x_2- happy_x_1- = case happyOut22 happy_x_2 of { happy_var_2 -> - happyIn23- (map makeInstance happy_var_2- )}--happyReduce_136 = happyReduce 4# 14# happyReduction_136-happyReduction_136 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut22 happy_x_2 of { happy_var_2 -> - case happyOut23 happy_x_4 of { happy_var_4 -> - happyIn23- (map hide happy_var_2 ++ happy_var_4- ) `HappyStk` happyRest}}--happyReduce_137 = happySpecReduce_3 14# happyReduction_137-happyReduction_137 happy_x_3- happy_x_2- happy_x_1- = case happyOut22 happy_x_2 of { happy_var_2 -> - happyIn23- (map hide happy_var_2- )}--happyReduce_138 = happyReduce 5# 14# happyReduction_138-happyReduction_138 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut19 happy_x_3 of { happy_var_3 -> - case happyOut23 happy_x_5 of { happy_var_5 -> - happyIn23- (map (hide . setRelevance Irrelevant . defaultArg) happy_var_3 ++ happy_var_5- ) `HappyStk` happyRest}}--happyReduce_139 = happyReduce 4# 14# happyReduction_139-happyReduction_139 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut19 happy_x_3 of { happy_var_3 -> - happyIn23- (map (hide . setRelevance Irrelevant . defaultArg) happy_var_3- ) `HappyStk` happyRest}--happyReduce_140 = happyReduce 5# 14# happyReduction_140-happyReduction_140 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut19 happy_x_3 of { happy_var_3 -> - case happyOut23 happy_x_5 of { happy_var_5 -> - happyIn23- (map (makeInstance . setRelevance Irrelevant . defaultArg) happy_var_3 ++ happy_var_5- ) `HappyStk` happyRest}}--happyReduce_141 = happyReduce 4# 14# happyReduction_141-happyReduction_141 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut19 happy_x_3 of { happy_var_3 -> - happyIn23- (map (makeInstance . setRelevance Irrelevant . defaultArg) happy_var_3- ) `HappyStk` happyRest}--happyReduce_142 = happyReduce 5# 14# happyReduction_142-happyReduction_142 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut19 happy_x_3 of { happy_var_3 -> - case happyOut23 happy_x_5 of { happy_var_5 -> - happyIn23- (map (hide . setRelevance NonStrict . defaultArg) happy_var_3 ++ happy_var_5- ) `HappyStk` happyRest}}--happyReduce_143 = happyReduce 4# 14# happyReduction_143-happyReduction_143 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut19 happy_x_3 of { happy_var_3 -> - happyIn23- (map (hide . setRelevance NonStrict . defaultArg) happy_var_3- ) `HappyStk` happyRest}--happyReduce_144 = happyReduce 5# 14# happyReduction_144-happyReduction_144 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut19 happy_x_3 of { happy_var_3 -> - case happyOut23 happy_x_5 of { happy_var_5 -> - happyIn23- (map (makeInstance . setRelevance NonStrict . defaultArg) happy_var_3 ++ happy_var_5- ) `HappyStk` happyRest}}--happyReduce_145 = happyReduce 4# 14# happyReduction_145-happyReduction_145 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut19 happy_x_3 of { happy_var_3 -> - happyIn23- (map (makeInstance . setRelevance NonStrict . defaultArg) happy_var_3- ) `HappyStk` happyRest}--happyReduce_146 = happyMonadReduce 1# 15# happyReduction_146-happyReduction_146 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokQId happy_var_1) -> - ( mkQName happy_var_1)}- ) (\r -> happyReturn (happyIn24 r))--happyReduce_147 = happySpecReduce_1 15# happyReduction_147-happyReduction_147 happy_x_1- = case happyOut18 happy_x_1 of { happy_var_1 -> - happyIn24- (QName happy_var_1- )}--happyReduce_148 = happySpecReduce_1 16# happyReduction_148-happyReduction_148 happy_x_1- = case happyOut24 happy_x_1 of { happy_var_1 -> - happyIn25- (happy_var_1- )}--happyReduce_149 = happySpecReduce_1 17# happyReduction_149-happyReduction_149 happy_x_1- = case happyOut18 happy_x_1 of { happy_var_1 -> - happyIn26- (happy_var_1- )}--happyReduce_150 = happySpecReduce_1 17# happyReduction_150-happyReduction_150 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> - happyIn26- (Name (getRange happy_var_1) [Hole]- )}--happyReduce_151 = happySpecReduce_2 18# happyReduction_151-happyReduction_151 happy_x_2- happy_x_1- = case happyOut26 happy_x_1 of { happy_var_1 -> - case happyOut27 happy_x_2 of { happy_var_2 -> - happyIn27- (happy_var_1 : happy_var_2- )}}--happyReduce_152 = happySpecReduce_1 18# happyReduction_152-happyReduction_152 happy_x_1- = case happyOut26 happy_x_1 of { happy_var_1 -> - happyIn27- ([happy_var_1]- )}--happyReduce_153 = happySpecReduce_1 19# happyReduction_153-happyReduction_153 happy_x_1- = case happyOut29 happy_x_1 of { happy_var_1 -> - happyIn28- (case happy_var_1 of- Left ns -> ns- Right _ -> fail $ "expected sequence of bound identifiers, not absurd pattern"- )}--happyReduce_154 = happyMonadReduce 1# 20# happyReduction_154-happyReduction_154 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> - (- let getName :: Expr -> Maybe Name- getName (Ident (QName x)) = Just x- getName (Underscore r _) = Just (Name r [Hole])- getName _ = Nothing-- isAbsurd :: Expr -> Bool- isAbsurd (Absurd _) = True- isAbsurd (HiddenArg _ (Named _ e)) = isAbsurd e- isAbsurd (InstanceArg _ (Named _ e)) = isAbsurd e- isAbsurd (Paren _ expr) = isAbsurd expr- isAbsurd (RawApp _ exprs) = any isAbsurd exprs- isAbsurd _ = False- in- if any isAbsurd happy_var_1 then return $ Right happy_var_1 else- case mapM getName happy_var_1 of- Just good -> return $ Left good- Nothing -> fail $ "expected sequence of bound identifiers")}- ) (\r -> happyReturn (happyIn29 r))--happyReduce_155 = happyMonadReduce 1# 21# happyReduction_155-happyReduction_155 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> - (- let -- interpret an expression as name- getName :: Expr -> Maybe Name- getName (Ident (QName x)) = Just x- getName (Underscore r _) = Just (Name r [Hole])- getName _ = Nothing-- getNames :: Expr -> Maybe [Name]- getNames (RawApp _ es) = mapM getName es- getNames e = singleton `fmap` getName e-- -- interpret an expression as name or list of hidden names- getName1 :: Expr -> Maybe [WithHiding Name]- getName1 (Ident (QName x)) = Just [WithHiding NotHidden x]- getName1 (Underscore r _) = Just [WithHiding NotHidden $ Name r [Hole]]- getName1 (HiddenArg _ (Named Nothing e))- = map (WithHiding Hidden) `fmap` getNames e- getName1 _ = Nothing-- in- case mapM getName1 happy_var_1 of- Just good -> return $ concat good- Nothing -> fail $ "expected sequence of possibly hidden bound identifiers")}- ) (\r -> happyReturn (happyIn30 r))--happyReduce_156 = happySpecReduce_0 22# happyReduction_156-happyReduction_156 = happyIn31- ([]- )--happyReduce_157 = happySpecReduce_2 22# happyReduction_157-happyReduction_157 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokString happy_var_1) -> - case happyOut31 happy_x_2 of { happy_var_2 -> - happyIn31- (snd happy_var_1 : happy_var_2- )}}--happyReduce_158 = happySpecReduce_1 23# happyReduction_158-happyReduction_158 happy_x_1- = case happyOutTok happy_x_1 of { (TokString happy_var_1) -> - happyIn32- (snd happy_var_1- )}--happyReduce_159 = happySpecReduce_0 24# happyReduction_159-happyReduction_159 = happyIn33- ([]- )--happyReduce_160 = happySpecReduce_2 24# happyReduction_160-happyReduction_160 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokString happy_var_1) -> - case happyOut33 happy_x_2 of { happy_var_2 -> - happyIn33- (happy_var_1 : happy_var_2- )}}--happyReduce_161 = happyMonadReduce 1# 25# happyReduction_161-happyReduction_161 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokString happy_var_1) -> - ( mkName happy_var_1)}- ) (\r -> happyReturn (happyIn34 r))--happyReduce_162 = happyMonadReduce 1# 26# happyReduction_162-happyReduction_162 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokString happy_var_1) -> - ( pragmaQName happy_var_1)}- ) (\r -> happyReturn (happyIn35 r))--happyReduce_163 = happyMonadReduce 1# 27# happyReduction_163-happyReduction_163 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut33 happy_x_1 of { happy_var_1 -> - ( mapM pragmaQName happy_var_1)}- ) (\r -> happyReturn (happyIn36 r))--happyReduce_164 = happySpecReduce_2 28# happyReduction_164-happyReduction_164 happy_x_2- happy_x_1- = case happyOut54 happy_x_1 of { happy_var_1 -> - case happyOut37 happy_x_2 of { happy_var_2 -> - happyIn37- (Pi happy_var_1 happy_var_2- )}}--happyReduce_165 = happySpecReduce_3 28# happyReduction_165-happyReduction_165 happy_x_3- happy_x_2- happy_x_1- = case happyOut43 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (TokSymbol SymArrow happy_var_2) -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn37- (Fun (getRange (happy_var_1,happy_var_2,happy_var_3))- (RawApp (getRange happy_var_1) happy_var_1)- happy_var_3- )}}}--happyReduce_166 = happySpecReduce_3 28# happyReduction_166-happyReduction_166 happy_x_3- happy_x_2- happy_x_1- = case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (TokSymbol SymEqual happy_var_2) -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn37- (Equal (getRange (happy_var_1, happy_var_2, happy_var_3)) happy_var_1 happy_var_3- )}}}--happyReduce_167 = happySpecReduce_1 28# happyReduction_167-happyReduction_167 happy_x_1- = case happyOut38 happy_x_1 of { happy_var_1 -> - happyIn37- (happy_var_1- )}--happyReduce_168 = happyMonadReduce 1# 29# happyReduction_168-happyReduction_168 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut39 happy_x_1 of { happy_var_1 -> - ( case happy_var_1 of- { [e] -> return e- ; e : es -> return $ WithApp (fuseRange e es) e es- ; [] -> fail "impossible: empty with expressions"- })}- ) (\r -> happyReturn (happyIn38 r))--happyReduce_169 = happySpecReduce_3 30# happyReduction_169-happyReduction_169 happy_x_3- happy_x_2- happy_x_1- = case happyOut43 happy_x_1 of { happy_var_1 -> - case happyOut39 happy_x_3 of { happy_var_3 -> - happyIn39- (RawApp (getRange happy_var_1) happy_var_1 : happy_var_3- )}}--happyReduce_170 = happySpecReduce_1 30# happyReduction_170-happyReduction_170 happy_x_1- = case happyOut40 happy_x_1 of { happy_var_1 -> - happyIn39- ([RawApp (getRange happy_var_1) happy_var_1]- )}--happyReduce_171 = happySpecReduce_1 31# happyReduction_171-happyReduction_171 happy_x_1- = case happyOut41 happy_x_1 of { happy_var_1 -> - happyIn40- ([happy_var_1]- )}--happyReduce_172 = happySpecReduce_2 31# happyReduction_172-happyReduction_172 happy_x_2- happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - case happyOut40 happy_x_2 of { happy_var_2 -> - happyIn40- (happy_var_1 : happy_var_2- )}}--happyReduce_173 = happySpecReduce_3 32# happyReduction_173-happyReduction_173 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> - case happyOut60 happy_x_2 of { happy_var_2 -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn41- (Lam (getRange (happy_var_1,happy_var_2,happy_var_3)) happy_var_2 happy_var_3- )}}}--happyReduce_174 = happySpecReduce_1 32# happyReduction_174-happyReduction_174 happy_x_1- = case happyOut42 happy_x_1 of { happy_var_1 -> - happyIn41- (happy_var_1- )}--happyReduce_175 = happySpecReduce_3 32# happyReduction_175-happyReduction_175 happy_x_3- happy_x_2- happy_x_1- = case happyOut68 happy_x_2 of { happy_var_2 -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn41- (forallPi happy_var_2 happy_var_3- )}}--happyReduce_176 = happyReduce 4# 32# happyReduction_176-happyReduction_176 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwLet happy_var_1) -> - case happyOut167 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokKeyword KwIn happy_var_3) -> - case happyOut37 happy_x_4 of { happy_var_4 -> - happyIn41- (Let (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_2 happy_var_4- ) `HappyStk` happyRest}}}}--happyReduce_177 = happySpecReduce_1 32# happyReduction_177-happyReduction_177 happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - happyIn41- (happy_var_1- )}--happyReduce_178 = happyReduce 4# 32# happyReduction_178-happyReduction_178 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteGoal happy_var_1) -> - case happyOut18 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokKeyword KwIn happy_var_3) -> - case happyOut37 happy_x_4 of { happy_var_4 -> - happyIn41- (QuoteGoal (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_2 happy_var_4- ) `HappyStk` happyRest}}}}--happyReduce_179 = happySpecReduce_2 32# happyReduction_179-happyReduction_179 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwTactic happy_var_1) -> - case happyOut43 happy_x_2 of { happy_var_2 -> - happyIn41- (Tactic (getRange (happy_var_1, happy_var_2)) (RawApp (getRange happy_var_2) happy_var_2) []- )}}--happyReduce_180 = happyReduce 4# 32# happyReduction_180-happyReduction_180 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwTactic happy_var_1) -> - case happyOut43 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymBar happy_var_3) -> - case happyOut39 happy_x_4 of { happy_var_4 -> - happyIn41- (Tactic (getRange (happy_var_1, happy_var_2, happy_var_3, happy_var_4)) (RawApp (getRange happy_var_2) happy_var_2) happy_var_4- ) `HappyStk` happyRest}}}}--happyReduce_181 = happyReduce 4# 33# happyReduction_181-happyReduction_181 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> - case happyOut67 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> - happyIn42- (ExtendedLam (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) (reverse happy_var_3)- ) `HappyStk` happyRest}}}}--happyReduce_182 = happyReduce 5# 33# happyReduction_182-happyReduction_182 (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 { (TokSymbol SymLambda happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwWhere happy_var_2) -> - case happyOut67 happy_x_4 of { happy_var_4 -> - happyIn42- (ExtendedLam (getRange (happy_var_1, happy_var_2, happy_var_4)) (reverse happy_var_4)- ) `HappyStk` happyRest}}}--happyReduce_183 = happyMonadReduce 2# 33# happyReduction_183-happyReduction_183 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> - case happyOut61 happy_x_2 of { happy_var_2 -> - ( case happy_var_2 of- Left (bs, h) -> if null bs then return $ AbsurdLam r h else- return $ Lam r bs (AbsurdLam r h)- where r = fuseRange happy_var_1 bs- Right es -> do -- it is of the form @\ { p1 ... () }@- p <- exprToLHS (RawApp (getRange es) es);- return $ ExtendedLam (fuseRange happy_var_1 es)- [(p [] [], AbsurdRHS, NoWhere, False)])}}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_184 = happySpecReduce_1 34# happyReduction_184-happyReduction_184 happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - happyIn43- ([happy_var_1]- )}--happyReduce_185 = happySpecReduce_2 34# happyReduction_185-happyReduction_185 happy_x_2- happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - case happyOut43 happy_x_2 of { happy_var_2 -> - happyIn43- (happy_var_1 : happy_var_2- )}}--happyReduce_186 = happySpecReduce_3 35# happyReduction_186-happyReduction_186 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> - case happyOut37 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymCloseBrace happy_var_3) -> - happyIn44- (HiddenArg (getRange (happy_var_1,happy_var_2,happy_var_3)) (maybeNamed happy_var_2)- )}}}--happyReduce_187 = happySpecReduce_2 35# happyReduction_187-happyReduction_187 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymCloseBrace happy_var_2) -> - happyIn44- (let r = fuseRange happy_var_1 happy_var_2 in HiddenArg r $ unnamed $ Absurd r- )}}--happyReduce_188 = happySpecReduce_1 36# happyReduction_188-happyReduction_188 happy_x_1- = case happyOut24 happy_x_1 of { happy_var_1 -> - happyIn45- (Ident happy_var_1- )}--happyReduce_189 = happySpecReduce_1 36# happyReduction_189-happyReduction_189 happy_x_1- = case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> - happyIn45- (Lit happy_var_1- )}--happyReduce_190 = happySpecReduce_1 36# happyReduction_190-happyReduction_190 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymQuestionMark happy_var_1) -> - happyIn45- (QuestionMark (getRange happy_var_1) Nothing- )}--happyReduce_191 = happySpecReduce_1 36# happyReduction_191-happyReduction_191 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> - happyIn45- (Underscore (getRange happy_var_1) Nothing- )}--happyReduce_192 = happySpecReduce_1 36# happyReduction_192-happyReduction_192 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwProp happy_var_1) -> - happyIn45- (Prop (getRange happy_var_1)- )}--happyReduce_193 = happySpecReduce_1 36# happyReduction_193-happyReduction_193 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwSet happy_var_1) -> - happyIn45- (Set (getRange happy_var_1)- )}--happyReduce_194 = happySpecReduce_1 36# happyReduction_194-happyReduction_194 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwQuote happy_var_1) -> - happyIn45- (Quote (getRange happy_var_1)- )}--happyReduce_195 = happySpecReduce_1 36# happyReduction_195-happyReduction_195 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteTerm happy_var_1) -> - happyIn45- (QuoteTerm (getRange happy_var_1)- )}--happyReduce_196 = happySpecReduce_1 36# happyReduction_196-happyReduction_196 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteContext happy_var_1) -> - happyIn45- (QuoteContext (getRange happy_var_1)- )}--happyReduce_197 = happySpecReduce_1 36# happyReduction_197-happyReduction_197 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwUnquote happy_var_1) -> - happyIn45- (Unquote (getRange happy_var_1)- )}--happyReduce_198 = happySpecReduce_1 36# happyReduction_198-happyReduction_198 happy_x_1- = case happyOutTok happy_x_1 of { (TokSetN happy_var_1) -> - happyIn45- (SetN (getRange (fst happy_var_1)) (snd happy_var_1)- )}--happyReduce_199 = happySpecReduce_3 36# happyReduction_199-happyReduction_199 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> - case happyOut37 happy_x_2 of { happy_var_2 -> - case happyOut20 happy_x_3 of { happy_var_3 -> - happyIn45- (InstanceArg (getRange (happy_var_1,happy_var_2,happy_var_3))- (maybeNamed happy_var_2)- )}}}--happyReduce_200 = happySpecReduce_3 36# happyReduction_200-happyReduction_200 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> - case happyOut37 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymCloseParen happy_var_3) -> - happyIn45- (Paren (getRange (happy_var_1,happy_var_2,happy_var_3)) happy_var_2- )}}}--happyReduce_201 = happySpecReduce_3 36# happyReduction_201-happyReduction_201 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenIdiomBracket happy_var_1) -> - case happyOut37 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymCloseIdiomBracket happy_var_3) -> - happyIn45- (IdiomBrackets (getRange (happy_var_1,happy_var_2,happy_var_3)) happy_var_2- )}}}--happyReduce_202 = happySpecReduce_2 36# happyReduction_202-happyReduction_202 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymCloseParen happy_var_2) -> - happyIn45- (Absurd (fuseRange happy_var_1 happy_var_2)- )}}--happyReduce_203 = happySpecReduce_2 36# happyReduction_203-happyReduction_203 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> - case happyOut20 happy_x_2 of { happy_var_2 -> - happyIn45- (let r = fuseRange happy_var_1 happy_var_2 in InstanceArg r $ unnamed $ Absurd r- )}}--happyReduce_204 = happySpecReduce_3 36# happyReduction_204-happyReduction_204 happy_x_3- happy_x_2- happy_x_1- = case happyOut18 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (TokSymbol SymAs happy_var_2) -> - case happyOut46 happy_x_3 of { happy_var_3 -> - happyIn45- (As (getRange (happy_var_1,happy_var_2,happy_var_3)) happy_var_1 happy_var_3- )}}}--happyReduce_205 = happySpecReduce_2 36# happyReduction_205-happyReduction_205 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDot happy_var_1) -> - case happyOut46 happy_x_2 of { happy_var_2 -> - happyIn45- (Dot (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_206 = happyReduce 4# 36# happyReduction_206-happyReduction_206 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> - case happyOut47 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> - happyIn45- (Rec (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_3- ) `HappyStk` happyRest}}}}--happyReduce_207 = happyReduce 5# 36# happyReduction_207-happyReduction_207 (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 { (TokKeyword KwRecord happy_var_1) -> - case happyOut45 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymOpenBrace happy_var_3) -> - case happyOut51 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymCloseBrace happy_var_5) -> - happyIn45- (RecUpdate (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) happy_var_2 happy_var_4- ) `HappyStk` happyRest}}}}}--happyReduce_208 = happySpecReduce_1 37# happyReduction_208-happyReduction_208 happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - happyIn46- (happy_var_1- )}--happyReduce_209 = happySpecReduce_1 37# happyReduction_209-happyReduction_209 happy_x_1- = case happyOut45 happy_x_1 of { happy_var_1 -> - happyIn46- (happy_var_1- )}--happyReduce_210 = happySpecReduce_0 38# happyReduction_210-happyReduction_210 = happyIn47- ([]- )--happyReduce_211 = happySpecReduce_1 38# happyReduction_211-happyReduction_211 happy_x_1- = case happyOut48 happy_x_1 of { happy_var_1 -> - happyIn47- (happy_var_1- )}--happyReduce_212 = happySpecReduce_1 39# happyReduction_212-happyReduction_212 happy_x_1- = case happyOut49 happy_x_1 of { happy_var_1 -> - happyIn48- ([happy_var_1]- )}--happyReduce_213 = happySpecReduce_3 39# happyReduction_213-happyReduction_213 happy_x_3- happy_x_2- happy_x_1- = case happyOut49 happy_x_1 of { happy_var_1 -> - case happyOut48 happy_x_3 of { happy_var_3 -> - happyIn48- (happy_var_1 : happy_var_3- )}}--happyReduce_214 = happySpecReduce_1 40# happyReduction_214-happyReduction_214 happy_x_1- = case happyOut53 happy_x_1 of { happy_var_1 -> - happyIn49- (Left happy_var_1- )}--happyReduce_215 = happySpecReduce_1 40# happyReduction_215-happyReduction_215 happy_x_1- = case happyOut50 happy_x_1 of { happy_var_1 -> - happyIn49- (Right happy_var_1- )}--happyReduce_216 = happySpecReduce_3 41# happyReduction_216-happyReduction_216 happy_x_3- happy_x_2- happy_x_1- = case happyOut25 happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_2 of { happy_var_2 -> - case happyOut73 happy_x_3 of { happy_var_3 -> - happyIn50- (ModuleAssignment happy_var_1 happy_var_2 happy_var_3- )}}}--happyReduce_217 = happySpecReduce_0 42# happyReduction_217-happyReduction_217 = happyIn51- ([]- )--happyReduce_218 = happySpecReduce_1 42# happyReduction_218-happyReduction_218 happy_x_1- = case happyOut52 happy_x_1 of { happy_var_1 -> - happyIn51- (happy_var_1- )}--happyReduce_219 = happySpecReduce_1 43# happyReduction_219-happyReduction_219 happy_x_1- = case happyOut53 happy_x_1 of { happy_var_1 -> - happyIn52- ([happy_var_1]- )}--happyReduce_220 = happySpecReduce_3 43# happyReduction_220-happyReduction_220 happy_x_3- happy_x_2- happy_x_1- = case happyOut53 happy_x_1 of { happy_var_1 -> - case happyOut52 happy_x_3 of { happy_var_3 -> - happyIn52- (happy_var_1 : happy_var_3- )}}--happyReduce_221 = happySpecReduce_3 44# happyReduction_221-happyReduction_221 happy_x_3- happy_x_2- happy_x_1- = case happyOut18 happy_x_1 of { happy_var_1 -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn53- (FieldAssignment happy_var_1 happy_var_3- )}}--happyReduce_222 = happySpecReduce_2 45# happyReduction_222-happyReduction_222 happy_x_2- happy_x_1- = case happyOut55 happy_x_1 of { happy_var_1 -> - happyIn54- (happy_var_1- )}--happyReduce_223 = happySpecReduce_1 46# happyReduction_223-happyReduction_223 happy_x_1- = case happyOut56 happy_x_1 of { happy_var_1 -> - happyIn55- ({-TeleBind-} happy_var_1- )}--happyReduce_224 = happySpecReduce_2 47# happyReduction_224-happyReduction_224 happy_x_2- happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - case happyOut56 happy_x_2 of { happy_var_2 -> - happyIn56- (happy_var_1 : happy_var_2- )}}--happyReduce_225 = happySpecReduce_1 47# happyReduction_225-happyReduction_225 happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - happyIn56- ([happy_var_1]- )}--happyReduce_226 = happyReduce 4# 48# happyReduction_226-happyReduction_226 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> - case happyOut59 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> - happyIn57- (setRange (getRange (happy_var_2,happy_var_3,happy_var_4)) $- setRelevance Irrelevant happy_var_3- ) `HappyStk` happyRest}}}--happyReduce_227 = happyReduce 4# 48# happyReduction_227-happyReduction_227 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> - case happyOut58 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> - happyIn57- (setRange (getRange (happy_var_2,happy_var_3,happy_var_4)) $- setHiding Hidden $- setRelevance Irrelevant happy_var_3- ) `HappyStk` happyRest}}}--happyReduce_228 = happyReduce 4# 48# happyReduction_228-happyReduction_228 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_2 of { (TokSymbol SymDoubleOpenBrace happy_var_2) -> - case happyOut58 happy_x_3 of { happy_var_3 -> - case happyOut20 happy_x_4 of { happy_var_4 -> - happyIn57- (setRange (getRange (happy_var_2,happy_var_3,happy_var_4)) $- setHiding Instance $- setRelevance Irrelevant happy_var_3- ) `HappyStk` happyRest}}}--happyReduce_229 = happyReduce 4# 48# happyReduction_229-happyReduction_229 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> - case happyOut59 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> - happyIn57- (setRange (getRange (happy_var_2,happy_var_3,happy_var_4)) $- setRelevance NonStrict happy_var_3- ) `HappyStk` happyRest}}}--happyReduce_230 = happyReduce 4# 48# happyReduction_230-happyReduction_230 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> - case happyOut58 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> - happyIn57- (setRange (getRange (happy_var_2,happy_var_3,happy_var_4)) $- setHiding Hidden $- setRelevance NonStrict happy_var_3- ) `HappyStk` happyRest}}}--happyReduce_231 = happyReduce 4# 48# happyReduction_231-happyReduction_231 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_2 of { (TokSymbol SymDoubleOpenBrace happy_var_2) -> - case happyOut58 happy_x_3 of { happy_var_3 -> - case happyOut20 happy_x_4 of { happy_var_4 -> - happyIn57- (setRange (getRange (happy_var_2,happy_var_3,happy_var_4)) $- setHiding Instance $- setRelevance NonStrict happy_var_3- ) `HappyStk` happyRest}}}--happyReduce_232 = happySpecReduce_3 48# happyReduction_232-happyReduction_232 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> - case happyOut59 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymCloseParen happy_var_3) -> - happyIn57- (setRange (getRange (happy_var_1,happy_var_2,happy_var_3)) happy_var_2- )}}}--happyReduce_233 = happySpecReduce_3 48# happyReduction_233-happyReduction_233 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> - case happyOut58 happy_x_2 of { happy_var_2 -> - case happyOut20 happy_x_3 of { happy_var_3 -> - happyIn57- (setRange (getRange (happy_var_1,happy_var_2,happy_var_3)) $- setHiding Instance happy_var_2- )}}}--happyReduce_234 = happySpecReduce_3 48# happyReduction_234-happyReduction_234 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> - case happyOut58 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymCloseBrace happy_var_3) -> - happyIn57- (setRange (getRange (happy_var_1,happy_var_2,happy_var_3)) $- setHiding Hidden happy_var_2- )}}}--happyReduce_235 = happySpecReduce_3 48# happyReduction_235-happyReduction_235 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> - case happyOut121 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymCloseParen happy_var_3) -> - happyIn57- (tLet (getRange (happy_var_1,happy_var_3)) happy_var_2- )}}}--happyReduce_236 = happyReduce 4# 48# happyReduction_236-happyReduction_236 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> - case happyOut167 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> - happyIn57- (tLet (getRange (happy_var_1,happy_var_4)) happy_var_3- ) `HappyStk` happyRest}}}--happyReduce_237 = happySpecReduce_3 49# happyReduction_237-happyReduction_237 happy_x_3- happy_x_2- happy_x_1- = case happyOut28 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (TokSymbol SymColon happy_var_2) -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn58- (let r = getRange (happy_var_1,happy_var_2,happy_var_3) -- the range is approximate only for TypedBindings- in TypedBindings r $ defaultArg $ TBind r (map (pure . mkBoundName_) happy_var_1) happy_var_3- )}}}--happyReduce_238 = happySpecReduce_3 50# happyReduction_238-happyReduction_238 happy_x_3- happy_x_2- happy_x_1- = case happyOut30 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (TokSymbol SymColon happy_var_2) -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn59- (let r = getRange (happy_var_1,happy_var_2,happy_var_3) -- the range is approximate only for TypedBindings- in TypedBindings r $ defaultArg $ TBind r (map (fmap mkBoundName_) happy_var_1) happy_var_3- )}}}--happyReduce_239 = happyMonadReduce 2# 51# happyReduction_239-happyReduction_239 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - (- case reverse happy_var_1 of- Left _ : _ -> parseError "Absurd lambda cannot have a body."- _ : _ -> return [ b | Right b <- happy_var_1 ]- [] -> parsePanic "Empty LamBinds")}- ) (\r -> happyReturn (happyIn60 r))--happyReduce_240 = happyMonadReduce 1# 52# happyReduction_240-happyReduction_240 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut63 happy_x_1 of { happy_var_1 -> - (- case happy_var_1 of- Left lb -> case reverse lb of- Right _ : _ -> parseError "Missing body for lambda"- Left h : _ -> return $ Left ([ b | Right b <- init lb], h)- _ -> parseError "Unsupported variant of lambda"- Right es -> return $ Right es)}- ) (\r -> happyReturn (happyIn61 r))--happyReduce_241 = happySpecReduce_2 53# happyReduction_241-happyReduction_241 happy_x_2- happy_x_1- = case happyOut71 happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - happyIn62- (map Right happy_var_1 ++ happy_var_2- )}}--happyReduce_242 = happySpecReduce_2 53# happyReduction_242-happyReduction_242 happy_x_2- happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - happyIn62- (Right (DomainFull happy_var_1) : happy_var_2- )}}--happyReduce_243 = happySpecReduce_1 53# happyReduction_243-happyReduction_243 happy_x_1- = case happyOut71 happy_x_1 of { happy_var_1 -> - happyIn62- (map Right happy_var_1- )}--happyReduce_244 = happySpecReduce_1 53# happyReduction_244-happyReduction_244 happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - happyIn62- ([Right $ DomainFull happy_var_1]- )}--happyReduce_245 = happySpecReduce_2 53# happyReduction_245-happyReduction_245 happy_x_2- happy_x_1- = happyIn62- ([Left NotHidden]- )--happyReduce_246 = happySpecReduce_2 53# happyReduction_246-happyReduction_246 happy_x_2- happy_x_1- = happyIn62- ([Left Hidden]- )--happyReduce_247 = happySpecReduce_2 53# happyReduction_247-happyReduction_247 happy_x_2- happy_x_1- = happyIn62- ([Left Instance]- )--happyReduce_248 = happySpecReduce_2 54# happyReduction_248-happyReduction_248 happy_x_2- happy_x_1- = case happyOut71 happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - happyIn63- (Left $ map Right happy_var_1 ++ happy_var_2- )}}--happyReduce_249 = happySpecReduce_2 54# happyReduction_249-happyReduction_249 happy_x_2- happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - happyIn63- (Left $ Right (DomainFull happy_var_1) : happy_var_2- )}}--happyReduce_250 = happySpecReduce_1 54# happyReduction_250-happyReduction_250 happy_x_1- = case happyOut72 happy_x_1 of { happy_var_1 -> - happyIn63- (case happy_var_1 of- Left lb -> Left $ map Right lb- Right es -> Right es- )}--happyReduce_251 = happySpecReduce_1 54# happyReduction_251-happyReduction_251 happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - happyIn63- (Left [Right $ DomainFull happy_var_1]- )}--happyReduce_252 = happySpecReduce_2 54# happyReduction_252-happyReduction_252 happy_x_2- happy_x_1- = happyIn63- (Left [Left NotHidden]- )--happyReduce_253 = happySpecReduce_2 54# happyReduction_253-happyReduction_253 happy_x_2- happy_x_1- = happyIn63- (Left [Left Hidden]- )--happyReduce_254 = happySpecReduce_2 54# happyReduction_254-happyReduction_254 happy_x_2- happy_x_1- = happyIn63- (Left [Left Instance]- )--happyReduce_255 = happyMonadReduce 3# 55# happyReduction_255-happyReduction_255 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut43 happy_x_1 of { happy_var_1 -> - case happyOut37 happy_x_3 of { happy_var_3 -> - ( do- p <- exprToLHS (RawApp (getRange happy_var_1) happy_var_1) ;- return (p [] [], RHS happy_var_3, NoWhere, False))}}- ) (\r -> happyReturn (happyIn64 r))--happyReduce_256 = happyMonadReduce 4# 55# happyReduction_256-happyReduction_256 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut43 happy_x_2 of { happy_var_2 -> - case happyOut37 happy_x_4 of { happy_var_4 -> - ( do- p <- exprToLHS (RawApp (getRange happy_var_2) happy_var_2) ;- return (p [] [], RHS happy_var_4, NoWhere, True))}}- ) (\r -> happyReturn (happyIn64 r))--happyReduce_257 = happyMonadReduce 1# 56# happyReduction_257-happyReduction_257 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> - ( do- p <- exprToLHS (RawApp (getRange happy_var_1) happy_var_1);- return (p [] [], AbsurdRHS, NoWhere, False))}- ) (\r -> happyReturn (happyIn65 r))--happyReduce_258 = happyMonadReduce 2# 56# happyReduction_258-happyReduction_258 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut40 happy_x_2 of { happy_var_2 -> - ( do- p <- exprToLHS (RawApp (getRange happy_var_2) happy_var_2);- return (p [] [], AbsurdRHS, NoWhere, True))}- ) (\r -> happyReturn (happyIn65 r))--happyReduce_259 = happySpecReduce_1 57# happyReduction_259-happyReduction_259 happy_x_1- = case happyOut64 happy_x_1 of { happy_var_1 -> - happyIn66- (happy_var_1- )}--happyReduce_260 = happySpecReduce_1 57# happyReduction_260-happyReduction_260 happy_x_1- = case happyOut65 happy_x_1 of { happy_var_1 -> - happyIn66- (happy_var_1- )}--happyReduce_261 = happySpecReduce_3 58# happyReduction_261-happyReduction_261 happy_x_3- happy_x_2- happy_x_1- = case happyOut67 happy_x_1 of { happy_var_1 -> - case happyOut66 happy_x_3 of { happy_var_3 -> - happyIn67- (happy_var_3 : happy_var_1- )}}--happyReduce_262 = happySpecReduce_3 58# happyReduction_262-happyReduction_262 happy_x_3- happy_x_2- happy_x_1- = case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut66 happy_x_3 of { happy_var_3 -> - happyIn67- ([happy_var_3, happy_var_1]- )}}--happyReduce_263 = happySpecReduce_1 58# happyReduction_263-happyReduction_263 happy_x_1- = case happyOut64 happy_x_1 of { happy_var_1 -> - happyIn67- ([happy_var_1]- )}--happyReduce_264 = happySpecReduce_2 59# happyReduction_264-happyReduction_264 happy_x_2- happy_x_1- = case happyOut69 happy_x_1 of { happy_var_1 -> - happyIn68- (happy_var_1- )}--happyReduce_265 = happySpecReduce_2 60# happyReduction_265-happyReduction_265 happy_x_2- happy_x_1- = case happyOut71 happy_x_1 of { happy_var_1 -> - case happyOut69 happy_x_2 of { happy_var_2 -> - happyIn69- (happy_var_1 ++ happy_var_2- )}}--happyReduce_266 = happySpecReduce_2 60# happyReduction_266-happyReduction_266 happy_x_2- happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - case happyOut69 happy_x_2 of { happy_var_2 -> - happyIn69- (DomainFull happy_var_1 : happy_var_2- )}}--happyReduce_267 = happySpecReduce_1 60# happyReduction_267-happyReduction_267 happy_x_1- = case happyOut71 happy_x_1 of { happy_var_1 -> - happyIn69- (happy_var_1- )}--happyReduce_268 = happySpecReduce_1 60# happyReduction_268-happyReduction_268 happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - happyIn69- ([DomainFull happy_var_1]- )}--happyReduce_269 = happySpecReduce_2 61# happyReduction_269-happyReduction_269 happy_x_2- happy_x_1- = case happyOut71 happy_x_1 of { happy_var_1 -> - case happyOut70 happy_x_2 of { happy_var_2 -> - happyIn70- (happy_var_1 ++ happy_var_2- )}}--happyReduce_270 = happySpecReduce_2 61# happyReduction_270-happyReduction_270 happy_x_2- happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - case happyOut70 happy_x_2 of { happy_var_2 -> - happyIn70- (DomainFull happy_var_1 : happy_var_2- )}}--happyReduce_271 = happySpecReduce_0 61# happyReduction_271-happyReduction_271 = happyIn70- ([]- )--happyReduce_272 = happySpecReduce_1 62# happyReduction_272-happyReduction_272 happy_x_1- = case happyOut72 happy_x_1 of { happy_var_1 -> - happyIn71- (case happy_var_1 of- Left lbs -> lbs- Right _ -> fail "expected sequence of bound identifiers, not absurd pattern"- )}--happyReduce_273 = happySpecReduce_1 63# happyReduction_273-happyReduction_273 happy_x_1- = case happyOut26 happy_x_1 of { happy_var_1 -> - happyIn72- (Left [DomainFree defaultArgInfo $ mkBoundName_ happy_var_1]- )}--happyReduce_274 = happySpecReduce_2 63# happyReduction_274-happyReduction_274 happy_x_2- happy_x_1- = case happyOut26 happy_x_2 of { happy_var_2 -> - happyIn72- (Left [DomainFree (setRelevance Irrelevant $ defaultArgInfo) $ mkBoundName_ happy_var_2]- )}--happyReduce_275 = happySpecReduce_2 63# happyReduction_275-happyReduction_275 happy_x_2- happy_x_1- = case happyOut26 happy_x_2 of { happy_var_2 -> - happyIn72- (Left [DomainFree (setRelevance NonStrict $ defaultArgInfo) $ mkBoundName_ happy_var_2]- )}--happyReduce_276 = happySpecReduce_3 63# happyReduction_276-happyReduction_276 happy_x_3- happy_x_2- happy_x_1- = case happyOut29 happy_x_2 of { happy_var_2 -> - happyIn72- (mapLeft (map (DomainFree (setHiding Hidden $ defaultArgInfo) . mkBoundName_)) happy_var_2- )}--happyReduce_277 = happySpecReduce_3 63# happyReduction_277-happyReduction_277 happy_x_3- happy_x_2- happy_x_1- = case happyOut28 happy_x_2 of { happy_var_2 -> - happyIn72- (Left $ map (DomainFree (setHiding Instance $ defaultArgInfo) . mkBoundName_) happy_var_2- )}--happyReduce_278 = happyReduce 4# 63# happyReduction_278-happyReduction_278 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut28 happy_x_3 of { happy_var_3 -> - happyIn72- (Left $ map (DomainFree (setHiding Hidden $ setRelevance Irrelevant $ defaultArgInfo) . mkBoundName_) happy_var_3- ) `HappyStk` happyRest}--happyReduce_279 = happyReduce 4# 63# happyReduction_279-happyReduction_279 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut28 happy_x_3 of { happy_var_3 -> - happyIn72- (Left $ map (DomainFree (setHiding Instance $ setRelevance Irrelevant $ defaultArgInfo) . mkBoundName_) happy_var_3- ) `HappyStk` happyRest}--happyReduce_280 = happyReduce 4# 63# happyReduction_280-happyReduction_280 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut28 happy_x_3 of { happy_var_3 -> - happyIn72- (Left $ map (DomainFree (setHiding Hidden $ setRelevance NonStrict $ defaultArgInfo) . mkBoundName_) happy_var_3- ) `HappyStk` happyRest}--happyReduce_281 = happyReduce 4# 63# happyReduction_281-happyReduction_281 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut28 happy_x_3 of { happy_var_3 -> - happyIn72- (Left $ map (DomainFree (setHiding Instance $ setRelevance NonStrict $ defaultArgInfo) . mkBoundName_) happy_var_3- ) `HappyStk` happyRest}--happyReduce_282 = happyMonadReduce 1# 64# happyReduction_282-happyReduction_282 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut74 happy_x_1 of { happy_var_1 -> - ( mergeImportDirectives happy_var_1)}- ) (\r -> happyReturn (happyIn73 r))--happyReduce_283 = happySpecReduce_2 65# happyReduction_283-happyReduction_283 happy_x_2- happy_x_1- = case happyOut75 happy_x_1 of { happy_var_1 -> - case happyOut74 happy_x_2 of { happy_var_2 -> - happyIn74- (happy_var_1 : happy_var_2- )}}--happyReduce_284 = happySpecReduce_0 65# happyReduction_284-happyReduction_284 = happyIn74- ([]- )--happyReduce_285 = happySpecReduce_1 66# happyReduction_285-happyReduction_285 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPublic happy_var_1) -> - happyIn75- (defaultImportDir { importDirRange = getRange happy_var_1, publicOpen = True }- )}--happyReduce_286 = happySpecReduce_1 66# happyReduction_286-happyReduction_286 happy_x_1- = case happyOut76 happy_x_1 of { happy_var_1 -> - happyIn75- (defaultImportDir { importDirRange = snd happy_var_1, using = fst happy_var_1 }- )}--happyReduce_287 = happySpecReduce_1 66# happyReduction_287-happyReduction_287 happy_x_1- = case happyOut77 happy_x_1 of { happy_var_1 -> - happyIn75- (defaultImportDir { importDirRange = snd happy_var_1, hiding = fst happy_var_1 }- )}--happyReduce_288 = happySpecReduce_1 66# happyReduction_288-happyReduction_288 happy_x_1- = case happyOut78 happy_x_1 of { happy_var_1 -> - happyIn75- (defaultImportDir { importDirRange = snd happy_var_1, impRenaming = fst happy_var_1 }- )}--happyReduce_289 = happyReduce 4# 67# happyReduction_289-happyReduction_289 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwUsing happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> - case happyOut83 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> - happyIn76- ((Using happy_var_3 , getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4))- ) `HappyStk` happyRest}}}}--happyReduce_290 = happyReduce 4# 68# happyReduction_290-happyReduction_290 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwHiding happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> - case happyOut83 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> - happyIn77- ((happy_var_3 , getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4))- ) `HappyStk` happyRest}}}}--happyReduce_291 = happyReduce 4# 69# happyReduction_291-happyReduction_291 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwRenaming happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> - case happyOut79 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> - happyIn78- ((happy_var_3 , getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4))- ) `HappyStk` happyRest}}}}--happyReduce_292 = happySpecReduce_3 69# happyReduction_292-happyReduction_292 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwRenaming happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> - case happyOutTok happy_x_3 of { (TokSymbol SymCloseParen happy_var_3) -> - happyIn78- (([] , getRange (happy_var_1,happy_var_2,happy_var_3))- )}}}--happyReduce_293 = happySpecReduce_3 70# happyReduction_293-happyReduction_293 happy_x_3- happy_x_2- happy_x_1- = case happyOut80 happy_x_1 of { happy_var_1 -> - case happyOut79 happy_x_3 of { happy_var_3 -> - happyIn79- (happy_var_1 : happy_var_3- )}}--happyReduce_294 = happySpecReduce_1 70# happyReduction_294-happyReduction_294 happy_x_1- = case happyOut80 happy_x_1 of { happy_var_1 -> - happyIn79- ([happy_var_1]- )}--happyReduce_295 = happySpecReduce_3 71# happyReduction_295-happyReduction_295 happy_x_3- happy_x_2- happy_x_1- = case happyOut81 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (TokKeyword KwTo happy_var_2) -> - case happyOut18 happy_x_3 of { happy_var_3 -> - happyIn80- (Renaming happy_var_1 (setImportedName happy_var_1 happy_var_3) (getRange happy_var_2)- )}}}--happyReduce_296 = happySpecReduce_2 72# happyReduction_296-happyReduction_296 happy_x_2- happy_x_1- = case happyOut18 happy_x_2 of { happy_var_2 -> - happyIn81- (ImportedName happy_var_2- )}--happyReduce_297 = happySpecReduce_3 72# happyReduction_297-happyReduction_297 happy_x_3- happy_x_2- happy_x_1- = case happyOut18 happy_x_3 of { happy_var_3 -> - happyIn81- (ImportedModule happy_var_3- )}--happyReduce_298 = happySpecReduce_1 73# happyReduction_298-happyReduction_298 happy_x_1- = case happyOut18 happy_x_1 of { happy_var_1 -> - happyIn82- (ImportedName happy_var_1- )}--happyReduce_299 = happySpecReduce_2 73# happyReduction_299-happyReduction_299 happy_x_2- happy_x_1- = case happyOut18 happy_x_2 of { happy_var_2 -> - happyIn82- (ImportedModule happy_var_2- )}--happyReduce_300 = happySpecReduce_0 74# happyReduction_300-happyReduction_300 = happyIn83- ([]- )--happyReduce_301 = happySpecReduce_1 74# happyReduction_301-happyReduction_301 happy_x_1- = case happyOut84 happy_x_1 of { happy_var_1 -> - happyIn83- (happy_var_1- )}--happyReduce_302 = happySpecReduce_1 75# happyReduction_302-happyReduction_302 happy_x_1- = case happyOut82 happy_x_1 of { happy_var_1 -> - happyIn84- ([happy_var_1]- )}--happyReduce_303 = happySpecReduce_3 75# happyReduction_303-happyReduction_303 happy_x_3- happy_x_2- happy_x_1- = case happyOut82 happy_x_1 of { happy_var_1 -> - case happyOut84 happy_x_3 of { happy_var_3 -> - happyIn84- (happy_var_1 : happy_var_3- )}}--happyReduce_304 = happyMonadReduce 3# 76# happyReduction_304-happyReduction_304 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut88 happy_x_2 of { happy_var_2 -> - case happyOut87 happy_x_3 of { happy_var_3 -> - ( exprToLHS happy_var_1 >>= \p -> return (p happy_var_2 happy_var_3))}}}- ) (\r -> happyReturn (happyIn85 r))--happyReduce_305 = happyReduce 4# 76# happyReduction_305-happyReduction_305 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymEllipsis happy_var_1) -> - case happyOut86 happy_x_2 of { happy_var_2 -> - case happyOut88 happy_x_3 of { happy_var_3 -> - case happyOut87 happy_x_4 of { happy_var_4 -> - happyIn85- (Ellipsis (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_2 happy_var_3 happy_var_4- ) `HappyStk` happyRest}}}}--happyReduce_306 = happySpecReduce_0 77# happyReduction_306-happyReduction_306 = happyIn86- ([]- )--happyReduce_307 = happyMonadReduce 3# 77# happyReduction_307-happyReduction_307 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut43 happy_x_2 of { happy_var_2 -> - case happyOut86 happy_x_3 of { happy_var_3 -> - ( exprToPattern (RawApp (getRange happy_var_2) happy_var_2) >>= \p ->- return (p : happy_var_3))}}- ) (\r -> happyReturn (happyIn86 r))--happyReduce_308 = happySpecReduce_0 78# happyReduction_308-happyReduction_308 = happyIn87- ([]- )--happyReduce_309 = happySpecReduce_2 78# happyReduction_309-happyReduction_309 happy_x_2- happy_x_1- = case happyOut37 happy_x_2 of { happy_var_2 -> - happyIn87- (case happy_var_2 of { WithApp _ e es -> e : es; e -> [e] }- )}--happyReduce_310 = happySpecReduce_0 79# happyReduction_310-happyReduction_310 = happyIn88- ([]- )--happyReduce_311 = happySpecReduce_2 79# happyReduction_311-happyReduction_311 happy_x_2- happy_x_1- = case happyOut38 happy_x_2 of { happy_var_2 -> - happyIn88- (case happy_var_2 of { WithApp _ e es -> e : es; e -> [e] }- )}--happyReduce_312 = happySpecReduce_0 80# happyReduction_312-happyReduction_312 = happyIn89- (NoWhere- )--happyReduce_313 = happySpecReduce_2 80# happyReduction_313-happyReduction_313 happy_x_2- happy_x_1- = case happyOut168 happy_x_2 of { happy_var_2 -> - happyIn89- (AnyWhere happy_var_2- )}--happyReduce_314 = happyReduce 4# 80# happyReduction_314-happyReduction_314 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut18 happy_x_2 of { happy_var_2 -> - case happyOut168 happy_x_4 of { happy_var_4 -> - happyIn89- (SomeWhere happy_var_2 PublicAccess happy_var_4- ) `HappyStk` happyRest}}--happyReduce_315 = happyReduce 4# 80# happyReduction_315-happyReduction_315 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut168 happy_x_4 of { happy_var_4 -> - happyIn89- (SomeWhere happy_var_2 PublicAccess happy_var_4- ) `HappyStk` happyRest}}--happyReduce_316 = happySpecReduce_2 81# happyReduction_316-happyReduction_316 happy_x_2- happy_x_1- = case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut89 happy_x_2 of { happy_var_2 -> - happyIn90- (ExprWhere happy_var_1 happy_var_2- )}}--happyReduce_317 = happySpecReduce_1 82# happyReduction_317-happyReduction_317 happy_x_1- = case happyOut102 happy_x_1 of { happy_var_1 -> - happyIn91- (happy_var_1- )}--happyReduce_318 = happySpecReduce_1 82# happyReduction_318-happyReduction_318 happy_x_1- = case happyOut94 happy_x_1 of { happy_var_1 -> - happyIn91- (happy_var_1- )}--happyReduce_319 = happySpecReduce_1 82# happyReduction_319-happyReduction_319 happy_x_1- = case happyOut96 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_320 = happySpecReduce_1 82# happyReduction_320-happyReduction_320 happy_x_1- = case happyOut97 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_321 = happySpecReduce_1 82# happyReduction_321-happyReduction_321 happy_x_1- = case happyOut98 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_322 = happySpecReduce_1 82# happyReduction_322-happyReduction_322 happy_x_1- = case happyOut99 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_323 = happySpecReduce_1 82# happyReduction_323-happyReduction_323 happy_x_1- = case happyOut101 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_324 = happySpecReduce_1 82# happyReduction_324-happyReduction_324 happy_x_1- = case happyOut103 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_325 = happySpecReduce_1 82# happyReduction_325-happyReduction_325 happy_x_1- = case happyOut104 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_326 = happySpecReduce_1 82# happyReduction_326-happyReduction_326 happy_x_1- = case happyOut105 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_327 = happySpecReduce_1 82# happyReduction_327-happyReduction_327 happy_x_1- = case happyOut106 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_328 = happySpecReduce_1 82# happyReduction_328-happyReduction_328 happy_x_1- = case happyOut107 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_329 = happySpecReduce_1 82# happyReduction_329-happyReduction_329 happy_x_1- = case happyOut108 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_330 = happySpecReduce_1 82# happyReduction_330-happyReduction_330 happy_x_1- = case happyOut109 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_331 = happySpecReduce_1 82# happyReduction_331-happyReduction_331 happy_x_1- = case happyOut121 happy_x_1 of { happy_var_1 -> - happyIn91- (happy_var_1- )}--happyReduce_332 = happySpecReduce_1 82# happyReduction_332-happyReduction_332 happy_x_1- = case happyOut124 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_333 = happySpecReduce_1 82# happyReduction_333-happyReduction_333 happy_x_1- = case happyOut125 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_334 = happySpecReduce_1 82# happyReduction_334-happyReduction_334 happy_x_1- = case happyOut128 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_335 = happySpecReduce_1 82# happyReduction_335-happyReduction_335 happy_x_1- = case happyOut111 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_336 = happySpecReduce_1 82# happyReduction_336-happyReduction_336 happy_x_1- = case happyOut112 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_337 = happySpecReduce_1 82# happyReduction_337-happyReduction_337 happy_x_1- = case happyOut110 happy_x_1 of { happy_var_1 -> - happyIn91- ([happy_var_1]- )}--happyReduce_338 = happySpecReduce_3 83# happyReduction_338-happyReduction_338 happy_x_3- happy_x_2- happy_x_1- = case happyOut19 happy_x_1 of { happy_var_1 -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn92- (map (\ x -> TypeSig defaultArgInfo x happy_var_3) happy_var_1- )}}--happyReduce_339 = happySpecReduce_3 84# happyReduction_339-happyReduction_339 happy_x_3- happy_x_2- happy_x_1- = case happyOut23 happy_x_1 of { happy_var_1 -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn93- (map (fmap (\ x -> TypeSig defaultArgInfo x happy_var_3)) happy_var_1- )}}--happyReduce_340 = happyReduce 4# 84# happyReduction_340-happyReduction_340 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut23 happy_x_2 of { happy_var_2 -> - case happyOut37 happy_x_4 of { happy_var_4 -> - happyIn93- (let setOverlap (Arg i x) = Arg i{ argInfoOverlappable = True } x in- map (setOverlap . fmap (\ x -> TypeSig defaultArgInfo x happy_var_4)) happy_var_2- ) `HappyStk` happyRest}}--happyReduce_341 = happySpecReduce_2 84# happyReduction_341-happyReduction_341 happy_x_2- happy_x_1- = case happyOut160 happy_x_2 of { happy_var_2 -> - happyIn93- (let- setInstance (TypeSig info x t) = TypeSig (setHiding Instance info) x t- setInstance _ = __IMPOSSIBLE__ in- map (fmap setInstance) happy_var_2- )}--happyReduce_342 = happyMonadReduce 3# 85# happyReduction_342-happyReduction_342 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut85 happy_x_1 of { happy_var_1 -> - case happyOut95 happy_x_2 of { happy_var_2 -> - case happyOut89 happy_x_3 of { happy_var_3 -> - ( funClauseOrTypeSigs happy_var_1 happy_var_2 happy_var_3)}}}- ) (\r -> happyReturn (happyIn94 r))--happyReduce_343 = happySpecReduce_2 86# happyReduction_343-happyReduction_343 happy_x_2- happy_x_1- = case happyOut37 happy_x_2 of { happy_var_2 -> - happyIn95- (JustRHS (RHS happy_var_2)- )}--happyReduce_344 = happySpecReduce_2 86# happyReduction_344-happyReduction_344 happy_x_2- happy_x_1- = case happyOut37 happy_x_2 of { happy_var_2 -> - happyIn95- (TypeSigsRHS happy_var_2- )}--happyReduce_345 = happySpecReduce_0 86# happyReduction_345-happyReduction_345 = happyIn95- (JustRHS AbsurdRHS- )--happyReduce_346 = happyReduce 7# 87# happyReduction_346-happyReduction_346 (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 { (TokKeyword KwData happy_var_1) -> - case happyOut18 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymColon happy_var_4) -> - case happyOut37 happy_x_5 of { happy_var_5 -> - case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> - case happyOut168 happy_x_7 of { happy_var_7 -> - happyIn96- (Data (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5,happy_var_6,happy_var_7)) Inductive happy_var_2 happy_var_3 (Just happy_var_5) happy_var_7- ) `HappyStk` happyRest}}}}}}}--happyReduce_347 = happyReduce 7# 87# happyReduction_347-happyReduction_347 (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 { (TokKeyword KwCoData happy_var_1) -> - case happyOut18 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymColon happy_var_4) -> - case happyOut37 happy_x_5 of { happy_var_5 -> - case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> - case happyOut168 happy_x_7 of { happy_var_7 -> - happyIn96- (Data (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5,happy_var_6,happy_var_7)) CoInductive happy_var_2 happy_var_3 (Just happy_var_5) happy_var_7- ) `HappyStk` happyRest}}}}}}}--happyReduce_348 = happyReduce 5# 87# happyReduction_348-happyReduction_348 (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 { (TokKeyword KwData happy_var_1) -> - case happyOut18 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> - case happyOut168 happy_x_5 of { happy_var_5 -> - happyIn96- (Data (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) Inductive happy_var_2 happy_var_3 Nothing happy_var_5- ) `HappyStk` happyRest}}}}}--happyReduce_349 = happyReduce 5# 87# happyReduction_349-happyReduction_349 (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 { (TokKeyword KwCoData happy_var_1) -> - case happyOut18 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> - case happyOut168 happy_x_5 of { happy_var_5 -> - happyIn96- (Data (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) CoInductive happy_var_2 happy_var_3 Nothing happy_var_5- ) `HappyStk` happyRest}}}}}--happyReduce_350 = happyReduce 5# 88# happyReduction_350-happyReduction_350 (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 { (TokKeyword KwData happy_var_1) -> - case happyOut18 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymColon happy_var_4) -> - case happyOut37 happy_x_5 of { happy_var_5 -> - happyIn97- (DataSig (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) Inductive happy_var_2 happy_var_3 happy_var_5- ) `HappyStk` happyRest}}}}}--happyReduce_351 = happyMonadReduce 7# 89# happyReduction_351-happyReduction_351 (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) tk- = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> - case happyOut45 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymColon happy_var_4) -> - case happyOut37 happy_x_5 of { happy_var_5 -> - case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> - case happyOut162 happy_x_7 of { happy_var_7 -> - ( exprToName happy_var_2 >>= \ n -> let ((x,y,z),ds) = happy_var_7 in return $ Record (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5,happy_var_6,happy_var_7)) n x y z happy_var_3 (Just happy_var_5) ds)}}}}}}}- ) (\r -> happyReturn (happyIn98 r))--happyReduce_352 = happyMonadReduce 5# 89# happyReduction_352-happyReduction_352 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> - case happyOut45 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> - case happyOut162 happy_x_5 of { happy_var_5 -> - ( exprToName happy_var_2 >>= \ n -> let ((x,y,z),ds) = happy_var_5 in return $ Record (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) n x y z happy_var_3 Nothing ds)}}}}}- ) (\r -> happyReturn (happyIn98 r))--happyReduce_353 = happyMonadReduce 5# 90# happyReduction_353-happyReduction_353 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> - case happyOut45 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymColon happy_var_4) -> - case happyOut37 happy_x_5 of { happy_var_5 -> - ( exprToName happy_var_2 >>= \ n -> return $ RecordSig (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) n happy_var_3 happy_var_5)}}}}}- ) (\r -> happyReturn (happyIn99 r))--happyReduce_354 = happySpecReduce_2 91# happyReduction_354-happyReduction_354 happy_x_2- happy_x_1- = case happyOut18 happy_x_2 of { happy_var_2 -> - happyIn100- ((happy_var_2, NotInstanceDef)- )}--happyReduce_355 = happyReduce 5# 91# happyReduction_355-happyReduction_355 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut18 happy_x_4 of { happy_var_4 -> - happyIn100- ((happy_var_4, InstanceDef)- ) `HappyStk` happyRest}--happyReduce_356 = happySpecReduce_3 92# happyReduction_356-happyReduction_356 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInfix happy_var_1) -> - case happyOut17 happy_x_2 of { happy_var_2 -> - case happyOut27 happy_x_3 of { happy_var_3 -> - happyIn101- (Infix (Fixity (getRange (happy_var_1,happy_var_3)) (Related happy_var_2) NonAssoc) happy_var_3- )}}}--happyReduce_357 = happySpecReduce_3 92# happyReduction_357-happyReduction_357 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInfixL happy_var_1) -> - case happyOut17 happy_x_2 of { happy_var_2 -> - case happyOut27 happy_x_3 of { happy_var_3 -> - happyIn101- (Infix (Fixity (getRange (happy_var_1,happy_var_3)) (Related happy_var_2) LeftAssoc) happy_var_3- )}}}--happyReduce_358 = happySpecReduce_3 92# happyReduction_358-happyReduction_358 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInfixR happy_var_1) -> - case happyOut17 happy_x_2 of { happy_var_2 -> - case happyOut27 happy_x_3 of { happy_var_3 -> - happyIn101- (Infix (Fixity (getRange (happy_var_1,happy_var_3)) (Related happy_var_2) RightAssoc) happy_var_3- )}}}--happyReduce_359 = happySpecReduce_2 93# happyReduction_359-happyReduction_359 happy_x_2- happy_x_1- = case happyOut160 happy_x_2 of { happy_var_2 -> - happyIn102- (let- inst i | getHiding i == Instance = InstanceDef- | otherwise = NotInstanceDef- toField (Arg info (TypeSig info' x t)) = Field (inst info') x (Arg info t)- in map toField happy_var_2- )}--happyReduce_360 = happySpecReduce_2 94# happyReduction_360-happyReduction_360 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwMutual happy_var_1) -> - case happyOut167 happy_x_2 of { happy_var_2 -> - happyIn103- (Mutual (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_361 = happySpecReduce_2 95# happyReduction_361-happyReduction_361 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwAbstract happy_var_1) -> - case happyOut167 happy_x_2 of { happy_var_2 -> - happyIn104- (Abstract (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_362 = happySpecReduce_2 96# happyReduction_362-happyReduction_362 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPrivate happy_var_1) -> - case happyOut167 happy_x_2 of { happy_var_2 -> - happyIn105- (Private (fuseRange happy_var_1 happy_var_2) UserWritten happy_var_2- )}}--happyReduce_363 = happySpecReduce_2 97# happyReduction_363-happyReduction_363 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInstance happy_var_1) -> - case happyOut167 happy_x_2 of { happy_var_2 -> - happyIn106- (InstanceB (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_364 = happySpecReduce_2 98# happyReduction_364-happyReduction_364 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwMacro happy_var_1) -> - case happyOut167 happy_x_2 of { happy_var_2 -> - happyIn107- (Macro (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_365 = happySpecReduce_2 99# happyReduction_365-happyReduction_365 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPostulate happy_var_1) -> - case happyOut167 happy_x_2 of { happy_var_2 -> - happyIn108- (Postulate (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_366 = happySpecReduce_2 100# happyReduction_366-happyReduction_366 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPrimitive happy_var_1) -> - case happyOut158 happy_x_2 of { happy_var_2 -> - happyIn109- (Primitive (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_367 = happySpecReduce_3 101# happyReduction_367-happyReduction_367 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwUnquoteDecl happy_var_1) -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn110- (UnquoteDecl (fuseRange happy_var_1 happy_var_3) [] happy_var_3- )}}--happyReduce_368 = happyReduce 4# 101# happyReduction_368-happyReduction_368 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwUnquoteDecl happy_var_1) -> - case happyOut19 happy_x_2 of { happy_var_2 -> - case happyOut37 happy_x_4 of { happy_var_4 -> - happyIn110- (UnquoteDecl (fuseRange happy_var_1 happy_var_4) happy_var_2 happy_var_4- ) `HappyStk` happyRest}}}--happyReduce_369 = happyReduce 4# 101# happyReduction_369-happyReduction_369 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwUnquoteDef happy_var_1) -> - case happyOut19 happy_x_2 of { happy_var_2 -> - case happyOut37 happy_x_4 of { happy_var_4 -> - happyIn110- (UnquoteDef (fuseRange happy_var_1 happy_var_4) happy_var_2 happy_var_4- ) `HappyStk` happyRest}}}--happyReduce_370 = happyMonadReduce 5# 102# happyReduction_370-happyReduction_370 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut18 happy_x_2 of { happy_var_2 -> - case happyOut115 happy_x_3 of { happy_var_3 -> - case happyOut114 happy_x_5 of { happy_var_5 -> - (- case happy_var_2 of- Name _ [_] -> case mkNotation happy_var_3 (map rangedThing happy_var_5) of- Left err -> parseError $ "Malformed syntax declaration: " ++ err- Right n -> return $ Syntax happy_var_2 n- _ -> parseError "Syntax declarations are allowed only for simple names (without holes)")}}}- ) (\r -> happyReturn (happyIn111 r))--happyReduce_371 = happyMonadReduce 5# 103# happyReduction_371-happyReduction_371 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwPatternSyn happy_var_1) -> - case happyOut18 happy_x_2 of { happy_var_2 -> - case happyOut113 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymEqual happy_var_4) -> - case happyOut37 happy_x_5 of { happy_var_5 -> - ( do- p <- exprToPattern happy_var_5- return (PatternSyn (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) happy_var_2 happy_var_3 p))}}}}}- ) (\r -> happyReturn (happyIn112 r))--happyReduce_372 = happySpecReduce_0 104# happyReduction_372-happyReduction_372 = happyIn113- ([]- )--happyReduce_373 = happyMonadReduce 1# 104# happyReduction_373-happyReduction_373 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - ( patternSynArgs happy_var_1)}- ) (\r -> happyReturn (happyIn113 r))--happyReduce_374 = happySpecReduce_1 105# happyReduction_374-happyReduction_374 happy_x_1- = case happyOut119 happy_x_1 of { happy_var_1 -> - happyIn114- ([happy_var_1]- )}--happyReduce_375 = happySpecReduce_2 105# happyReduction_375-happyReduction_375 happy_x_2- happy_x_1- = case happyOut114 happy_x_1 of { happy_var_1 -> - case happyOut119 happy_x_2 of { happy_var_2 -> - happyIn114- (happy_var_1 ++ [happy_var_2]- )}}--happyReduce_376 = happySpecReduce_1 106# happyReduction_376-happyReduction_376 happy_x_1- = case happyOut116 happy_x_1 of { happy_var_1 -> - happyIn115- ([happy_var_1]- )}--happyReduce_377 = happySpecReduce_2 106# happyReduction_377-happyReduction_377 happy_x_2- happy_x_1- = case happyOut115 happy_x_1 of { happy_var_1 -> - case happyOut116 happy_x_2 of { happy_var_2 -> - happyIn115- (happy_var_1 ++ [happy_var_2]- )}}--happyReduce_378 = happySpecReduce_1 107# happyReduction_378-happyReduction_378 happy_x_1- = case happyOut117 happy_x_1 of { happy_var_1 -> - happyIn116- (defaultNamedArg happy_var_1- )}--happyReduce_379 = happySpecReduce_3 107# happyReduction_379-happyReduction_379 happy_x_3- happy_x_2- happy_x_1- = case happyOut118 happy_x_2 of { happy_var_2 -> - happyIn116- (setHiding Hidden $ defaultNamedArg happy_var_2- )}--happyReduce_380 = happySpecReduce_3 107# happyReduction_380-happyReduction_380 happy_x_3- happy_x_2- happy_x_1- = case happyOut118 happy_x_2 of { happy_var_2 -> - happyIn116- (setHiding Instance $ defaultNamedArg happy_var_2- )}--happyReduce_381 = happyReduce 5# 107# happyReduction_381-happyReduction_381 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut119 happy_x_2 of { happy_var_2 -> - case happyOut118 happy_x_4 of { happy_var_4 -> - happyIn116- (setHiding Hidden $ defaultArg $ named happy_var_2 happy_var_4- ) `HappyStk` happyRest}}--happyReduce_382 = happyReduce 5# 107# happyReduction_382-happyReduction_382 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut119 happy_x_2 of { happy_var_2 -> - case happyOut118 happy_x_4 of { happy_var_4 -> - happyIn116- (setHiding Instance $ defaultArg $ named happy_var_2 happy_var_4- ) `HappyStk` happyRest}}--happyReduce_383 = happySpecReduce_1 108# happyReduction_383-happyReduction_383 happy_x_1- = case happyOut119 happy_x_1 of { happy_var_1 -> - happyIn117- (ExprHole (rangedThing happy_var_1)- )}--happyReduce_384 = happyReduce 6# 108# happyReduction_384-happyReduction_384 (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 happyOut119 happy_x_3 of { happy_var_3 -> - case happyOut119 happy_x_5 of { happy_var_5 -> - happyIn117- (LambdaHole (rangedThing happy_var_3) (rangedThing happy_var_5)- ) `HappyStk` happyRest}}--happyReduce_385 = happyReduce 6# 108# happyReduction_385-happyReduction_385 (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 happyOut119 happy_x_5 of { happy_var_5 -> - happyIn117- (LambdaHole "_" (rangedThing happy_var_5)- ) `HappyStk` happyRest}--happyReduce_386 = happySpecReduce_1 109# happyReduction_386-happyReduction_386 happy_x_1- = case happyOut119 happy_x_1 of { happy_var_1 -> - happyIn118- (ExprHole (rangedThing happy_var_1)- )}--happyReduce_387 = happyReduce 4# 109# happyReduction_387-happyReduction_387 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut119 happy_x_2 of { happy_var_2 -> - case happyOut119 happy_x_4 of { happy_var_4 -> - happyIn118- (LambdaHole (rangedThing happy_var_2) (rangedThing happy_var_4)- ) `HappyStk` happyRest}}--happyReduce_388 = happyReduce 4# 109# happyReduction_388-happyReduction_388 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut119 happy_x_4 of { happy_var_4 -> - happyIn118- (LambdaHole "_" (rangedThing happy_var_4)- ) `HappyStk` happyRest}--happyReduce_389 = happySpecReduce_1 110# happyReduction_389-happyReduction_389 happy_x_1- = case happyOutTok happy_x_1 of { (TokId happy_var_1) -> - happyIn119- (Ranged (getRange $ fst happy_var_1) (stringToRawName $ snd happy_var_1)- )}--happyReduce_390 = happySpecReduce_1 111# happyReduction_390-happyReduction_390 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> - happyIn120- (Just (getRange happy_var_1)- )}--happyReduce_391 = happySpecReduce_0 111# happyReduction_391-happyReduction_391 = happyIn120- (Nothing- )--happyReduce_392 = happyMonadReduce 5# 112# happyReduction_392-happyReduction_392 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut120 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (TokKeyword KwImport happy_var_2) -> - case happyOut25 happy_x_3 of { happy_var_3 -> - case happyOut122 happy_x_4 of { happy_var_4 -> - case happyOut73 happy_x_5 of { happy_var_5 -> - (- let- { doOpen = maybe DontOpen (const DoOpen) happy_var_1- ; m = happy_var_3- ; es = happy_var_4- ; dir = happy_var_5- ; r = getRange (m, es, dir)- ; mr = getRange m- ; unique = hashString $ show $ (Nothing :: Maybe ()) <$ r- -- turn range into unique id, but delete file path- -- which is absolute and messes up suite of failing tests- -- (different hashs on different installations)- -- TODO: Don't use (insecure) hashes in this way.- ; fresh = Name mr [ Id $ stringToRawName $ ".#" ++ show m ++ "-" ++ show unique ]- ; impStm asR = Import mr m (Just (AsName fresh asR)) DontOpen defaultImportDir- ; appStm m' es =- let r = getRange (m, es) in- Private r Inserted- [ ModuleMacro r m'- (SectionApp (getRange es) []- (RawApp (getRange es) (Ident (QName fresh) : es)))- doOpen dir- ]- ; (initArgs, last2Args) = splitAt (length es - 2) es- ; parseAsClause = case last2Args of- { [ Ident (QName (Name asR [Id x]))- , Ident (QName m')- ] | rawNameToString x == "as" -> Just (asR, m')- ; _ -> Nothing- }- } in- case es of- { [] -> return [Import mr m Nothing doOpen dir]- ; _ | Just (asR, m') <- parseAsClause ->- if null initArgs then return- [ Import (getRange (m, asR, m', dir)) m- (Just (AsName m' asR)) doOpen dir- ]- else return [ impStm asR, appStm m' initArgs ]- | DontOpen <- doOpen -> parseErrorAt (fromJust $ rStart' $ getRange happy_var_2) "An import statement with module instantiation does not actually import the module. This statement achieves nothing. Either add the `open' keyword or bind the instantiated module with an `as' clause."- | otherwise -> return- [ impStm noRange- , appStm (noName $ beginningOf $ getRange m) es- ]- })}}}}}- ) (\r -> happyReturn (happyIn121 r))--happyReduce_393 = happyReduce 4# 112# happyReduction_393-happyReduction_393 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut25 happy_x_2 of { happy_var_2 -> - case happyOut122 happy_x_3 of { happy_var_3 -> - case happyOut73 happy_x_4 of { happy_var_4 -> - happyIn121- (let- { m = happy_var_2- ; es = happy_var_3- ; dir = happy_var_4- ; r = getRange (m, es, dir)- } in- [ case es of- { [] -> Open r m dir- ; _ -> Private r Inserted- [ ModuleMacro r (noName $ beginningOf $ getRange m)- (SectionApp (getRange (m , es)) [] (RawApp (fuseRange m es) (Ident m : es)))- DoOpen dir- ]- }- ]- ) `HappyStk` happyRest}}}--happyReduce_394 = happyReduce 6# 112# happyReduction_394-happyReduction_394 (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 happyOut25 happy_x_2 of { happy_var_2 -> - case happyOut73 happy_x_6 of { happy_var_6 -> - happyIn121- (let r = getRange happy_var_2 in- [ Private r Inserted- [ ModuleMacro r (noName $ beginningOf $ getRange happy_var_2) (RecordModuleIFS r happy_var_2) DoOpen happy_var_6- ]- ]- ) `HappyStk` happyRest}}--happyReduce_395 = happySpecReduce_0 113# happyReduction_395-happyReduction_395 = happyIn122- ([]- )--happyReduce_396 = happySpecReduce_2 113# happyReduction_396-happyReduction_396 happy_x_2- happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_2 of { happy_var_2 -> - happyIn122- (happy_var_1 : happy_var_2- )}}--happyReduce_397 = happyReduce 4# 114# happyReduction_397-happyReduction_397 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut25 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (TokSymbol SymDoubleOpenBrace happy_var_2) -> - case happyOutTok happy_x_3 of { (TokSymbol SymEllipsis happy_var_3) -> - case happyOut20 happy_x_4 of { happy_var_4 -> - happyIn123- ((\ts ->- if null ts then return $ RecordModuleIFS (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_1- else parseError "No bindings allowed for record module with non-canonical implicits" )- ) `HappyStk` happyRest}}}}--happyReduce_398 = happySpecReduce_2 114# happyReduction_398-happyReduction_398 happy_x_2- happy_x_1- = case happyOut25 happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_2 of { happy_var_2 -> - happyIn123- ((\ts -> return $ SectionApp (getRange (happy_var_1, happy_var_2)) ts (RawApp (fuseRange happy_var_1 happy_var_2) (Ident happy_var_1 : happy_var_2)) )- )}}--happyReduce_399 = happyMonadReduce 6# 115# happyReduction_399-happyReduction_399 (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) tk- = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> - case happyOut25 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOut123 happy_x_5 of { happy_var_5 -> - case happyOut73 happy_x_6 of { happy_var_6 -> - ( do { ma <- happy_var_5 (map addType happy_var_3)- ; name <- ensureUnqual happy_var_2- ; return $ ModuleMacro (getRange (happy_var_1, happy_var_2, ma, happy_var_6)) name ma DontOpen happy_var_6 })}}}}}- ) (\r -> happyReturn (happyIn124 r))--happyReduce_400 = happyMonadReduce 7# 115# happyReduction_400-happyReduction_400 (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) tk- = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwModule happy_var_2) -> - case happyOut18 happy_x_3 of { happy_var_3 -> - case happyOut70 happy_x_4 of { happy_var_4 -> - case happyOut123 happy_x_6 of { happy_var_6 -> - case happyOut73 happy_x_7 of { happy_var_7 -> - ( do {ma <- happy_var_6 (map addType happy_var_4); return $ ModuleMacro (getRange (happy_var_1, happy_var_2, happy_var_3, ma, happy_var_7)) happy_var_3 ma DoOpen happy_var_7 })}}}}}}- ) (\r -> happyReturn (happyIn124 r))--happyReduce_401 = happyReduce 5# 116# happyReduction_401-happyReduction_401 (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 { (TokKeyword KwModule happy_var_1) -> - case happyOut25 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> - case happyOut168 happy_x_5 of { happy_var_5 -> - happyIn125- (Module (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) happy_var_2 (map addType happy_var_3) happy_var_5- ) `HappyStk` happyRest}}}}}--happyReduce_402 = happyReduce 5# 116# happyReduction_402-happyReduction_402 (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 { (TokKeyword KwModule happy_var_1) -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> - case happyOut168 happy_x_5 of { happy_var_5 -> - happyIn125- (Module (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) (QName happy_var_2) (map addType happy_var_3) happy_var_5- ) `HappyStk` happyRest}}}}}--happyReduce_403 = happySpecReduce_1 117# happyReduction_403-happyReduction_403 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> - happyIn126- (noName (getRange happy_var_1)- )}--happyReduce_404 = happySpecReduce_1 118# happyReduction_404-happyReduction_404 happy_x_1- = case happyOut170 happy_x_1 of { happy_var_1 -> - happyIn127- (figureOutTopLevelModule happy_var_1- )}--happyReduce_405 = happySpecReduce_1 119# happyReduction_405-happyReduction_405 happy_x_1- = case happyOut129 happy_x_1 of { happy_var_1 -> - happyIn128- (Pragma happy_var_1- )}--happyReduce_406 = happySpecReduce_1 120# happyReduction_406-happyReduction_406 happy_x_1- = case happyOut131 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_407 = happySpecReduce_1 120# happyReduction_407-happyReduction_407 happy_x_1- = case happyOut132 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_408 = happySpecReduce_1 120# happyReduction_408-happyReduction_408 happy_x_1- = case happyOut133 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_409 = happySpecReduce_1 120# happyReduction_409-happyReduction_409 happy_x_1- = case happyOut134 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_410 = happySpecReduce_1 120# happyReduction_410-happyReduction_410 happy_x_1- = case happyOut137 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_411 = happySpecReduce_1 120# happyReduction_411-happyReduction_411 happy_x_1- = case happyOut135 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_412 = happySpecReduce_1 120# happyReduction_412-happyReduction_412 happy_x_1- = case happyOut136 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_413 = happySpecReduce_1 120# happyReduction_413-happyReduction_413 happy_x_1- = case happyOut138 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_414 = happySpecReduce_1 120# happyReduction_414-happyReduction_414 happy_x_1- = case happyOut139 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_415 = happySpecReduce_1 120# happyReduction_415-happyReduction_415 happy_x_1- = case happyOut140 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_416 = happySpecReduce_1 120# happyReduction_416-happyReduction_416 happy_x_1- = case happyOut141 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_417 = happySpecReduce_1 120# happyReduction_417-happyReduction_417 happy_x_1- = case happyOut142 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_418 = happySpecReduce_1 120# happyReduction_418-happyReduction_418 happy_x_1- = case happyOut143 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_419 = happySpecReduce_1 120# happyReduction_419-happyReduction_419 happy_x_1- = case happyOut144 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_420 = happySpecReduce_1 120# happyReduction_420-happyReduction_420 happy_x_1- = case happyOut151 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_421 = happySpecReduce_1 120# happyReduction_421-happyReduction_421 happy_x_1- = case happyOut152 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_422 = happySpecReduce_1 120# happyReduction_422-happyReduction_422 happy_x_1- = case happyOut153 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_423 = happySpecReduce_1 120# happyReduction_423-happyReduction_423 happy_x_1- = case happyOut148 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_424 = happySpecReduce_1 120# happyReduction_424-happyReduction_424 happy_x_1- = case happyOut147 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_425 = happySpecReduce_1 120# happyReduction_425-happyReduction_425 happy_x_1- = case happyOut146 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_426 = happySpecReduce_1 120# happyReduction_426-happyReduction_426 happy_x_1- = case happyOut149 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_427 = happySpecReduce_1 120# happyReduction_427-happyReduction_427 happy_x_1- = case happyOut150 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_428 = happySpecReduce_1 120# happyReduction_428-happyReduction_428 happy_x_1- = case happyOut145 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_429 = happySpecReduce_1 120# happyReduction_429-happyReduction_429 happy_x_1- = case happyOut154 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_430 = happySpecReduce_1 120# happyReduction_430-happyReduction_430 happy_x_1- = case happyOut155 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_431 = happySpecReduce_1 120# happyReduction_431-happyReduction_431 happy_x_1- = case happyOut130 happy_x_1 of { happy_var_1 -> - happyIn129- (happy_var_1- )}--happyReduce_432 = happyReduce 4# 121# happyReduction_432-happyReduction_432 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwOPTIONS happy_var_2) -> - case happyOut31 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> - happyIn130- (OptionsPragma (getRange (happy_var_1,happy_var_2,happy_var_4)) happy_var_3- ) `HappyStk` happyRest}}}}--happyReduce_433 = happyReduce 5# 122# happyReduction_433-happyReduction_433 (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 { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwBUILTIN happy_var_2) -> - case happyOutTok happy_x_3 of { (TokString happy_var_3) -> - case happyOut35 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn131- (BuiltinPragma (getRange (happy_var_1,happy_var_2,fst happy_var_3,happy_var_4,happy_var_5)) (snd happy_var_3) (Ident happy_var_4)- ) `HappyStk` happyRest}}}}}--happyReduce_434 = happyReduce 5# 122# happyReduction_434-happyReduction_434 (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 { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwBUILTIN happy_var_2) -> - case happyOutTok happy_x_3 of { (TokKeyword KwREWRITE happy_var_3) -> - case happyOut35 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn131- (BuiltinPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) "REWRITE" (Ident happy_var_4)- ) `HappyStk` happyRest}}}}}--happyReduce_435 = happyReduce 4# 123# happyReduction_435-happyReduction_435 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwREWRITE happy_var_2) -> - case happyOut36 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> - happyIn132- (RewritePragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_3- ) `HappyStk` happyRest}}}}--happyReduce_436 = happyReduce 5# 124# happyReduction_436-happyReduction_436 (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 { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED happy_var_2) -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut31 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn133- (CompiledPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_5)) happy_var_3 (unwords happy_var_4)- ) `HappyStk` happyRest}}}}}--happyReduce_437 = happyReduce 5# 125# happyReduction_437-happyReduction_437 (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 { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED_EXPORT happy_var_2) -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut32 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn134- (CompiledExportPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_5)) happy_var_3 happy_var_4- ) `HappyStk` happyRest}}}}}--happyReduce_438 = happyReduce 5# 126# happyReduction_438-happyReduction_438 (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 { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED_DECLARE_DATA happy_var_2) -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut31 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn135- (CompiledDeclareDataPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_5)) happy_var_3 (unwords happy_var_4)- ) `HappyStk` happyRest}}}}}--happyReduce_439 = happyReduce 5# 127# happyReduction_439-happyReduction_439 (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 { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED_TYPE happy_var_2) -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut31 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn136- (CompiledTypePragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_5)) happy_var_3 (unwords happy_var_4)- ) `HappyStk` happyRest}}}}}--happyReduce_440 = happyReduce 6# 128# happyReduction_440-happyReduction_440 (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 { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED_DATA happy_var_2) -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokString happy_var_4) -> - case happyOut31 happy_x_5 of { happy_var_5 -> - case happyOutTok happy_x_6 of { (TokSymbol SymClosePragma happy_var_6) -> - happyIn137- (CompiledDataPragma (getRange (happy_var_1,happy_var_2,happy_var_3,fst happy_var_4,happy_var_6)) happy_var_3 (snd happy_var_4) happy_var_5- ) `HappyStk` happyRest}}}}}}--happyReduce_441 = happyReduce 5# 129# happyReduction_441-happyReduction_441 (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 { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED_EPIC happy_var_2) -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut31 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn138- (CompiledEpicPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_5)) happy_var_3 (unwords happy_var_4)- ) `HappyStk` happyRest}}}}}--happyReduce_442 = happyReduce 5# 130# happyReduction_442-happyReduction_442 (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 { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED_JS happy_var_2) -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut31 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn139- (CompiledJSPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_5)) happy_var_3 (unwords happy_var_4)- ) `HappyStk` happyRest}}}}}--happyReduce_443 = happyReduce 5# 131# happyReduction_443-happyReduction_443 (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 { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED_UHC happy_var_2) -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut31 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn140- (CompiledUHCPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_5)) happy_var_3 (unwords happy_var_4)- ) `HappyStk` happyRest}}}}}--happyReduce_444 = happyReduce 6# 132# happyReduction_444-happyReduction_444 (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 { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED_DATA_UHC happy_var_2) -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokString happy_var_4) -> - case happyOut31 happy_x_5 of { happy_var_5 -> - case happyOutTok happy_x_6 of { (TokSymbol SymClosePragma happy_var_6) -> - happyIn141- (CompiledDataUHCPragma (getRange (happy_var_1,happy_var_2,happy_var_3,fst happy_var_4,happy_var_6)) happy_var_3 (snd happy_var_4) happy_var_5- ) `HappyStk` happyRest}}}}}}--happyReduce_445 = happyReduce 4# 133# happyReduction_445-happyReduction_445 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwHASKELL happy_var_2) -> - case happyOut33 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> - happyIn142- (HaskellCodePragma (getRange (happy_var_1, happy_var_2, happy_var_4)) (recoverLayout happy_var_3)- ) `HappyStk` happyRest}}}}--happyReduce_446 = happyReduce 4# 134# happyReduction_446-happyReduction_446 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwSTATIC happy_var_2) -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> - happyIn143- (StaticPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_3- ) `HappyStk` happyRest}}}}--happyReduce_447 = happyReduce 4# 135# happyReduction_447-happyReduction_447 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwINLINE happy_var_2) -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> - happyIn144- (InlinePragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_3- ) `HappyStk` happyRest}}}}--happyReduce_448 = happyMonadReduce 5# 136# happyReduction_448-happyReduction_448 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_3 of { (TokString happy_var_3) -> - case happyOut31 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - (- let (r, s) = happy_var_3 in- parseDisplayPragma (fuseRange happy_var_1 happy_var_5) (iStart r) (unwords (s : happy_var_4)))}}}}- ) (\r -> happyReturn (happyIn145 r))--happyReduce_449 = happySpecReduce_3 137# happyReduction_449-happyReduction_449 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwNO_TERMINATION_CHECK happy_var_2) -> - case happyOutTok happy_x_3 of { (TokSymbol SymClosePragma happy_var_3) -> - happyIn146- (TerminationCheckPragma (getRange (happy_var_1,happy_var_2,happy_var_3)) NoTerminationCheck- )}}}--happyReduce_450 = happySpecReduce_3 138# happyReduction_450-happyReduction_450 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwNON_TERMINATING happy_var_2) -> - case happyOutTok happy_x_3 of { (TokSymbol SymClosePragma happy_var_3) -> - happyIn147- (TerminationCheckPragma (getRange (happy_var_1,happy_var_2,happy_var_3)) NonTerminating- )}}}--happyReduce_451 = happySpecReduce_3 139# happyReduction_451-happyReduction_451 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwTERMINATING happy_var_2) -> - case happyOutTok happy_x_3 of { (TokSymbol SymClosePragma happy_var_3) -> - happyIn148- (TerminationCheckPragma (getRange (happy_var_1,happy_var_2,happy_var_3)) Terminating- )}}}--happyReduce_452 = happyReduce 4# 140# happyReduction_452-happyReduction_452 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwMEASURE happy_var_2) -> - case happyOut34 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> - happyIn149- (let r = getRange (happy_var_1, happy_var_2, happy_var_3, happy_var_4) in- TerminationCheckPragma r (TerminationMeasure r happy_var_3)- ) `HappyStk` happyRest}}}}--happyReduce_453 = happySpecReduce_3 141# happyReduction_453-happyReduction_453 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwCATCHALL happy_var_2) -> - case happyOutTok happy_x_3 of { (TokSymbol SymClosePragma happy_var_3) -> - happyIn150- (CatchallPragma (getRange (happy_var_1,happy_var_2,happy_var_3))- )}}}--happyReduce_454 = happyMonadReduce 4# 142# happyReduction_454-happyReduction_454 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwIMPORT happy_var_2) -> - case happyOutTok happy_x_3 of { (TokString happy_var_3) -> - case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> - ( let s = snd happy_var_3 in- if validHaskellModuleName s- then return $ ImportPragma (getRange (happy_var_1,happy_var_2,fst happy_var_3,happy_var_4)) s- else parseError $ "Malformed module name: " ++ s ++ ".")}}}}- ) (\r -> happyReturn (happyIn151 r))--happyReduce_455 = happyMonadReduce 4# 143# happyReduction_455-happyReduction_455 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwIMPORT_UHC happy_var_2) -> - case happyOutTok happy_x_3 of { (TokString happy_var_3) -> - case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> - ( let s = snd happy_var_3 in- if validHaskellModuleName s- then return $ ImportUHCPragma (getRange (happy_var_1,happy_var_2,fst happy_var_3,happy_var_4)) s- else parseError $ "Malformed module name: " ++ s ++ ".")}}}}- ) (\r -> happyReturn (happyIn152 r))--happyReduce_456 = happySpecReduce_3 144# happyReduction_456-happyReduction_456 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwIMPOSSIBLE happy_var_2) -> - case happyOutTok happy_x_3 of { (TokSymbol SymClosePragma happy_var_3) -> - happyIn153- (ImpossiblePragma (getRange (happy_var_1,happy_var_2,happy_var_3))- )}}}--happyReduce_457 = happySpecReduce_3 145# happyReduction_457-happyReduction_457 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwNO_POSITIVITY_CHECK happy_var_2) -> - case happyOutTok happy_x_3 of { (TokSymbol SymClosePragma happy_var_3) -> - happyIn154- (NoPositivityCheckPragma (getRange (happy_var_1,happy_var_2,happy_var_3))- )}}}--happyReduce_458 = happyReduce 5# 146# happyReduction_458-happyReduction_458 (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 { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_2 of { (TokKeyword KwPOLARITY happy_var_2) -> - case happyOut34 happy_x_3 of { happy_var_3 -> - case happyOut156 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn155- (let (rs, occs) = unzip (reverse happy_var_4) in- PolarityPragma (getRange (happy_var_1,happy_var_2,happy_var_3,rs,happy_var_5)) happy_var_3 occs- ) `HappyStk` happyRest}}}}}--happyReduce_459 = happySpecReduce_0 147# happyReduction_459-happyReduction_459 = happyIn156- ([]- )--happyReduce_460 = happySpecReduce_2 147# happyReduction_460-happyReduction_460 happy_x_2- happy_x_1- = case happyOut156 happy_x_1 of { happy_var_1 -> - case happyOut157 happy_x_2 of { happy_var_2 -> - happyIn156- (happy_var_2 : happy_var_1- )}}--happyReduce_461 = happyMonadReduce 1# 148# happyReduction_461-happyReduction_461 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokString happy_var_1) -> - ( polarity happy_var_1)}- ) (\r -> happyReturn (happyIn157 r))--happyReduce_462 = happySpecReduce_3 149# happyReduction_462-happyReduction_462 happy_x_3- happy_x_2- happy_x_1- = case happyOut159 happy_x_2 of { happy_var_2 -> - happyIn158- (reverse happy_var_2- )}--happyReduce_463 = happySpecReduce_3 150# happyReduction_463-happyReduction_463 happy_x_3- happy_x_2- happy_x_1- = case happyOut159 happy_x_1 of { happy_var_1 -> - case happyOut92 happy_x_3 of { happy_var_3 -> - happyIn159- (reverse happy_var_3 ++ happy_var_1- )}}--happyReduce_464 = happySpecReduce_1 150# happyReduction_464-happyReduction_464 happy_x_1- = case happyOut92 happy_x_1 of { happy_var_1 -> - happyIn159- (reverse happy_var_1- )}--happyReduce_465 = happySpecReduce_3 151# happyReduction_465-happyReduction_465 happy_x_3- happy_x_2- happy_x_1- = case happyOut161 happy_x_2 of { happy_var_2 -> - happyIn160- (reverse happy_var_2- )}--happyReduce_466 = happySpecReduce_3 152# happyReduction_466-happyReduction_466 happy_x_3- happy_x_2- happy_x_1- = case happyOut161 happy_x_1 of { happy_var_1 -> - case happyOut93 happy_x_3 of { happy_var_3 -> - happyIn161- (reverse happy_var_3 ++ happy_var_1- )}}--happyReduce_467 = happySpecReduce_1 152# happyReduction_467-happyReduction_467 happy_x_1- = case happyOut93 happy_x_1 of { happy_var_1 -> - happyIn161- (reverse happy_var_1- )}--happyReduce_468 = happyMonadReduce 3# 153# happyReduction_468-happyReduction_468 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut163 happy_x_2 of { happy_var_2 -> - ( ((,) `fmap` verifyRecordDirectives happy_var_2 <*> pure []))}- ) (\r -> happyReturn (happyIn162 r))--happyReduce_469 = happyMonadReduce 5# 153# happyReduction_469-happyReduction_469 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut163 happy_x_2 of { happy_var_2 -> - case happyOut169 happy_x_4 of { happy_var_4 -> - ( ((,) `fmap` verifyRecordDirectives happy_var_2 <*> pure happy_var_4))}}- ) (\r -> happyReturn (happyIn162 r))--happyReduce_470 = happyMonadReduce 3# 153# happyReduction_470-happyReduction_470 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut169 happy_x_2 of { happy_var_2 -> - ( ((,) `fmap` verifyRecordDirectives [] <*> pure happy_var_2))}- ) (\r -> happyReturn (happyIn162 r))--happyReduce_471 = happySpecReduce_0 154# happyReduction_471-happyReduction_471 = happyIn163- ([]- )--happyReduce_472 = happySpecReduce_3 154# happyReduction_472-happyReduction_472 happy_x_3- happy_x_2- happy_x_1- = case happyOut163 happy_x_1 of { happy_var_1 -> - case happyOut164 happy_x_3 of { happy_var_3 -> - happyIn163- (happy_var_3 : happy_var_1- )}}--happyReduce_473 = happySpecReduce_1 154# happyReduction_473-happyReduction_473 happy_x_1- = case happyOut164 happy_x_1 of { happy_var_1 -> - happyIn163- ([happy_var_1]- )}--happyReduce_474 = happySpecReduce_1 155# happyReduction_474-happyReduction_474 happy_x_1- = case happyOut100 happy_x_1 of { happy_var_1 -> - happyIn164- (Constructor happy_var_1- )}--happyReduce_475 = happySpecReduce_1 155# happyReduction_475-happyReduction_475 happy_x_1- = case happyOut166 happy_x_1 of { happy_var_1 -> - happyIn164- (Induction happy_var_1- )}--happyReduce_476 = happySpecReduce_1 155# happyReduction_476-happyReduction_476 happy_x_1- = case happyOut165 happy_x_1 of { happy_var_1 -> - happyIn164- (Eta happy_var_1- )}--happyReduce_477 = happySpecReduce_1 156# happyReduction_477-happyReduction_477 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwEta happy_var_1) -> - happyIn165- (Ranged (getRange happy_var_1) True- )}--happyReduce_478 = happySpecReduce_1 156# happyReduction_478-happyReduction_478 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwNoEta happy_var_1) -> - happyIn165- (Ranged (getRange happy_var_1) False- )}--happyReduce_479 = happySpecReduce_1 157# happyReduction_479-happyReduction_479 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInductive happy_var_1) -> - happyIn166- (Ranged (getRange happy_var_1) Inductive- )}--happyReduce_480 = happySpecReduce_1 157# happyReduction_480-happyReduction_480 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCoInductive happy_var_1) -> - happyIn166- (Ranged (getRange happy_var_1) CoInductive- )}--happyReduce_481 = happySpecReduce_3 158# happyReduction_481-happyReduction_481 happy_x_3- happy_x_2- happy_x_1- = case happyOut169 happy_x_2 of { happy_var_2 -> - happyIn167- (happy_var_2- )}--happyReduce_482 = happySpecReduce_2 159# happyReduction_482-happyReduction_482 happy_x_2- happy_x_1- = happyIn168- ([]- )--happyReduce_483 = happySpecReduce_1 159# happyReduction_483-happyReduction_483 happy_x_1- = case happyOut167 happy_x_1 of { happy_var_1 -> - happyIn168- (happy_var_1- )}--happyReduce_484 = happySpecReduce_3 160# happyReduction_484-happyReduction_484 happy_x_3- happy_x_2- happy_x_1- = case happyOut91 happy_x_1 of { happy_var_1 -> - case happyOut169 happy_x_3 of { happy_var_3 -> - happyIn169- (happy_var_1 ++ happy_var_3- )}}--happyReduce_485 = happySpecReduce_1 160# happyReduction_485-happyReduction_485 happy_x_1- = case happyOut91 happy_x_1 of { happy_var_1 -> - happyIn169- (happy_var_1- )}--happyReduce_486 = happySpecReduce_0 161# happyReduction_486-happyReduction_486 = happyIn170- ([]- )--happyReduce_487 = happySpecReduce_1 161# happyReduction_487-happyReduction_487 happy_x_1- = case happyOut169 happy_x_1 of { happy_var_1 -> - happyIn170- (happy_var_1- )}--happyNewToken action sts stk- = lexer(\tk -> - let cont i = happyDoAction i tk action sts stk in- case tk of {- TokEOF -> happyDoAction 105# tk action sts stk;- TokKeyword KwAbstract happy_dollar_dollar -> cont 1#;- TokKeyword KwCoData happy_dollar_dollar -> cont 2#;- TokKeyword KwCoInductive happy_dollar_dollar -> cont 3#;- TokKeyword KwConstructor happy_dollar_dollar -> cont 4#;- TokKeyword KwData happy_dollar_dollar -> cont 5#;- TokKeyword KwEta happy_dollar_dollar -> cont 6#;- TokKeyword KwField happy_dollar_dollar -> cont 7#;- TokKeyword KwForall happy_dollar_dollar -> cont 8#;- TokKeyword KwHiding happy_dollar_dollar -> cont 9#;- TokKeyword KwImport happy_dollar_dollar -> cont 10#;- TokKeyword KwIn happy_dollar_dollar -> cont 11#;- TokKeyword KwInductive happy_dollar_dollar -> cont 12#;- TokKeyword KwInfix happy_dollar_dollar -> cont 13#;- TokKeyword KwInfixL happy_dollar_dollar -> cont 14#;- TokKeyword KwInfixR happy_dollar_dollar -> cont 15#;- TokKeyword KwInstance happy_dollar_dollar -> cont 16#;- TokKeyword KwOverlap happy_dollar_dollar -> cont 17#;- TokKeyword KwLet happy_dollar_dollar -> cont 18#;- TokKeyword KwMacro happy_dollar_dollar -> cont 19#;- TokKeyword KwModule happy_dollar_dollar -> cont 20#;- TokKeyword KwMutual happy_dollar_dollar -> cont 21#;- TokKeyword KwNoEta happy_dollar_dollar -> cont 22#;- TokKeyword KwOpen happy_dollar_dollar -> cont 23#;- TokKeyword KwPatternSyn happy_dollar_dollar -> cont 24#;- TokKeyword KwPostulate happy_dollar_dollar -> cont 25#;- TokKeyword KwPrimitive happy_dollar_dollar -> cont 26#;- TokKeyword KwPrivate happy_dollar_dollar -> cont 27#;- TokKeyword KwProp happy_dollar_dollar -> cont 28#;- TokKeyword KwPublic happy_dollar_dollar -> cont 29#;- TokKeyword KwQuote happy_dollar_dollar -> cont 30#;- TokKeyword KwQuoteContext happy_dollar_dollar -> cont 31#;- TokKeyword KwQuoteGoal happy_dollar_dollar -> cont 32#;- TokKeyword KwQuoteTerm happy_dollar_dollar -> cont 33#;- TokKeyword KwRecord happy_dollar_dollar -> cont 34#;- TokKeyword KwRenaming happy_dollar_dollar -> cont 35#;- TokKeyword KwRewrite happy_dollar_dollar -> cont 36#;- TokKeyword KwSet happy_dollar_dollar -> cont 37#;- TokKeyword KwSyntax happy_dollar_dollar -> cont 38#;- TokKeyword KwTactic happy_dollar_dollar -> cont 39#;- TokKeyword KwTo happy_dollar_dollar -> cont 40#;- TokKeyword KwUnquote happy_dollar_dollar -> cont 41#;- TokKeyword KwUnquoteDecl happy_dollar_dollar -> cont 42#;- TokKeyword KwUnquoteDef happy_dollar_dollar -> cont 43#;- TokKeyword KwUsing happy_dollar_dollar -> cont 44#;- TokKeyword KwWhere happy_dollar_dollar -> cont 45#;- TokKeyword KwWith happy_dollar_dollar -> cont 46#;- TokKeyword KwBUILTIN happy_dollar_dollar -> cont 47#;- TokKeyword KwCATCHALL happy_dollar_dollar -> cont 48#;- TokKeyword KwCOMPILED happy_dollar_dollar -> cont 49#;- TokKeyword KwCOMPILED_DATA happy_dollar_dollar -> cont 50#;- TokKeyword KwCOMPILED_DATA_UHC happy_dollar_dollar -> cont 51#;- TokKeyword KwCOMPILED_DECLARE_DATA happy_dollar_dollar -> cont 52#;- TokKeyword KwCOMPILED_EPIC happy_dollar_dollar -> cont 53#;- TokKeyword KwCOMPILED_EXPORT happy_dollar_dollar -> cont 54#;- TokKeyword KwCOMPILED_JS happy_dollar_dollar -> cont 55#;- TokKeyword KwCOMPILED_TYPE happy_dollar_dollar -> cont 56#;- TokKeyword KwCOMPILED_UHC happy_dollar_dollar -> cont 57#;- TokKeyword KwHASKELL happy_dollar_dollar -> cont 58#;- TokKeyword KwDISPLAY happy_dollar_dollar -> cont 59#;- TokKeyword KwIMPORT happy_dollar_dollar -> cont 60#;- TokKeyword KwIMPORT_UHC happy_dollar_dollar -> cont 61#;- TokKeyword KwIMPOSSIBLE happy_dollar_dollar -> cont 62#;- TokKeyword KwINLINE happy_dollar_dollar -> cont 63#;- TokKeyword KwMEASURE happy_dollar_dollar -> cont 64#;- TokKeyword KwNO_TERMINATION_CHECK happy_dollar_dollar -> cont 65#;- TokKeyword KwNO_POSITIVITY_CHECK happy_dollar_dollar -> cont 66#;- TokKeyword KwNON_TERMINATING happy_dollar_dollar -> cont 67#;- TokKeyword KwOPTIONS happy_dollar_dollar -> cont 68#;- TokKeyword KwPOLARITY happy_dollar_dollar -> cont 69#;- TokKeyword KwREWRITE happy_dollar_dollar -> cont 70#;- TokKeyword KwSTATIC happy_dollar_dollar -> cont 71#;- TokKeyword KwTERMINATING happy_dollar_dollar -> cont 72#;- TokSetN happy_dollar_dollar -> cont 73#;- TokTeX happy_dollar_dollar -> cont 74#;- TokComment happy_dollar_dollar -> cont 75#;- TokSymbol SymEllipsis happy_dollar_dollar -> cont 76#;- TokSymbol SymDotDot happy_dollar_dollar -> cont 77#;- TokSymbol SymDot happy_dollar_dollar -> cont 78#;- TokSymbol SymSemi happy_dollar_dollar -> cont 79#;- TokSymbol SymColon happy_dollar_dollar -> cont 80#;- TokSymbol SymEqual happy_dollar_dollar -> cont 81#;- TokSymbol SymUnderscore happy_dollar_dollar -> cont 82#;- TokSymbol SymQuestionMark happy_dollar_dollar -> cont 83#;- TokSymbol SymArrow happy_dollar_dollar -> cont 84#;- TokSymbol SymLambda happy_dollar_dollar -> cont 85#;- TokSymbol SymAs happy_dollar_dollar -> cont 86#;- TokSymbol SymBar happy_dollar_dollar -> cont 87#;- TokSymbol SymOpenParen happy_dollar_dollar -> cont 88#;- TokSymbol SymCloseParen happy_dollar_dollar -> cont 89#;- TokSymbol SymOpenIdiomBracket happy_dollar_dollar -> cont 90#;- TokSymbol SymCloseIdiomBracket happy_dollar_dollar -> cont 91#;- TokSymbol SymDoubleOpenBrace happy_dollar_dollar -> cont 92#;- TokSymbol SymDoubleCloseBrace happy_dollar_dollar -> cont 93#;- TokSymbol SymOpenBrace happy_dollar_dollar -> cont 94#;- TokSymbol SymCloseBrace happy_dollar_dollar -> cont 95#;- TokSymbol SymOpenVirtualBrace happy_dollar_dollar -> cont 96#;- TokSymbol SymCloseVirtualBrace happy_dollar_dollar -> cont 97#;- TokSymbol SymVirtualSemi happy_dollar_dollar -> cont 98#;- TokSymbol SymOpenPragma happy_dollar_dollar -> cont 99#;- TokSymbol SymClosePragma happy_dollar_dollar -> cont 100#;- TokId happy_dollar_dollar -> cont 101#;- TokQId happy_dollar_dollar -> cont 102#;- TokString happy_dollar_dollar -> cont 103#;- TokLiteral happy_dollar_dollar -> cont 104#;- _ -> happyError' tk- })--happyError_ 105# tk = happyError' tk-happyError_ _ tk = happyError' tk--happyThen :: () => Parser a -> (a -> Parser b) -> Parser b-happyThen = (>>=)-happyReturn :: () => a -> Parser a-happyReturn = (return)-happyThen1 = happyThen-happyReturn1 :: () => a -> Parser a-happyReturn1 = happyReturn-happyError' :: () => (Token) -> Parser a-happyError' tk = (\token -> happyError) tk--tokensParser = happySomeParser where- happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut9 x))--exprParser = happySomeParser where- happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut37 x))--exprWhereParser = happySomeParser where- happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut90 x))--moduleParser = happySomeParser where- happySomeParser = happyThen (happyParse 3#) (\x -> happyReturn (happyOut12 x))--moduleNameParser = happySomeParser where- happySomeParser = happyThen (happyParse 4#) (\x -> happyReturn (happyOut25 x))--funclauseParser = happySomeParser where- happySomeParser = happyThen (happyParse 5#) (\x -> happyReturn (happyOut94 x))--happySeq = happyDontSeq---{--------------------------------------------------------------------------- Parsers- --------------------------------------------------------------------------}---- | Parse the token stream. Used by the TeX compiler.-tokensParser :: Parser [Token]---- | Parse an expression. Could be used in interactions.-exprParser :: Parser Expr---- | Parse an expression followed by a where clause. Could be used in interactions.-exprWhereParser :: Parser ExprWhere---- | Parse a module.-moduleParser :: Parser Module---{--------------------------------------------------------------------------- Happy stuff- --------------------------------------------------------------------------}---- | Required by Happy.-happyError :: Parser a-happyError = parseError "Parse error"---{--------------------------------------------------------------------------- Utility functions- --------------------------------------------------------------------------}---- | Grab leading OPTIONS pragmas.-takeOptionsPragmas :: [Declaration] -> ([Pragma], [Declaration])-takeOptionsPragmas = spanJust $ \ d -> case d of- Pragma p@OptionsPragma{} -> Just p- _ -> Nothing---- | Insert a top-level module if there is none.--- Also fix-up for the case the declarations in the top-level module--- are not indented (this is allowed as a special case).-figureOutTopLevelModule :: [Declaration] -> [Declaration]-figureOutTopLevelModule ds =- case spanAllowedBeforeModule ds of- -- Andreas 2016-02-01, issue #1388.- -- We need to distinguish two additional cases.- -- Case 1: Regular file layout: imports followed by one module. Nothing to do.- (ds0, [ Module{} ]) -> ds- -- Case 2: The declarations in the module are not indented.- -- This is allowed for the top level module, and thus rectified here.- (ds0, Module r m tel [] : ds2) -> ds0 ++ [Module r m tel ds2]- -- Case 3: There is a module with indented declarations,- -- followed by non-indented declarations. This should be a- -- parse error and be reported later (see @toAbstract TopLevel{}@),- -- thus, we do not do anything here.- (ds0, Module r m tel ds1 : ds2) -> ds -- Gives parse error in scope checker.- -- OLD code causing issue 1388:- -- (ds0, Module r m tel ds1 : ds2) -> ds0 ++ [Module r m tel $ ds1 ++ ds2]- -- Case 4: a top-level module declaration is missing.- (ds0, ds1) -> ds0 ++ [Module (getRange ds1) (QName noName_) [] ds1]---- | Create a name from a string.--mkName :: (Interval, String) -> Parser Name-mkName (i, s) = do- let xs = C.stringNameParts s- mapM_ isValidId xs- unless (alternating xs) $ fail $ "a name cannot contain two consecutive underscores"- return $ Name (getRange i) xs- where- isValidId Hole = return ()- isValidId (Id y) = do- let x = rawNameToString y- case parse defaultParseFlags [0] (lexer return) x of- ParseOk _ (TokId _) -> return ()- _ -> fail $ "in the name " ++ s ++ ", the part " ++ x ++ " is not valid"-- -- we know that there are no two Ids in a row- alternating (Hole : Hole : _) = False- alternating (_ : xs) = alternating xs- alternating [] = True---- | Create a qualified name from a list of strings-mkQName :: [(Interval, String)] -> Parser QName-mkQName ss = do- xs <- mapM mkName ss- return $ foldr Qual (QName $ last xs) (init xs)---- | Create a qualified name from a string (used in pragmas).--- Range of each name component is range of whole string.--- TODO: precise ranges!--pragmaQName :: (Interval, String) -> Parser QName-pragmaQName (r, s) = do- let ss = chopWhen (== '.') s- mkQName $ map (r,) ss---- | Polarity parser.--polarity :: (Interval, String) -> Parser (Range, Occurrence)-polarity (i, s) =- case s of- "_" -> ret Unused- "++" -> ret StrictPos- "+" -> ret JustPos- "-" -> ret JustNeg- "*" -> ret Mixed- _ -> fail $ "Not a valid polarity: " ++ s- where- ret x = return (getRange i, x)--recoverLayout :: [(Interval, String)] -> String-recoverLayout [] = ""-recoverLayout xs@((i, _) : _) = go (iStart i) xs- where- c0 = posCol (iStart i)-- go cur [] = ""- go cur ((i, s) : xs) = padding cur (iStart i) ++ s ++ go (iEnd i) xs-- padding Pn{ posLine = l1, posCol = c1 } Pn{ posLine = l2, posCol = c2 }- | l1 < l2 = genericReplicate (l2 - l1) '\n' ++ genericReplicate (max 0 (c2 - c0)) ' '- | l1 == l2 = genericReplicate (c2 - c1) ' '--ensureUnqual :: QName -> Parser Name-ensureUnqual (QName x) = return x-ensureUnqual q@Qual{} = parseError' (rStart' $ getRange q) "Qualified name not allowed here"---- | Match a particular name.-isName :: String -> (Interval, String) -> Parser ()-isName s (_,s')- | s == s' = return ()- | otherwise = fail $ "expected " ++ s ++ ", found " ++ s'---- | Build a forall pi (forall x y z -> ...)-forallPi :: [LamBinding] -> Expr -> Expr-forallPi bs e = Pi (map addType bs) e---- | Build a telescoping let (let Ds)-tLet :: Range -> [Declaration] -> TypedBindings-tLet r = TypedBindings r . Arg defaultArgInfo . TLet r---- | Converts lambda bindings to typed bindings.-addType :: LamBinding -> TypedBindings-addType (DomainFull b) = b-addType (DomainFree info x) = TypedBindings r $ Arg info $ TBind r [pure x] $ Underscore r Nothing- where r = getRange x--mergeImportDirectives :: [ImportDirective] -> Parser ImportDirective-mergeImportDirectives is = do- i <- foldl merge (return defaultImportDir) is- verifyImportDirective i- where- merge mi i2 = do- i1 <- mi- let err = parseError' (rStart' $ getRange i2) "Cannot mix using and hiding module directives"- return $ ImportDirective- { importDirRange = fuseRange i1 i2- , using = mappend (using i1) (using i2)- , hiding = hiding i1 ++ hiding i2- , impRenaming = impRenaming i1 ++ impRenaming i2- , publicOpen = publicOpen i1 || publicOpen i2 }---- | Check that an import directive doesn't contain repeated names-verifyImportDirective :: ImportDirective -> Parser ImportDirective-verifyImportDirective i =- case filter ((>1) . length)- $ group- $ sort xs- of- [] -> return i- yss -> let Just pos = rStart' $ getRange $ head $ concat yss in- parseErrorAt pos $- "Repeated name" ++ s ++ " in import directive: " ++- concat (intersperse ", " $ map (show . head) yss)- where- s = case yss of- [_] -> ""- _ -> "s"- where- xs = names (using i) ++ hiding i ++ map renFrom (impRenaming i)- names (Using xs) = xs- names UseEverything = []--data RecordDirective- = Induction (Ranged Induction)- | Constructor (Name, IsInstance)- | Eta (Ranged Bool)- deriving (Eq,Show)--verifyRecordDirectives :: [RecordDirective] -> Parser (Maybe (Ranged Induction), Maybe Bool, Maybe (Name, IsInstance))-verifyRecordDirectives xs | null rs = return (ltm is, ltm es, ltm cs)- | otherwise = let Just pos = rStart' $ (head rs) in- parseErrorAt pos $ "Repeated record directives at: \n" ++ intercalate "\n" (map show rs)-- where- ltm :: [a] -> Maybe a- ltm [] = Nothing- ltm (x:xs) = Just x- errorFromList [] = []- errorFromList [x] = []- errorFromList xs = map getRange xs- rs = sort (concat ([errorFromList is, errorFromList es', errorFromList cs]))- is = [ i | Induction i <- xs ]- es' = [ i | Eta i <- xs ]- es = map rangedThing es'- cs = [ i | Constructor i <- xs ]----- | Breaks up a string into substrings. Returns every maximal--- subsequence of zero or more characters distinct from @'.'@.------ > splitOnDots "" == [""]--- > splitOnDots "foo.bar" == ["foo", "bar"]--- > splitOnDots ".foo.bar" == ["", "foo", "bar"]--- > splitOnDots "foo.bar." == ["foo", "bar", ""]--- > splitOnDots "foo..bar" == ["foo", "", "bar"]-splitOnDots :: String -> [String]-splitOnDots "" = [""]-splitOnDots ('.' : s) = [] : splitOnDots s-splitOnDots (c : s) = case splitOnDots s of- p : ps -> (c : p) : ps----- | Returns 'True' iff the name is a valid Haskell (hierarchical)--- module name.-validHaskellModuleName :: String -> Bool-validHaskellModuleName = all ok . splitOnDots- where- -- Checks if a dot-less module name is well-formed.- ok :: String -> Bool- ok [] = False- ok (c : s) =- isUpper c &&- all (\c -> isLower c || c == '_' ||- isUpper c ||- generalCategory c == DecimalNumber ||- c == '\'')- s--{--------------------------------------------------------------------------- Patterns- --------------------------------------------------------------------------}---- | Turn an expression into a left hand side.-exprToLHS :: Expr -> Parser ([Expr] -> [Expr] -> LHS)-exprToLHS e = case e of- WithApp r e es -> LHS <$> exprToPattern e <*> mapM exprToPattern es- _ -> LHS <$> exprToPattern e <*> return []---- | Turn an expression into a pattern. Fails if the expression is not a--- valid pattern.-exprToPattern :: Expr -> Parser Pattern-exprToPattern e = do- let Just pos = rStart' $ getRange e- failure = parseErrorAt pos $ "Not a valid pattern: " ++ show e- case e of- Ident x -> return $ IdentP x- App _ e1 e2 -> AppP <$> exprToPattern e1- <*> T.mapM (T.mapM exprToPattern) e2- Paren r e -> ParenP r- <$> exprToPattern e- Underscore r _ -> return $ WildP r- Absurd r -> return $ AbsurdP r- As r x e -> AsP r x <$> exprToPattern e- Dot r (HiddenArg _ e) -> return $ HiddenP r $ fmap (DotP r UserWritten) e- Dot r e -> return $ DotP r UserWritten e- Lit l -> return $ LitP l- HiddenArg r e -> HiddenP r <$> T.mapM exprToPattern e- InstanceArg r e -> InstanceP r <$> T.mapM exprToPattern e- RawApp r es -> RawAppP r <$> mapM exprToPattern es- Quote r -> return $ QuoteP r- Rec r es | Just fs <- mapM maybeLeft es -> do- RecP r <$> T.mapM (T.mapM exprToPattern) fs- _ -> failure--opAppExprToPattern :: OpApp Expr -> Parser Pattern-opAppExprToPattern (SyntaxBindingLambda _ _ _) = parseError "Syntax binding lambda cannot appear in a pattern"-opAppExprToPattern (Ordinary e) = exprToPattern e---- | Turn an expression into a name. Fails if the expression is not a--- valid identifier.-exprToName :: Expr -> Parser Name-exprToName (Ident (QName x)) = return x-exprToName e =- let Just pos = rStart' $ getRange e in- parseErrorAt pos $ "Not a valid identifier: " ++ show e--stripSingletonRawApp :: Expr -> Expr-stripSingletonRawApp (RawApp _ [e]) = stripSingletonRawApp e-stripSingletonRawApp e = e--isEqual :: Expr -> Maybe (Expr, Expr)-isEqual e =- case stripSingletonRawApp e of- Equal _ a b -> Just (stripSingletonRawApp a, stripSingletonRawApp b)- _ -> Nothing--maybeNamed :: Expr -> Named_ Expr-maybeNamed e =- case isEqual e of- Just (Ident (QName x), b) -> named (Ranged (getRange x) (nameToRawName x)) b- _ -> unnamed e--patternSynArgs :: [Either Hiding LamBinding] -> Parser [Arg Name]-patternSynArgs = mapM pSynArg- where- pSynArg Left{} = parseError "Absurd patterns are not allowed in pattern synonyms"- pSynArg (Right DomainFull{}) = parseError "Unexpected type signature in pattern synonym argument"- pSynArg (Right (DomainFree a x))- | getHiding a `notElem` [Hidden, NotHidden] = parseError $ show (getHiding a) ++ " arguments not allowed to pattern synonyms"- | getRelevance a /= Relevant = parseError "Arguments to pattern synonyms must be relevant"- | otherwise = return $ Arg a (boundName x)--parsePanic s = parseError $ "Internal parser error: " ++ s ++ ". Please report this as a bug."--{- RHS or type signature -}--data RHSOrTypeSigs- = JustRHS RHS- | TypeSigsRHS Expr- deriving Show--patternToNames :: Pattern -> Parser [(ArgInfo, Name)]-patternToNames p =- case p of- IdentP (QName i) -> return [(defaultArgInfo, i)]- WildP r -> return [(defaultArgInfo, C.noName r)]- DotP _ _ (Ident (QName i)) -> return [(setRelevance Irrelevant defaultArgInfo, i)]- RawAppP _ ps -> concat <$> mapM patternToNames ps- _ -> parseError $- "Illegal name in type signature: " ++ prettyShow p--funClauseOrTypeSigs :: LHS -> RHSOrTypeSigs -> WhereClause -> Parser [Declaration]-funClauseOrTypeSigs lhs mrhs wh = do- -- traceShowM lhs- case mrhs of- JustRHS rhs -> return [FunClause lhs rhs wh False]- TypeSigsRHS e -> case wh of- NoWhere -> case lhs of- Ellipsis{} -> parseError "The ellipsis ... cannot have a type signature"- LHS _ _ _ (_:_) -> parseError "Illegal: with in type signature"- LHS _ _ (_:_) _ -> parseError "Illegal: rewrite in type signature"- LHS _ (_:_) _ _ -> parseError "Illegal: with patterns in type signature"- LHS p [] [] [] -> map (\ (x, y) -> TypeSig x y e) <$> patternToNames p- _ -> parseError "A type signature cannot have a where clause"--parseDisplayPragma :: Range -> Position -> String -> Parser Pragma-parseDisplayPragma r pos s =- case parsePosString pos defaultParseFlags [normal] funclauseParser s of- ParseOk s [FunClause (LHS lhs [] [] []) (RHS rhs) NoWhere ca] | null (parseInp s) ->- return $ DisplayPragma r lhs rhs- _ -> parseError "Invalid DISPLAY pragma. Should have form {-# DISPLAY LHS = RHS #-}."-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command-line>" #-}-{-# LINE 11 "<command-line>" #-}-{-# LINE 1 "/usr/local/stow/ghc-8.0.2-rc2/lib/ghc-8.0.1.20161213/include/ghcversion.h" #-}-------------------{-# LINE 11 "<command-line>" #-}-{-# LINE 1 "/tmp/ghc19165_0/ghc_2.h" #-}-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------{-# LINE 11 "<command-line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp --{-# LINE 13 "templates/GenericTemplate.hs" #-}-------- 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)) :: Bool)-#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)-#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: 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-{-# LINE 46 "templates/GenericTemplate.hs" #-}---data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList------{-# LINE 67 "templates/GenericTemplate.hs" #-}--{-# LINE 77 "templates/GenericTemplate.hs" #-}--{-# LINE 86 "templates/GenericTemplate.hs" #-}--infixr 9 `HappyStk`-data HappyStk a = HappyStk a (HappyStk a)---------------------------------------------------------------------------------- starting the parse--happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll---------------------------------------------------------------------------------- Accepting the parse---- If the current token is 0#, 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 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 = 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 False- action- | check = indexShortOffAddr happyTable off_i- | 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#------data HappyAddr = HappyA# Happy_GHC_Exts.Addr#------------------------------------------------------------------------------------- HappyState data type (not arrays)--{-# LINE 170 "templates/GenericTemplate.hs" #-}---------------------------------------------------------------------------------- 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 = 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 = indexShortOffAddr happyGotoOffsets st- off_i = (off Happy_GHC_Exts.+# nt)- new_state = indexShortOffAddr happyTable off_i------------------------------------------------------------------------------------- Error recovery (0# is the error token)---- parse error if we are in recovery and we fail again-happyFail 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_ 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 0# tk old_st (HappyCons ((action)) (sts)) - (saved_tok `HappyStk` _ `HappyStk` stk) =--- trace ("discarding state, depth " ++ show (length stk)) $- happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))--}---- Enter error recovery: generate an error token,--- save the old token and carry on.-happyFail 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 = 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 `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/data/JS/agda-rts.js view
@@ -21,6 +21,12 @@ exports.uprimIntegerMultiply = function(x,y) { return x.multiply(y); };+exports.uprimIntegerRem = function(x, y) {+ return x.remainder(y);+};+exports.uprimIntegerQuot = function(x, y) {+ return x.quotient(y);+}; exports.uprimIntegerEqual = function(x,y) { return x.compare(y) == 0; };@@ -169,4 +175,17 @@ return function(y) { return exports.uprimQNameEquality(x, y); };+};+exports.primQNameLess = function(x) {+ return function(y) {+ switch (x["id"].compare(y["id"])) {+ case -1: return true;+ case 1: return false;+ case 0:+ return x["moduleId"].compare(y["moduleId"]) == -1;+ }+ };+};+exports.primQNameFixity = function(x) {+ return x["fixity"]; };
src/data/agda.sty view
@@ -4,7 +4,8 @@ \ProvidesPackage{agda} -\RequirePackage{ifxetex, ifluatex, xifthen, xcolor, polytable, etoolbox}+\RequirePackage{ifxetex, ifluatex, xifthen, xcolor, polytable, etoolbox,+ calc} % https://tex.stackexchange.com/questions/47576/combining-ifxetex-and-ifluatex-with-the-logical-or-operation \newif\ifxetexorluatex@@ -18,6 +19,34 @@ \fi \fi +% ----------------------------------------------------------------------+% Options++\DeclareOption{bw} {\newcommand{\AgdaColourScheme}{bw}}+\DeclareOption{conor}{\newcommand{\AgdaColourScheme}{conor}}++\newif\if@AgdaEnableReferences\@AgdaEnableReferencesfalse+\DeclareOption{references}{+ \@AgdaEnableReferencestrue+}++\newif\if@AgdaEnableLinks\@AgdaEnableLinksfalse+\DeclareOption{links}{+ \@AgdaEnableLinkstrue+}++% If the "nofontsetup" option is used, then some font packages are+% loaded, but specific fonts are not selected.+\newif\if@AgdaSetupFonts\@AgdaSetupFontstrue+\DeclareOption{nofontsetup}{+ \@AgdaSetupFontsfalse+}++\ProcessOptions\relax++% ----------------------------------------------------------------------+% Font setup+ % XeLaTeX or LuaLaTeX \ifxetexorluatex @@ -30,22 +59,25 @@ \tracinglostchars=2 % If the font is missing some symbol, then say % so in the compilation output.- \setmainfont- [ Ligatures = TeX- , BoldItalicFont = xits-bolditalic.otf- , BoldFont = xits-bold.otf- , ItalicFont = xits-italic.otf- ]- {xits-regular.otf} - \setmathfont{xits-math.otf}- \setmonofont[Mapping=tex-text]{FreeMono.otf}+ \if@AgdaSetupFonts+ \setmainfont+ [ Ligatures = TeX+ , BoldItalicFont = xits-bolditalic.otf+ , BoldFont = xits-bold.otf+ , ItalicFont = xits-italic.otf+ ]+ {xits-regular.otf} - % Make mathcal and mathscr appear as different.- % https://tex.stackexchange.com/questions/120065/xetex-what-happened-to-mathcal-and-mathscr- \setmathfont[range={\mathcal,\mathbfcal},StylisticSet=1]{xits-math.otf}- \setmathfont[range=\mathscr]{xits-math.otf}+ \setmathfont{xits-math.otf}+ \setmonofont[Mapping=tex-text]{FreeMono.otf} + % Make mathcal and mathscr appear as different.+ % https://tex.stackexchange.com/questions/120065/xetex-what-happened-to-mathcal-and-mathscr+ \setmathfont[range={\mathcal,\mathbfcal},StylisticSet=1]{xits-math.otf}+ \setmathfont[range=\mathscr]{xits-math.otf}+ \fi+ \providecommand{\DeclareUnicodeCharacter}[2]{\relax} % pdfLaTeX@@ -60,24 +92,6 @@ \fi % -----------------------------------------------------------------------% Options--\DeclareOption{bw} {\newcommand{\AgdaColourScheme}{bw}}-\DeclareOption{conor}{\newcommand{\AgdaColourScheme}{conor}}--\newif\if@AgdaEnableReferences\@AgdaEnableReferencesfalse-\DeclareOption{references}{- \@AgdaEnableReferencestrue-}--\newif\if@AgdaEnableLinks\@AgdaEnableLinksfalse-\DeclareOption{links}{- \@AgdaEnableLinkstrue-}--\ProcessOptions\relax--% ---------------------------------------------------------------------- % Colour schemes. \providecommand{\AgdaColourScheme}{standard}@@ -181,6 +195,7 @@ % Aspect colours. \definecolor{AgdaComment} {HTML}{000000}+ \definecolor{AgdaOption} {HTML}{000000} \definecolor{AgdaKeyword} {HTML}{000000} \definecolor{AgdaString} {HTML}{000000} \definecolor{AgdaNumber} {HTML}{000000}@@ -218,6 +233,7 @@ % Aspect colours. \definecolor{AgdaComment} {HTML}{B22222}+ \definecolor{AgdaOption} {HTML}{000000} \definecolor{AgdaKeyword} {HTML}{000000} \definecolor{AgdaString} {HTML}{000000} \definecolor{AgdaNumber} {HTML}{000000}@@ -254,6 +270,7 @@ }{ % Aspect colours. \definecolor{AgdaComment} {HTML}{B22222}+ \definecolor{AgdaOption} {HTML}{000000} \definecolor{AgdaKeyword} {HTML}{CD6600} \definecolor{AgdaString} {HTML}{B22222} \definecolor{AgdaNumber} {HTML}{A020F0}@@ -289,46 +306,72 @@ % ---------------------------------------------------------------------- % Commands. +\newcommand{\AgdaNoSpaceMath}[1]+ {\begingroup\thickmuskip=0mu\medmuskip=0mu#1\endgroup}+ % Aspect commands. \newcommand{\AgdaComment} [1]- {\AgdaCommentFontStyle{\textcolor{AgdaComment}{#1}}}+ {\AgdaNoSpaceMath{\AgdaCommentFontStyle{\textcolor{AgdaComment}{#1}}}}+\newcommand{\AgdaOption} [1]+ {\AgdaNoSpaceMath{\AgdaCommentFontStyle{\textcolor{AgdaOption}{#1}}}} \newcommand{\AgdaKeyword} [1]- {\AgdaKeywordFontStyle{\textcolor{AgdaKeyword}{#1}}}-\newcommand{\AgdaString} [1]{\AgdaStringFontStyle{\textcolor{AgdaString}{#1}}}-\newcommand{\AgdaNumber} [1]{\AgdaFontStyle{\textcolor{AgdaNumber}{#1}}}-\newcommand{\AgdaSymbol} [1]{\AgdaFontStyle{\textcolor{AgdaSymbol}{#1}}}+ {\AgdaNoSpaceMath{\AgdaKeywordFontStyle{\textcolor{AgdaKeyword}{#1}}}}+\newcommand{\AgdaString} [1]+ {\AgdaNoSpaceMath{\AgdaStringFontStyle{\textcolor{AgdaString}{#1}}}}+\newcommand{\AgdaNumber} [1]+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaNumber}{#1}}}}+\newcommand{\AgdaSymbol} [1]+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaSymbol}{#1}}}} \newcommand{\AgdaPrimitiveType}[1]- {\AgdaFontStyle{\textcolor{AgdaPrimitiveType}{#1}}}-\newcommand{\AgdaOperator} [1]{\AgdaFontStyle{\textcolor{AgdaOperator}{#1}}}+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaPrimitiveType}{#1}}}}+\newcommand{\AgdaOperator} [1]+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaOperator}{#1}}}} % NameKind commands.-\newcommand{\AgdaNoSpaceMath}[1]- {\begingroup\thickmuskip=0mu\medmuskip=0mu#1\endgroup} +% The user can control the typesetting of (certain) individual tokens+% by redefining the following command. The first argument is the token+% and the second argument the thing to be typeset (sometimes just the+% token, sometimes \AgdaLink{<the token>}). Example:+%+% \usepackage{ifthen}+%+% % Insert extra space before some tokens.+% \DeclareRobustCommand{\AgdaFormat}[2]{%+% \ifthenelse{+% \equal{#1}{≡⟨} \OR+% \equal{#1}{≡⟨⟩} \OR+% \equal{#1}{∎}+% }{\ }{}#2}+%+% Note the use of \DeclareRobustCommand.++\newcommand{\AgdaFormat}[2]{#2}+ \newcommand{\AgdaBound}[1]- {\AgdaNoSpaceMath{\AgdaBoundFontStyle{\textcolor{AgdaBound}{#1}}}}+ {\AgdaNoSpaceMath{\AgdaBoundFontStyle{\textcolor{AgdaBound}{\AgdaFormat{#1}{#1}}}}} \newcommand{\AgdaInductiveConstructor}[1]- {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaInductiveConstructor}{\AgdaLink{#1}}}}}+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaInductiveConstructor}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}} \newcommand{\AgdaCoinductiveConstructor}[1]- {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaCoinductiveConstructor}{\AgdaLink{#1}}}}}+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaCoinductiveConstructor}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}} \newcommand{\AgdaDatatype}[1]- {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaDatatype}{\AgdaLink{#1}}}}}+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaDatatype}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}} \newcommand{\AgdaField}[1]- {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaField}{\AgdaLink{#1}}}}}+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaField}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}} \newcommand{\AgdaFunction}[1]- {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaFunction}{\AgdaLink{#1}}}}}+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaFunction}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}} \newcommand{\AgdaMacro}[1]- {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaMacro}{\AgdaLink{#1}}}}}+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaMacro}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}} \newcommand{\AgdaModule}[1]- {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaModule}{\AgdaLink{#1}}}}}+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaModule}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}} \newcommand{\AgdaPostulate}[1]- {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaPostulate}{\AgdaLink{#1}}}}}+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaPostulate}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}} \newcommand{\AgdaPrimitive}[1]- {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaPrimitive}{#1}}}}+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaPrimitive}{\AgdaFormat{#1}{#1}}}}} \newcommand{\AgdaRecord}[1]- {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaRecord}{\AgdaLink{#1}}}}}+ {\AgdaNoSpaceMath{\AgdaFontStyle{\textcolor{AgdaRecord}{\AgdaFormat{#1}{\AgdaLink{#1}}}}}} \newcommand{\AgdaArgument}[1]- {\AgdaNoSpaceMath{\AgdaBoundFontStyle{\textcolor{AgdaArgument}{#1}}}}+ {\AgdaNoSpaceMath{\AgdaBoundFontStyle{\textcolor{AgdaArgument}{\AgdaFormat{#1}{#1}}}}} % Other aspect commands. \newcommand{\AgdaFixityOp} [1]{\AgdaNoSpaceMath{$#1$}}@@ -345,8 +388,6 @@ \newcommand{\AgdaHole}[1]{\colorbox{AgdaHole}{#1}} \long\def\AgdaHide#1{\ignorespaces} % Used to hide code from LaTeX. -\newcommand{\AgdaIndent}[1]{$\;\;$}- % ---------------------------------------------------------------------- % The code environment. @@ -498,6 +539,14 @@ \Agda@AlignEnd{}% \ignorespacesafterend} +% Vertical space used for empty lines. By default \baselineskip.+\newlength{\AgdaEmptySkip}+\setlength{\AgdaEmptySkip}{\baselineskip}++% Extra space to be inserted for empty lines (the difference between+% \AgdaEmptySkip and \baselineskip). Used internally.+\newlength{\AgdaEmptyExtraSkip}+ % The code environment. % % The implementation is based on plainhscode in lhs2TeX's@@ -510,6 +559,7 @@ \AgdaNewlineWithVerticalSpace{\abovedisplayskip}}% \advance\leftskip\mathindent% \AgdaCodeStyle%+ \setlength{\AgdaEmptyExtraSkip}{\AgdaEmptySkip - \baselineskip}% \pboxed% \ifthenelse{\value{Agda@Align} = 0}{}{% \ifthenelse{\value{Agda@AlignCurrent} = 1}{%@@ -526,7 +576,28 @@ \stepcounter{Agda@SuppressCurrent}% \ignorespacesafterend} +% Space inserted after tokens.+\newcommand{\AgdaSpace}{ }++% Space inserted to indent something.+\newcommand{\AgdaIndentSpace}{\AgdaSpace{}$\;\;$}+ % Default column for polytable.-\defaultcolumn{@{~}l@{~}}+\defaultcolumn{@{}l@{\AgdaSpace{}}}++% \AgdaIndent expects a non-negative integer as its only argument.+% This integer should be the distance, in code blocks, to the thing+% relative to which the text is indented.+%+% The default implementation only indents if the thing that the text+% is indented relative to exists in the same code block or is wrapped+% in the same AgdaAlign or AgdaMultiCode environment.+\newcommand{\AgdaIndent}[1]{%+ \ifthenelse{#1 = 0+ \OR+ \( \value{Agda@Align} = 1+ \AND+ #1 < \value{Agda@AlignCurrent}+ \)}{\AgdaIndentSpace{}}{}} \endinput
src/data/emacs-mode/agda-input.el view
@@ -306,7 +306,7 @@ ("*" . ("⋆")) (".+" . ("∔")) (".-" . ("∸"))- (":" . ("∶"))+ (":" . ,(agda-input-to-string-list "∶⦂ː꞉˸፥፦:﹕︓")) ("::" . ("∷")) ("::-" . ("∺")) ("-:" . ("∹"))@@ -540,6 +540,19 @@ ("b7" . ("𝟟")) ("b8" . ("𝟠")) ("b9" . ("𝟡"))++ ;; Mathematical bold digits.++ ("B0" . ("𝟎"))+ ("B1" . ("𝟏"))+ ("B2" . ("𝟐"))+ ("B3" . ("𝟑"))+ ("B4" . ("𝟒"))+ ("B5" . ("𝟓"))+ ("B6" . ("𝟔"))+ ("B7" . ("𝟕"))+ ("B8" . ("𝟖"))+ ("B9" . ("𝟗")) ;; Parentheses.
src/data/emacs-mode/agda2-highlight.el view
@@ -326,35 +326,40 @@ :group 'agda2-highlight-faces) (defface agda2-highlight-unsolved-meta-face- '((t (:background "yellow"- :foreground "black")))+ '((t (:background "yellow"))) "The face used for unsolved meta variables." :group 'agda2-highlight-faces) (defface agda2-highlight-unsolved-constraint-face- '((t (:background "yellow"- :foreground "black")))+ '((t (:background "yellow"))) "The face used for unsolved constraints which are not connected to metas." :group 'agda2-highlight-faces) (defface agda2-highlight-termination-problem-face- '((t (:background "light salmon"- :foreground "black")))+ '((t (:background "light salmon"))) "The face used for termination problems." :group 'agda2-highlight-faces) (defface agda2-highlight-positivity-problem-face- '((t (:background "peru"- :foreground "black")))+ '((t (:background "peru"))) "The face used for positivity problems." :group 'agda2-highlight-faces) -(defface agda2-highlight-incomplete-pattern-face- '((t (:background "wheat"- :foreground "black")))- "The face used for incomplete patterns. (Currently unused.)"+(defface agda2-highlight-reachability-problem-face+ '((t (:background "dark gray")))+ "The face used for reachability problems." :group 'agda2-highlight-faces) +(defface agda2-highlight-coverage-problem-face+ '((t (:background "wheat")))+ "The face used for coverage problems."+ :group 'agda2-highlight-faces)++(defface agda2-highlight-catchall-clause-face+ '((t (:background "white smoke")))+ "The face used for catchall clauses."+ :group 'agda2-highlight-faces)+ (defface agda2-highlight-typechecks-face '((t (:background "light blue" :foreground "black")))@@ -385,8 +390,11 @@ (unsolvedmeta . agda2-highlight-unsolved-meta-face) (unsolvedconstraint . agda2-highlight-unsolved-constraint-face) (terminationproblem . agda2-highlight-termination-problem-face)+ (reachabilityproblem . agda2-highlight-reachability-problem-face)+ (coverageproblem . agda2-highlight-coverage-problem-face) (positivityproblem . agda2-highlight-positivity-problem-face) (incompletepattern . agda2-highlight-incomplete-pattern-face)+ (catchallclause . agda2-highlight-catchall-clause-face) (typechecks . agda2-highlight-typechecks-face)) "Alist mapping code aspects to the face used when displaying them. @@ -414,6 +422,9 @@ `symbol' Symbols like forall, =, ->, etc. `terminationproblem' Termination problems. `positivityproblem' Positivity problems.+`reachabilityproblem' Reachability problems.+`coverageproblem' Coverage problems.+`catchallclause' Clause not holding definitionally. `typechecks' Code which is being type-checked. `unsolvedconstraint' Unsolved constraints, not connected to meta variables.
src/data/emacs-mode/agda2-mode-pkg.el view
@@ -1,2 +1,2 @@-(define-package "agda2-mode" "2.5.1"+(define-package "agda2-mode" "2.5.3" "interactive development for Agda, a dependently typed functional programming language")
src/data/emacs-mode/agda2-mode.el view
@@ -10,7 +10,7 @@ ;;; Code: -(defvar agda2-version "2.5.2"+(defvar agda2-version "2.5.3" "The version of the Agda mode. Note that the same version of the Agda executable must be used.") @@ -93,14 +93,13 @@ :type '(repeat string) :group 'agda2) -(defvar agda2-backends '("GHC" "GHCNoMain" "JS" "LaTeX")+(defvar agda2-backends '("GHC" "JS" "LaTeX" "QuickLaTeX") "Compilation backends.") (defcustom agda2-backend- 'ask- "The backend used to compile Agda programs."- :type `(choice (const :tag "Ask every time" ask)- ,@(mapcar (lambda (x) `(const ,x)) agda2-backends))+ ""+ "The backend used to compile Agda programs (leave blank to ask every time)."+ :type 'string :group 'agda2) (defcustom agda2-toplevel-module "Agda.Interaction.GhciTop"@@ -228,6 +227,7 @@ (agda2-compile "\C-c\C-x\C-c" (global) "Compile") (agda2-quit "\C-c\C-x\C-q" (global) "Quit") (agda2-restart "\C-c\C-x\C-r" (global) "Kill and restart Agda")+ (agda2-abort "\C-c\C-x\C-a" (global) "Abort a command") (agda2-remove-annotations "\C-c\C-x\C-d" (global) "Remove goals and highlighting (\"deactivate\")") (agda2-display-implicit-arguments "\C-c\C-x\C-h" (global) "Toggle display of hidden arguments") (agda2-show-constraints ,(kbd "C-c C-=") (global) "Show constraints")@@ -246,6 +246,7 @@ (agda2-why-in-scope-maybe-toplevel "\C-c\C-w" (local global) "Explain why a particular name is in scope") (agda2-goal-and-context ,(kbd "C-c C-,") (local) "Goal type and context") (agda2-goal-and-context-and-inferred ,(kbd "C-c C-.") (local) "Goal type, context and inferred type")+ (agda2-goal-and-context-and-checked ,(kbd "C-c C-;") (local) "Goal type, context and checked type") (agda2-search-about-toplevel ,(kbd "C-c C-z") (local global) "Search About") (agda2-module-contents-maybe-toplevel ,(kbd "C-c C-o") (local global) "Module contents") (agda2-compute-normalised-maybe-toplevel "\C-c\C-n" (local global) "Evaluate term to normal form")@@ -352,8 +353,8 @@ ;; The following variables are used by the filter process, ;; `agda2-output-filter'. Their values are only modified by the filter-;; process, `agda2-go', `agda2-restart', and-;; `agda2-abort-highlighting'.+;; process, `agda2-go', `agda2-restart', `agda2-abort-highlighting',+;; and `agda2-abort-done'. (defvar agda2-responses-expected nil "Is the Agda process expected to produce at least one response?")@@ -522,11 +523,11 @@ (eq (agda2-process-status) 'run))) (defun agda2-send-command (restart &rest args)- "Send a command to the Agda2 asyncronous process. Saves the buffer-and sends the list of strings ARGS to Agda2. If RESTART is non-nil-and the Agda2 process is not running, or the *agda2* buffer does not-exist, then an attempt is made to restart the process."- (save-buffer)+ "Send a command to the Agda process.+Sends the list of strings ARGS to the process. If RESTART is+non-nil and the process is not running, or the *agda2*+buffer does not exist, then an attempt is made to restart the+process." (when (and restart (not (agda2-running-p))) ;; Try restarting automatically, but only once, in case there is ;; some major problem.@@ -546,10 +547,11 @@ (error "Another command is currently in progress \(if a command has been aborted you may want to restart Agda)"))) -(defun agda2-go (responses-expected highlight do-abort &rest args)+(defun agda2-go (save responses-expected highlight do-abort &rest args) "Executes commands in the Agda2 interpreter.-Sends the list of strings ARGS to the Agda2 interpreter, waits for-output and executes the responses, if any. If no responses are+Sends the list of strings ARGS to the Agda2 interpreter, waits+for output and executes the responses, if any. If SAVE is+'save, then the buffer is saved first. If no responses are received, and RESPONSES-EXPECTED is non-nil, then an error is raised. If HIGHLIGHT is non-nil, then the buffer's syntax highlighting may be updated."@@ -563,6 +565,8 @@ agda2-output-chunk-incomplete (agda2-queue-empty) agda2-file-buffer (current-buffer)) + (when (equal save 'save) (save-buffer))+ (apply 'agda2-send-command 'restart "IOTCM"@@ -572,7 +576,26 @@ "(" (append args '(")")))) +(defun agda2-abort ()+ "Tries to abort the current computation, if any.+May be more efficient than restarting Agda."+ (interactive)+ (agda2-send-command nil+ "IOTCM"+ (agda2-string-quote (buffer-file-name))+ "None"+ "Indirect"+ "Cmd_abort")) +(defun agda2-abort-done ()+ "Removes annotations, resets certain variables.+Intended to be used by the backend if an abort command was+successful."+ (agda2-remove-annotations)+ (setq agda2-highlight-in-progress nil+ agda2-responses-expected nil+ agda2-last-responses nil))+ (defun agda2-output-filter (proc chunk) "Evaluate the Agda process's commands. This filter function assumes that every line contains either some@@ -725,7 +748,7 @@ (message "\"%s\" has been modified. Interrupting highlighting." (buffer-name (current-buffer))))) -(defun agda2-goal-cmd (cmd &optional want ask &rest args)+(defun agda2-goal-cmd (cmd save &optional want ask &rest args) "Reads input from goal or minibuffer and sends command to Agda. An error is raised if point is not in a goal.@@ -748,6 +771,9 @@ If the user input is not taken from the goal, then an empty goal range is given. +If SAVE is 'save, then the buffer is saved just before the+command is sent to Agda (if it is sent).+ An error is raised if no responses are received." (multiple-value-bind (o g) (agda2-goal-at (point)) (unless g (error "For this command, please place the cursor in a goal"))@@ -759,7 +785,7 @@ (or ask (string-match "\\`\\s *\\'" txt))) (setq txt (read-string (concat want ": ") nil nil txt t))) (t (setq input-from-goal t)))- (apply 'agda2-go t input-from-goal t cmd+ (apply 'agda2-go save t input-from-goal t cmd (format "%d" g) (if input-from-goal (agda2-goal-Range o) (agda2-mkRange nil)) (agda2-string-quote txt) args))))@@ -781,7 +807,7 @@ (defun agda2-load () "Load current buffer." (interactive)- (agda2-go t t t "Cmd_load"+ (agda2-go 'save t t t "Cmd_load" (agda2-string-quote (buffer-file-name)) (agda2-list-quote agda2-program-args) ))@@ -809,25 +835,55 @@ (interactive) (let ((backend (cond ((equal agda2-backend "MAlonzo") "GHC") ((equal agda2-backend "MAlonzoNoMain") "GHCNoMain")- ((equal agda2-backend 'ask)+ ((equal agda2-backend "") (completing-read "Backend: " agda2-backends- nil t nil nil nil+ nil nil nil nil nil 'inherit-input-method)) (t agda2-backend))))- (unless (member backend agda2-backends)- (if (equal backend "")- (error "No backend chosen")- (error "Invalid backend: %s" backend)))- (agda2-go t t t "Cmd_compile"+ (when (equal backend "") (error "No backend chosen"))+ (agda2-go 'save t t t "Cmd_compile" backend (agda2-string-quote (buffer-file-name)) (agda2-list-quote agda2-program-args) ))) -(defun agda2-give()- "Give to the goal at point the expression in it" (interactive)- (agda2-goal-cmd "Cmd_give" "expression to give"))+(defmacro agda2-maybe-forced (name comment cmd save want)+ "This macro constructs a function NAME which runs CMD.+COMMENT is used to build the function's comment. The function+NAME takes a prefix argument which tells whether it should+apply force or not when running CMD (through+`agda2-goal-cmd';+SAVE is used as `agda2-goal-cmd's SAVE argument and+WANT is used as `agda2-goal-cmd's WANT argument)."+ (let ((eval (make-symbol "eval")))+ `(defun ,name (&optional prefix)+ ,(concat comment ". +The action depends on the prefix argument:++* If the prefix argument is `nil' (i.e., if no prefix argument is+ given), then no force is applied.++* If any other prefix argument is used (for instance, if C-u is+ typed once or twice right before the command is invoked), then+ force is applied.")+ (interactive "P")+ (let ((,eval (cond ((equal prefix nil) "WithoutForce")+ ("WithForce"))))+ (agda2-goal-cmd (concat ,cmd " " ,eval)+ ,save ,want)))))++(agda2-maybe-forced+ agda2-give+ "Give to the goal at point the expression in it"+ "Cmd_give"+ 'save+ "expression to give")++;; (defun agda2-give()+;; "Give to the goal at point the expression in it" (interactive)+;; (agda2-goal-cmd "Cmd_give" 'save "expression to give"))+ (defun agda2-give-action (old-g paren) "Update the goal OLD-G with the expression in it." (let@@ -852,18 +908,18 @@ of new goals." (interactive "P") (if pmlambda- (agda2-goal-cmd "Cmd_refine_or_intro True" 'goal)- (agda2-goal-cmd "Cmd_refine_or_intro False" 'goal)))+ (agda2-goal-cmd "Cmd_refine_or_intro True" 'save 'goal)+ (agda2-goal-cmd "Cmd_refine_or_intro False" 'save 'goal))) (defun agda2-auto () "Simple proof search" (interactive)- (agda2-goal-cmd "Cmd_auto" 'goal))+ (agda2-goal-cmd "Cmd_auto" 'save 'goal)) (defun agda2-make-case () "Refine the pattern variables given in the goal. Assumes that <clause> = {!<variables>!} is on one line." (interactive)- (agda2-goal-cmd "Cmd_make_case" "pattern variables to case (empty for split on result)"))+ (agda2-goal-cmd "Cmd_make_case" 'save "pattern variables to case (empty for split on result)")) (defun agda2-make-case-action (newcls) "Replace the line at point with new clauses NEWCLS and reload."@@ -913,19 +969,25 @@ major mode)." (setq agda2-buffer-external-status status)) -(defun agda2-warning-buffer nil- "Creates the Agda warning buffer, if it does not already exist.-The buffer is returned."- (unless (buffer-live-p agda2-warning-buffer)- (setq agda2-warning-buffer- (generate-new-buffer "*Agda warnings*"))+(defmacro agda2-warning-or-info-buffer (buffer kind title)+ "Used to define the functions agda2-warning-buffer and agda2-info-buffer."+ `(defun ,buffer nil+ ,(concat "Creates the Agda " kind+ " buffer, if it does not already exist.+The buffer is returned.")+ (unless (buffer-live-p ,buffer)+ (setq ,buffer+ (generate-new-buffer ,title)) - (with-current-buffer agda2-warning-buffer+ (with-current-buffer ,buffer (compilation-mode "AgdaInfo") ;; Support for jumping to positions mentioned in the text. (set (make-local-variable 'compilation-error-regexp-alist) '(("\\([\\\\/][^[:space:]]*\\):\\([0-9]+\\),\\([0-9]+\\)-\\(\\([0-9]+\\),\\)?\\([0-9]+\\)" 1 (2 . 5) (3 . 6))))+ ;; Do not skip errors that start in the same position as the+ ;; current one.+ (set (make-local-variable 'compilation-skip-to-next-location) nil) ;; No support for recompilation. The key binding is removed, and ;; attempts to run `recompile' will (hopefully) result in an ;; error.@@ -939,8 +1001,14 @@ (set (make-local-variable 'word-combining-categories) (cons '(nil . nil) word-combining-categories)) (set-input-method "Agda"))) - agda2-warning-buffer)+ ,buffer)) +(agda2-warning-or-info-buffer+ agda2-warning-buffer "warning" "*Agda warnings*")++(agda2-warning-or-info-buffer+ agda2-info-buffer "info" "*Agda information*")+ (defun agda2-font-syntactic-face (state) (cond ((nth 4 state) ( save-excursion@@ -949,34 +1017,6 @@ ((looking-at "{-[^#]") 'font-lock-comment-face) ))))) -(defun agda2-info-buffer nil- "Creates the Agda info buffer, if it does not already exist.-The buffer is returned."- (unless (buffer-live-p agda2-info-buffer)- (setq agda2-info-buffer- (generate-new-buffer "*Agda information*"))-- (with-current-buffer agda2-info-buffer- (compilation-mode "AgdaInfo")- ;; Support for jumping to positions mentioned in the text.- (set (make-local-variable 'compilation-error-regexp-alist)- '(("\\([\\\\/][^[:space:]]*\\):\\([0-9]+\\),\\([0-9]+\\)-\\(\\([0-9]+\\),\\)?\\([0-9]+\\)"- 1 (2 . 5) (3 . 6))))- ;; No support for recompilation. The key binding is removed, and- ;; attempts to run `recompile' will (hopefully) result in an- ;; error.- (let ((map (copy-keymap (current-local-map))))- (define-key map (kbd "g") 'undefined)- (use-local-map map))- (set (make-local-variable 'compile-command)- 'agda2-does-not-support-compilation-via-the-compilation-mode)-- (set-syntax-table agda2-mode-syntax-table)- (set (make-local-variable 'word-combining-categories) (cons '(nil . nil) word-combining-categories))- (set-input-method "Agda")))-- agda2-info-buffer)- (defun agda2-info-action (name text &optional append) "Insert TEXT into the Agda info buffer and display it. NAME is displayed in the buffer's mode line.@@ -1146,11 +1186,11 @@ (defun agda2-show-goals() "Show all goals." (interactive)- (agda2-go t t t "Cmd_metas"))+ (agda2-go nil t t t "Cmd_metas")) (defun agda2-show-constraints() "Show constraints." (interactive)- (agda2-go t t t "Cmd_constraints"))+ (agda2-go nil t t t "Cmd_constraints")) (defun agda2-remove-annotations () "Removes buffer annotations (overlays and text properties)."@@ -1196,7 +1236,7 @@ NAME takes a prefix argument which tells whether it should normalise types or not when running CMD (through `agda2-goal-cmd'; WANT is used as `agda2-goal-cmd's WANT-argument)."+argument, and nil as its SAVE argument)." (let ((eval (make-symbol "eval"))) `(defun ,name (&optional prefix) ,(concat comment ".@@ -1218,15 +1258,15 @@ ((equal prefix '(4)) "Instantiated") ("Normalised")))) (agda2-goal-cmd (concat ,cmd " " ,eval)- ,want)))))+ nil ,want))))) (defmacro agda2-maybe-normalised-toplevel (name comment cmd prompt) "This macro constructs a function NAME which runs CMD. COMMENT is used to build the function's comments. The function NAME takes a prefix argument which tells whether it should normalise types or not when running CMD (through-`agda2-go' t nil t; the string PROMPT is used as the goal command-prompt)."+`agda2-go' nil t nil t; the string PROMPT is used as the goal+command prompt)." (let ((eval (make-symbol "eval"))) `(defun ,name (prefix expr) ,(concat comment ".@@ -1247,7 +1287,7 @@ (let ((,eval (cond ((equal prefix nil) "Simplified") ((equal prefix '(4)) "Instantiated") ("Normalised"))))- (agda2-go t nil t+ (agda2-go nil t nil t (concat ,cmd " " ,eval " " (agda2-string-quote expr))))))) @@ -1256,7 +1296,7 @@ COMMENT is used to build the function's comments. The function NAME takes a prefix argument which tells whether it should normalise types or not when running CMD (through-`agda2-go' t nil t;)."+`agda2-go' nil t nil t;)." (let ((eval (make-symbol "eval"))) `(defun ,name (prefix) ,(concat comment ".@@ -1277,7 +1317,7 @@ (let ((,eval (cond ((equal prefix nil) "AsIs") ((equal prefix '(4)) "Simplified") ("Normalised"))))- (agda2-go t nil t+ (agda2-go nil t nil t (concat ,cmd " " ,eval " " )))))) @@ -1313,12 +1353,12 @@ (defun agda2-why-in-scope () "Explain why something is in scope in a goal." (interactive)- (agda2-goal-cmd "Cmd_why_in_scope" "Name"))+ (agda2-goal-cmd "Cmd_why_in_scope" nil "Name")) (defun agda2-why-in-scope-toplevel (name) "Explain why something is in scope at the top level." (interactive "MName: ")- (agda2-go t nil t+ (agda2-go nil t nil t "Cmd_why_in_scope_toplevel" (agda2-string-quote name))) @@ -1342,6 +1382,12 @@ "expression to type") (agda2-maybe-normalised+ agda2-goal-and-context-and-checked+ "Shows the context, the goal and check the given expression's against the hole's type"+ "Cmd_goal_type_context_check"+ "expression to type")++(agda2-maybe-normalised agda2-show-context "Show the context of the goal at point" "Cmd_context"@@ -1436,7 +1482,7 @@ (cond ((equal arg nil) " DefaultCompute") ((equal arg '(4)) " IgnoreAbstract") (" UseShowInstance")))))- (agda2-goal-cmd cmd "expression to normalise")))+ (agda2-goal-cmd cmd nil "expression to normalise"))) (defun agda2-compute-normalised-toplevel (expr &optional arg) "Compute the normal form of the given expression.@@ -1454,7 +1500,7 @@ (cond ((equal arg nil) " DefaultCompute") ((equal arg '(4)) " IgnoreAbstract") (" UseShowInstance")) " ")))- (agda2-go t nil t (concat cmd (agda2-string-quote expr)))))+ (agda2-go nil t nil t (concat cmd (agda2-string-quote expr))))) (defun agda2-compute-normalised-maybe-toplevel () "Compute the normal form of the given expression.@@ -1475,17 +1521,18 @@ (defun agda2-display-program-version () "Display version of Agda" (interactive)- (agda2-go nil nil t "Cmd_show_version"))+ (agda2-go nil nil nil t "Cmd_show_version")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; (defun agda2-highlight-reload nil "Loads precomputed syntax highlighting info for the current buffer.-If there is any to load."- (agda2-go nil t t- "Cmd_load_highlighting_info"- (agda2-string-quote (buffer-file-name))))+Only if the buffer is unmodified, and only if there is anything to load."+ (unless (buffer-modified-p)+ (agda2-go nil nil t t+ "Cmd_load_highlighting_info"+ (agda2-string-quote (buffer-file-name))))) (defun agda2-literate-p () "Is the current buffer a literate Agda buffer?"@@ -1623,7 +1670,7 @@ (delete-region p (+ p 2))) ;; Update highlighting (if (and (not (equal new-txt 'paren)) (not (equal new-txt 'no-paren)))- (apply 'agda2-go t t nil "Cmd_highlight"+ (apply 'agda2-go 'save t t nil "Cmd_highlight" (format "%d" old-g) (agda2-mkRange `(,p ,(- q 2))) (agda2-string-quote new-txt) nil))@@ -1890,10 +1937,11 @@ With prefix argument, turn on display of implicit arguments if the argument is a positive number, otherwise turn it off." (interactive "P")- (cond ((eq arg nil) (agda2-go t t t "ToggleImplicitArgs"))- ((and (numberp arg)- (> arg 0)) (agda2-go t t t "ShowImplicitArgs" "True"))- (t (agda2-go t t t "ShowImplicitArgs" "False"))))+ (cond+ ((eq arg nil) (agda2-go nil t t t "ToggleImplicitArgs"))+ ((and (numberp arg)+ (> arg 0)) (agda2-go nil t t t "ShowImplicitArgs" "True"))+ (t (agda2-go nil t t t "ShowImplicitArgs" "False")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;
src/data/emacs-mode/annotation.el view
@@ -98,6 +98,17 @@ "Move point to POSITION." (goto-char (+ position annotations-offset))) +(defun annotation-append-text-property (start end prop values)+ "Merges VALUES to text property PROP between START and END."+ (let ((pos start)+ mid)+ (while (< pos end)+ (setq mid (next-single-property-change pos prop nil end))+ (let* ((old-values (get-text-property pos prop))+ (all-values (union old-values values)))+ (put-text-property pos mid prop all-values)+ (setq pos mid)))))+ (defun annotation-annotate (start end anns &optional info goto) "Annotate text between START and END in the current buffer. @@ -141,7 +152,7 @@ anns))) (props nil)) (when faces- (put-text-property start end 'font-lock-face faces)+ (annotation-append-text-property start end 'font-lock-face faces) (add-to-list 'props 'font-lock-face)) (when (consp goto) (add-text-properties start end
src/data/lib/prim/Agda/Builtin/Bool.agda view
@@ -9,8 +9,8 @@ {-# BUILTIN FALSE false #-} {-# BUILTIN TRUE true #-} -{-# COMPILED_DATA_UHC Bool __BOOL__ __FALSE__ __TRUE__ #-}+{-# COMPILE UHC Bool = data __BOOL__ (__FALSE__ | __TRUE__) #-} -{-# COMPILED_JS Bool function (x,v) { return ((x)? v["true"]() : v["false"]()); } #-}-{-# COMPILED_JS false false #-}-{-# COMPILED_JS true true #-}+{-# COMPILE JS Bool = function (x,v) { return ((x)? v["true"]() : v["false"]()); } #-}+{-# COMPILE JS false = false #-}+{-# COMPILE JS true = true #-}
src/data/lib/prim/Agda/Builtin/Equality.agda view
@@ -7,4 +7,3 @@ instance refl : x ≡ x {-# BUILTIN EQUALITY _≡_ #-}-{-# BUILTIN REFL refl #-}
src/data/lib/prim/Agda/Builtin/IO.agda view
@@ -5,5 +5,5 @@ postulate IO : ∀ {a} → Set a → Set a {-# BUILTIN IO IO #-} -{-# HASKELL type AgdaIO a b = IO b #-}-{-# COMPILED_TYPE IO MAlonzo.Code.Agda.Builtin.IO.AgdaIO #-}+{-# FOREIGN GHC type AgdaIO a b = IO b #-}+{-# COMPILE GHC IO = type AgdaIO #-}
src/data/lib/prim/Agda/Builtin/List.agda view
@@ -11,12 +11,12 @@ {-# BUILTIN NIL [] #-} {-# BUILTIN CONS _∷_ #-} -{-# HASKELL type AgdaList a b = [b] #-}+{-# FOREIGN GHC type AgdaList a b = [b] #-} -{-# COMPILED_DATA List MAlonzo.Code.Agda.Builtin.List.AgdaList [] (:) #-}-{-# COMPILED_DATA_UHC List __LIST__ __NIL__ __CONS__ #-}-{-# COMPILED_JS List function(x,v) {+{-# COMPILE GHC List = data AgdaList ([] | (:)) #-}+{-# COMPILE UHC List = data __LIST__ (__NIL__ | __CONS__) #-}+{-# COMPILE JS List = function(x,v) { if (x.length < 1) { return v["[]"](); } else { return v["_∷_"](x[0], x.slice(1)); } } #-}-{-# COMPILED_JS [] Array() #-}-{-# COMPILED_JS _∷_ function (x) { return function(y) { return Array(x).concat(y); }; } #-}+{-# COMPILE JS [] = Array() #-}+{-# COMPILE JS _∷_ = function (x) { return function(y) { return Array(x).concat(y); }; } #-}
src/data/lib/prim/Agda/Builtin/Reflection.agda view
@@ -47,10 +47,24 @@ {-# BUILTIN FIXITY Fixity #-} {-# BUILTIN FIXITYFIXITY fixity #-} -{-# COMPILED_DATA Associativity MAlonzo.RTE.Assoc MAlonzo.RTE.LeftAssoc MAlonzo.RTE.RightAssoc MAlonzo.RTE.NonAssoc #-}-{-# COMPILED_DATA Precedence MAlonzo.RTE.Precedence MAlonzo.RTE.Related MAlonzo.RTE.Unrelated #-}-{-# COMPILED_DATA Fixity MAlonzo.RTE.Fixity MAlonzo.RTE.Fixity #-}+{-# COMPILE GHC Associativity = data MAlonzo.RTE.Assoc (MAlonzo.RTE.LeftAssoc | MAlonzo.RTE.RightAssoc | MAlonzo.RTE.NonAssoc) #-}+{-# COMPILE GHC Precedence = data MAlonzo.RTE.Precedence (MAlonzo.RTE.Related | MAlonzo.RTE.Unrelated) #-}+{-# COMPILE GHC Fixity = data MAlonzo.RTE.Fixity (MAlonzo.RTE.Fixity) #-} +{-# COMPILE JS Associativity = function (x,v) { return v[x](); } #-}+{-# COMPILE JS left-assoc = "left-assoc" #-}+{-# COMPILE JS right-assoc = "right-assoc" #-}+{-# COMPILE JS non-assoc = "non-assoc" #-}++{-# COMPILE JS Precedence =+ function (x,v) {+ if (x === "unrelated") { return v[x](); } else { return v["related"](x); }} #-}+{-# COMPILE JS related = function(x) { return x; } #-}+{-# COMPILE JS unrelated = "unrelated" #-}++{-# COMPILE JS Fixity = function (x,v) { return v["fixity"](x["assoc"], x["prec"]); } #-}+{-# COMPILE JS fixity = function (x) { return function (y) { return { "assoc": x, "prec": y}; }; } #-}+ primitive primQNameFixity : Name → Fixity @@ -193,7 +207,7 @@ data Definition : Set where function : (cs : List Clause) → Definition data-type : (pars : Nat) (cs : List Name) → Definition- record-type : (c : Name) → Definition+ record-type : (c : Name) (fs : List (Arg Name)) → Definition data-cons : (d : Name) → Definition axiom : Definition prim-fun : Definition@@ -249,6 +263,10 @@ -- their results: inferType, checkType, quoteTC, getType, and getContext withNormalisation : ∀ {a} {A : Set a} → Bool → TC A → TC A + -- Prints the third argument if the corresponding verbosity level is turned+ -- on (with the -v flag to Agda).+ debugPrint : String → Nat → List ErrorPart → TC ⊤+ {-# BUILTIN AGDATCM TC #-} {-# BUILTIN AGDATCMRETURN returnTC #-} {-# BUILTIN AGDATCMBIND bindTC #-}@@ -273,3 +291,4 @@ {-# BUILTIN AGDATCMCOMMIT commitTC #-} {-# BUILTIN AGDATCMISMACRO isMacro #-} {-# BUILTIN AGDATCMWITHNORMALISATION withNormalisation #-}+{-# BUILTIN AGDATCMDEBUGPRINT debugPrint #-}
src/data/lib/prim/Agda/Builtin/String.agda view
@@ -17,9 +17,9 @@ primShowChar : Char → String primShowString : String → String -{-# COMPILED_JS primStringToList function(x) { return x.split(""); } #-}-{-# COMPILED_JS primStringFromList function(x) { return x.join(""); } #-}-{-# COMPILED_JS primStringAppend function(x) { return function(y) { return x+y; }; } #-}-{-# COMPILED_JS primStringEquality function(x) { return function(y) { return x===y; }; } #-}-{-# COMPILED_JS primShowChar function(x) { return x; } #-}-{-# COMPILED_JS primShowString function(x) { return x; } #-}+{-# COMPILE JS primStringToList = function(x) { return x.split(""); } #-}+{-# COMPILE JS primStringFromList = function(x) { return x.join(""); } #-}+{-# COMPILE JS primStringAppend = function(x) { return function(y) { return x+y; }; } #-}+{-# COMPILE JS primStringEquality = function(x) { return function(y) { return x===y; }; } #-}+{-# COMPILE JS primShowChar = function(x) { return JSON.stringify(x); } #-}+{-# COMPILE JS primShowString = function(x) { return JSON.stringify(x); } #-}
src/data/lib/prim/Agda/Builtin/Unit.agda view
@@ -6,4 +6,4 @@ instance constructor tt {-# BUILTIN UNIT ⊤ #-}-{-# COMPILED_DATA ⊤ () () #-}+{-# COMPILE GHC ⊤ = data () (()) #-}
src/data/lib/prim/Agda/Primitive.agda view
@@ -19,8 +19,8 @@ -- MAlonzo compiles Level to (). This should be safe, because it is -- not possible to pattern match on levels. -{-# COMPILED_TYPE Level () #-}-{-# BUILTIN LEVEL Level #-}+{-# COMPILE GHC Level = type () #-}+{-# BUILTIN LEVEL Level #-} postulate lzero : Level
− src/data/uhc-agda-base/LICENSE
− src/data/uhc-agda-base/src/UHC/Agda/Builtins.hs
@@ -1,478 +0,0 @@-module UHC.Agda.Builtins- ( -- Integer- primShowInteger- , primIntegerQuot- , primIntegerRem- , primIntegerMinus- , primIntegerPlus- , primIntegerTimes- , primIntegerGreaterOrEqual- , primIntegerEquality- , primIntegerLess- -- Levels- , primLevelZero- , primLevelSuc- , primLevelMax- -- Nat- , Nat (..)- , primIntegerToNat- , primNatToInteger- , primNatMinus- , primNatPlus- , primNatTimes- , primNatDivSuc- , primNatDivSucAux- , primNatModSuc- , primNatModSucAux- , primNatEquality- , primNatLess- -- IO- , primReturn- , primBind- , primGetContents- , primReadFile- , primWriteFile- , primAppendFile- , primPutStr- , primPutStrLn- , primReadFiniteFile- -- String- , primStringAppend- , primStringEquality- , primStringFromList- , primStringToList- , primShowString- -- Char- , primCharToNat- , primCharEquality- , primShowChar- , primIsLower- , primIsDigit- , primIsAlpha- , primIsSpace- , primIsAscii- , primIsLatin1- , primIsPrint- , primIsHexDigit- , primToUpper- , primToLower- , primNatToChar- -- Float- , primShowFloat- , primMkFloat- , primFloatEquality- , primFloatNumericalEquality- , primFloatNumericalLess- , primNatToFloat- , primFloatPlus- , primFloatMinus- , primFloatTimes- , primFloatNegate- , primFloatDiv- , primFloatSqrt- , primRound- , primFloor- , primCeiling- , primExp- , primLog- , primSin- , primCos- , primTan- , primASin- , primACos- , primATan- , primATan2- -- Reflection- , QName (..)- , primMkQName- , primQNameEquality- , primQNameLess- , primShowQName- , primQNameFixity- , primMetaEquality- , primMetaLess- , primShowMeta-- -- Debugging- , primTrace-- -- Misc- , primIfThenElse- , primSeq- , unit- )-where--import Prelude-import qualified Data.Char as C-import Debug.Trace-import UHC.OldException (onException)-import System.IO (openFile, IOMode (ReadMode), hClose, hFileSize, hGetContents)----------------------------------------------------------------------------------- Adapted from the ieee754 package. See the LICENSE file.-foreign import ccall "double.h identical" c_identical :: Double -> Double -> Int--identicalIEEE :: Double -> Double -> Bool-identicalIEEE x y = c_identical x y /= 0----------------------------------------------------------------------------------- internal helper for this file-notImplError :: String -> a-notImplError f = error $ "Feature " ++ f ++ " is not implemented in the UHC backend!"---- ====================--- Integer--- ====================--primShowInteger :: Integer -> String-primShowInteger = show--primIntegerQuot :: Integer -> Integer -> Integer-primIntegerQuot = quot--primIntegerRem :: Integer -> Integer -> Integer-primIntegerRem = rem--primIntegerMinus :: Integer -> Integer -> Integer-primIntegerMinus = (-)--primIntegerPlus :: Integer -> Integer -> Integer-primIntegerPlus = (+)--primIntegerTimes :: Integer -> Integer -> Integer-primIntegerTimes = (*)--primIntegerGreaterOrEqual :: Integer -> Integer -> Bool-primIntegerGreaterOrEqual = (>=)--primIntegerLess :: Integer -> Integer -> Bool-primIntegerLess = (<)--primIntegerEquality :: Integer -> Integer -> Bool-primIntegerEquality = (==)---- ====================--- Levels--- ====================--primLevelZero :: ()-primLevelZero = ()--primLevelSuc :: () -> ()-primLevelSuc _ = ()--primLevelMax :: () -> () -> ()-primLevelMax _ _ = ()---- ====================--- Nat--- ====================--newtype Nat = Nat Integer--liftN2 :: (Integer -> Integer -> Integer) -> Nat -> Nat -> Nat-liftN2 f x y = Nat (f (unNat x) (unNat y))--unNat :: Nat -> Integer-unNat (Nat i) = i--primNatToInteger :: Nat -> Integer-primNatToInteger = unNat---- unsafe!-primIntegerToNat :: Integer -> Nat-primIntegerToNat = Nat--primNatPlus :: Nat -> Nat -> Nat-primNatPlus = liftN2 (+)--primNatTimes :: Nat -> Nat -> Nat-primNatTimes = liftN2 (*)--primNatMinus :: Nat -> Nat -> Nat-primNatMinus x y = Nat $ max 0 (unNat x - unNat y)--primNatDivSuc :: Nat -> Nat -> Nat-primNatDivSuc x y = Nat $ div (unNat x) (unNat y + 1)--primNatDivSucAux :: Nat -> Nat -> Nat -> Nat -> Nat-primNatDivSucAux (Nat k) (Nat m) (Nat n) (Nat j) =- Nat $ k + div (max 0 $ n + m - j) (m + 1)--primNatModSuc :: Nat -> Nat -> Nat-primNatModSuc x y = Nat $ mod (unNat x) (unNat y + 1)--primNatModSucAux :: Nat -> Nat -> Nat -> Nat -> Nat-primNatModSucAux (Nat k) (Nat m) (Nat n) (Nat j) =- Nat $ if n > j then mod (n - j - 1) (m + 1) else k + n--primNatEquality :: Nat -> Nat -> Bool-primNatEquality x y = unNat x == unNat y--primNatLess :: Nat -> Nat -> Bool-primNatLess x y = unNat x < unNat y---- ====================--- IO--- ====================---- Calling haskell functions with class constraints from Agda--- isn't supported yet, so just remove the class constraints on return/bind--primReturn :: a -> IO a-primReturn = return--primBind :: IO a -> (a -> IO b) -> IO b-primBind = (>>=)--primGetContents :: IO String-primGetContents = getContents--primReadFile :: FilePath -> IO String-primReadFile = readFile--primWriteFile :: FilePath -> String -> IO ()-primWriteFile = writeFile--primAppendFile :: FilePath -> String -> IO ()-primAppendFile = appendFile--primPutStr :: String -> IO ()-primPutStr = putStr--primPutStrLn :: String -> IO ()-primPutStrLn = putStrLn--primReadFiniteFile :: FilePath -> IO String-primReadFiniteFile f = do- h <- openFile f ReadMode- hFileSize h `onException` hClose h- hGetContents h---- ====================--- String--- ====================--primStringFromList :: [Char] -> String-primStringFromList = id--primStringToList :: String -> [Char]-primStringToList = id--primStringAppend :: String -> String -> String-primStringAppend = (++)--primStringEquality :: String -> String -> Bool-primStringEquality = (==)--primShowString :: String -> String-primShowString = id---- ====================--- Char--- ====================--primCharToNat :: Char -> Nat-primCharToNat c = primIntegerToNat (fromIntegral (fromEnum c))--primNatToChar :: Nat -> Char-primNatToChar i = toEnum (fromInteger (primNatToInteger i))--primCharEquality :: Char -> Char -> Bool-primCharEquality = (==)--primShowChar :: Char -> String-primShowChar c = show c--primIsLower :: Char -> Bool-primIsLower = C.isLower--primIsDigit :: Char -> Bool-primIsDigit = C.isDigit--primIsAlpha :: Char -> Bool-primIsAlpha = C.isAlpha--primIsSpace :: Char -> Bool-primIsSpace = C.isSpace--primIsAscii :: Char -> Bool-primIsAscii = C.isAscii--primIsLatin1 :: Char -> Bool-primIsLatin1 = C.isLatin1--primIsPrint :: Char -> Bool-primIsPrint = C.isPrint--primIsHexDigit :: Char -> Bool-primIsHexDigit = C.isHexDigit--primToUpper :: Char -> Char-primToUpper = C.toUpper--primToLower :: Char -> Char-primToLower = C.toLower---- ====================--- Float--- ====================--positiveNaN :: Double-positiveNaN = 0.0 / 0.0--primShowFloat :: Double -> String-primShowFloat x- | isNaN x = "NaN"- | isInfinite x = if x < 0 then "-Infinity" else "Infinity"- | otherwise = reverse . dropZeroes . reverse $ show x- where- -- GHC drops trailing zeroes, UHC doesn't seem to do so. Quick fix for now...- dropZeroes s@(_ : '.' : _) = s -- don't drop the last one though- dropZeroes ('0' : s) = dropZeroes s- dropZeroes s = s--primMkFloat :: String -> Double-primMkFloat = read---- ASR (2016-09-29). We use bitwise equality for comparing Double--- because Haskell's Eq, which equates 0.0 and -0.0, allows to prove a--- contradiction (see Issue #2169).-primFloatEquality :: Double -> Double -> Bool-primFloatEquality x y = identicalIEEE x y || (isNaN x && isNaN y)--primFloatNumericalEquality :: Double -> Double -> Bool-primFloatNumericalEquality = (==)---- Adapted from the same function on Agda.Syntax.Literal.-compareFloat :: Double -> Double -> Ordering-compareFloat x y- | identicalIEEE x y = EQ- | isNegInf x = LT- | isNegInf y = GT- | isNaN x && isNaN y = EQ- | isNaN x = LT- | isNaN y = GT- | otherwise = compare x y- where- isNegInf z = z < 0 && isInfinite z--primFloatNumericalLess :: Double -> Double -> Bool-primFloatNumericalLess x y =- case compareFloat x y of- LT -> True- _ -> False--primNatToFloat :: Nat -> Double-primNatToFloat n = fromIntegral (unNat n)--primFloatPlus :: Double -> Double -> Double-primFloatPlus = (+)--primFloatMinus :: Double -> Double -> Double-primFloatMinus = (-)--primFloatTimes :: Double -> Double -> Double-primFloatTimes = (*)--primFloatNegate :: Double -> Double-primFloatNegate = negate--primFloatDiv :: Double -> Double -> Double-primFloatDiv = (/)--primFloatSqrt :: Double -> Double-primFloatSqrt = sqrt--primRound :: Double -> Integer-primRound = round--primFloor :: Double -> Integer-primFloor = floor--primCeiling :: Double -> Integer-primCeiling = ceiling--primExp :: Double -> Double-primExp = exp--primLog :: Double -> Double-primLog = log--primSin :: Double -> Double-primSin = sin--primCos :: Double -> Double-primCos = cos--primTan :: Double -> Double-primTan = tan--primASin :: Double -> Double-primASin = asin--primACos :: Double -> Double-primACos = acos--primATan :: Double -> Double-primATan = atan--primATan2 :: Double -> Double -> Double-primATan2 = atan2---- ====================--- Reflection--- ====================-data QName = QName { nameId, moduleId ::Integer, qnameString :: String }--primMkQName :: Integer -> Integer -> String -> QName-primMkQName = QName--instance Eq QName where- (QName a b _) == (QName c d _) = (a, b) == (c, d)-instance Ord QName where- compare (QName a b _) (QName c d _) = compare (a, b) (c, d)--primQNameEquality :: QName -> QName -> Bool-primQNameEquality = (==)--primQNameLess :: QName -> QName -> Bool-primQNameLess = (<)--primShowQName :: QName -> String-primShowQName = qnameString--primQNameFixity :: QName -> a-primQNameFixity = error "TODO: primQNameFixity"--type Meta = Integer--primMetaEquality :: Meta -> Meta -> Bool-primMetaEquality = (==)--primMetaLess :: Meta -> Meta -> Bool-primMetaLess = (<)--primShowMeta :: Meta -> String-primShowMeta x = "_" ++ show x---- ====================--- Debugging--- ====================-primTrace :: String -> b -> b-primTrace = trace---- ====================--- Misc--- ====================--primIfThenElse :: Bool -> a -> a -> a-primIfThenElse c t e = if c then t else e--primSeq :: a -> b -> b-primSeq = seq---- | Unit wrapper function (instead of dropping a dummy function inside each module).-unit :: ()-unit = ()
− src/data/uhc-agda-base/src/UHC/Agda/double.c
@@ -1,12 +0,0 @@-#include <stdint.h>--union cast {- double x;- uint64_t n;-};--int identical (double x, double y) {- union cast cx = { .x = x };- union cast cy = { .x = y };- return cx.n == cy.n;-}
− src/data/uhc-agda-base/src/UHC/Agda/double.h
@@ -1,2 +0,0 @@--int identical (double x, double y);
− src/data/uhc-agda-base/uhc-agda-base.cabal
@@ -1,25 +0,0 @@--- Initial uhc-agda-base.cabal generated by cabal init. For further--- documentation, see http://haskell.org/cabal/users-guide/---- ATTENTION: normally this package gets built using UHC directly without cabal!--- The version of this package, when built directly using UHC, is the version of Agda.--- In the long term, it would be nice if we could use "cabal install --uhc" to install this package.--name: uhc-agda-base-version: 0.1.0.0-synopsis: Builtins implementation for Agda UHC Backend--- description:-license: AllRightsReserved-license-file: LICENSE-author: Philipp Hausmann-maintainer: ph_git@314.ch--- copyright:-category: Development-build-type: Simple-cabal-version: >=1.8--library- exposed-modules: UHC.Agda.Builtins- -- other-modules:- build-depends: base ==4.6.*- hs-source-dirs: src
src/full/Agda/Auto/Auto.hs view
@@ -1,27 +1,31 @@ {-# LANGUAGE CPP #-} -module Agda.Auto.Auto (auto) where+module Agda.Auto.Auto+ (auto+ , AutoResult(..)+ , AutoProgress(..)+ ) where import Prelude hiding (null) +#if __GLASGOW_HASKELL__ <= 708+import Control.Applicative ( (<$), pure )+#endif++import Data.Functor import Control.Monad.State-import Data.List hiding (null)+import qualified Data.List as List import qualified Data.Map as Map import Data.IORef import qualified System.Timeout import Data.Maybe-import Data.Functor import qualified Data.Traversable as Trav import Agda.Utils.Permutation (permute, takeP) import Agda.TypeChecking.Monad hiding (withCurrentModule)--- import Agda.TypeChecking.Monad.Base--- import Agda.TypeChecking.Monad.MetaVars--- import Agda.TypeChecking.Monad.Context--- import Agda.TypeChecking.Monad.Signature-import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope +import Agda.Syntax.Common (Hiding(..)) import qualified Agda.Syntax.Abstract as A import Agda.Syntax.Abstract.Pretty (prettyA) import qualified Text.PrettyPrint as PP@@ -40,6 +44,7 @@ import Agda.TypeChecking.EtaContract (etaContract) import qualified Agda.Utils.HashMap as HMap +import Agda.Auto.Options import Agda.Auto.Convert import Agda.Auto.NarrowingSearch import Agda.Auto.Syntax@@ -63,62 +68,69 @@ insertAbsurdPattern s@(_:_) | take (length abspatvarname) s == abspatvarname = "()" ++ drop (length abspatvarname) s insertAbsurdPattern (c:s) = c : insertAbsurdPattern s -getName :: A.Expr -> Maybe (Bool, I.QName)-getName (A.ScopedExpr _ e) = getName e-getName (A.Def qname) = Just (False, qname)-getName (A.Proj _ qname) = Just (False, head $ I.unAmbQ qname)-getName (A.Con qname) = Just (True, head $ I.unAmbQ qname)-getName _ = Nothing--dispmsg :: String ->- TCM (Either [(InteractionId, String)]- (Either [String] String)- , Maybe String)-dispmsg msg = return (Left [], Just msg)+getHeadAsHint :: A.Expr -> Maybe Hint+getHeadAsHint (A.ScopedExpr _ e) = getHeadAsHint e+getHeadAsHint (A.Def qname) = Just $ Hint False qname+getHeadAsHint (A.Proj _ qname) = Just $ Hint False $ head $ I.unAmbQ qname+getHeadAsHint (A.Con qname) = Just $ Hint True $ head $ I.unAmbQ qname+getHeadAsHint _ = Nothing --- | Entry point for Auto tactic (Agsy).------ @auto ii rng s = return (res, mmsg)@------ If @mmsg = Just msg@, the message @msg@ produced by Agsy should--- be displayed to the user.+-- | Result type: Progress & potential Message for the user ----- The result @res@ of the Auto tactic can be one of the following three:+-- The of the Auto tactic can be one of the following three: ----- 1. @Left [(ii,s)]@+-- 1. @Solutions [(ii,s)]@ -- A list of solutions @s@ for interaction ids @ii@.--- In particular, @Left []@ means Agsy found no solution.+-- In particular, @Solutions []@ means Agsy found no solution. ----- 2. @Right (Left cs)@--- A list of clauses (the user allowed case-split).+-- 2. @FunClauses cs@+-- A list of clauses for the interaction id @ii@ in which Auto+-- was invoked with case-splitting turned on. ----- 3. @Right (Right s)@+-- 3. @Refinement s@ -- A refinement for the interaction id @ii@ in which Auto was invoked. +data AutoProgress =+ Solutions [(InteractionId, String)]+ | FunClauses [String]+ | Refinement String++data AutoResult = AutoResult+ { autoProgress :: AutoProgress+ , autoMessage :: Maybe String+ }++stopWithMsg :: String -> TCM AutoResult+stopWithMsg msg = return $ AutoResult (Solutions []) (Just msg)++-- | Entry point for Auto tactic (Agsy).+--+-- If the @autoMessage@ part of the result is set to @Just msg@, the+-- message @msg@ produced by Agsy should be displayed to the user.+ auto :: InteractionId -> Range -> String- -> TCM ( Either [(InteractionId, String)]- (Either [String] String)- , Maybe String)+ -> TCM AutoResult auto ii rng argstr = do -- Parse hints and other configuration.- let (hints, timeout, pick, mode, hintmode) = parseargs argstr+ let autoOptions = parseArgs argstr+ let hints = autoOptions ^. aoHints+ let timeout = autoOptions ^. aoTimeOut+ let pick = autoOptions ^. aoPick+ let mode = autoOptions ^. aoMode+ let hintmode = autoOptions ^. aoHintMode ahints <- case mode of MRefine{} -> return [] _ -> mapM (parseExprIn ii rng) hints- let failHints = dispmsg "Hints must be a list of constant names"- caseMaybe (mapM getName ahints) failHints $ \ ehints -> do+ let failHints = stopWithMsg "Hints must be a list of constant names" - -- Get names for equality reasoning.- -- @eqstuff == []@ if any of these names is not defined.- eqstuffExprs <- mapM (parseExprIn ii rng) ["_≡_", "begin_", "_≡⟨_⟩_", "_∎", "sym", "cong"]- `catchError`- (\_ -> return [])- let eqstuff = fromMaybe [] $ mapM getName eqstuffExprs+ eqstuff <- getEqCombinators ii rng + caseMaybe (mapM getHeadAsHint ahints) failHints $ \ ehints -> do+ -- Get the meta variable for the interaction point we are trying to fill. -- Add the @autohints@ for that meta to the hints collection. mi <- lookupInteractionId ii@@ -156,7 +168,9 @@ nsol' <- readIORef nsol let cond = nsol' <= numsols when cond $ do- trms <- runExceptT $ mapM (\ (m, _, _, _) -> frommy (Meta m)) $ Map.elems tccons+ trms <- runExceptT+ $ mapM (\ (m , _, _, _) -> convert (Meta m) :: MOT I.Term)+ $ Map.elems tccons case trms of Left{} -> writeIORef nsol $! nsol' + 1 Right trms -> modifyIORef sols (trms :)@@ -165,7 +179,8 @@ ticks <- liftIO $ newIORef 0 let exsearch initprop recinfo defdfv =- liftIO $ System.Timeout.timeout (timeout * 1000000) $ loop 0+ liftIO $ System.Timeout.timeout (getTimeOut timeout * 1000000)+ $ loop 0 where loop d = do let rechint x = case recinfo of@@ -207,7 +222,7 @@ Nothing -> return 0 ee <- liftIO $ newIORef $ ConstDef {cdname = "T", cdorigin = __IMPOSSIBLE__, cdtype = NotM $ Sort (Set 0), cdcont = Postulate, cddeffreevars = 0} let (restargs, modargs) = splitAt (length mylocalVars - defdfv) mylocalVars- mytype' = foldl (\x y -> NotM $ Pi Nothing Agda.Auto.Syntax.NotHidden (freeIn 0 y) y (Abs NoId x)) mytype restargs+ mytype' = foldl (\x y -> NotM $ Pi Nothing NotHidden (freeIn 0 y) y (Abs NoId x)) mytype restargs htyp = negtype ee mytype' sctx = (Id "h", closify htyp) : map (\x -> (NoId, closify x)) modargs ntt = closify (NotM $ App Nothing (NotM OKVal) (Const ee) (NotM ALNil))@@ -215,7 +230,7 @@ rsols <- liftM reverse $ liftIO $ readIORef sols if null rsols then do nsol' <- liftIO $ readIORef nsol- dispmsg $ insuffsols (pick + numsols - nsol')+ stopWithMsg $ insuffsols (pick + numsols - nsol') else do aexprss <- mapM getsols rsols cexprss <- forM aexprss $ mapM $ \(mi, e) -> do@@ -226,11 +241,11 @@ disp [(_, cexpr)] = ss cexpr disp cexprs = concat $ map (\ (mi, cexpr) -> ss cexpr ++ " ") cexprs ticks <- liftIO $ readIORef ticks- dispmsg $ unlines $+ stopWithMsg $ unlines $ ("Listing disproof(s) " ++ show pick ++ "-" ++ show (pick + length rsols - 1)) : for (zip cexprss [pick..]) (\ (x, y) -> show y ++ " " ++ disp x)- _ -> dispmsg "Metavariable dependencies not allowed in disprove mode"- _ -> dispmsg "Metavariable dependencies not allowed in disprove mode"+ _ -> stopWithMsg "Metavariable dependencies not allowed in disprove mode"+ _ -> stopWithMsg "Metavariable dependencies not allowed in disprove mode" else do (recinfo, defdfv) <- case thisdefinfo of@@ -269,7 +284,7 @@ rsols <- liftM reverse $ liftIO $ readIORef sols if null rsols then do nsol' <- liftIO $ readIORef nsol- dispmsg $ insuffsols (pick + numsols - nsol') ++ timeoutString+ stopWithMsg $ insuffsols (pick + numsols - nsol') ++ timeoutString else do aexprss <- mapM getsols rsols -- cexprss <- mapM (mapM (\(mi, e) -> lookupMeta mi >>= \mv -> withMetaInfo (getMetaInfo mv) $ abstractToConcrete_ e >>= \e' -> return (mi, e'))) aexprss@@ -284,20 +299,20 @@ maybe (show mi) show (lookup mi riis) ++ " := " ++ show cexpr ++ " " ticks <- liftIO $ readIORef ticks- dispmsg $ "Listing solution(s) " ++ show pick ++ "-" ++ show (pick + length rsols - 1) ++ timeoutString +++ stopWithMsg $ "Listing solution(s) " ++ show pick ++ "-" ++ show (pick + length rsols - 1) ++ timeoutString ++ "\n" ++ unlines (map (\(x, y) -> show y ++ " " ++ disp x) $ zip cexprss [pick..]) else {- not listmode -} case res of Nothing -> do nsol' <- liftIO $ readIORef nsol- dispmsg $ insuffsols (pick + numsols - nsol') ++ timeoutString+ stopWithMsg $ insuffsols (pick + numsols - nsol') ++ timeoutString Just depthreached -> do ticks <- liftIO $ readIORef ticks rsols <- liftIO $ readIORef sols case rsols of [] -> do nsol' <- liftIO $ readIORef nsol- dispmsg $ insuffsols (pick + numsols - nsol')+ stopWithMsg $ insuffsols (pick + numsols - nsol') terms -> loop terms where -- Andreas, 2015-05-17 Issue 1504 -- If giving a solution failed (e.g. ill-typed)@@ -305,7 +320,8 @@ -- However, currently @terms@ is always a singleton list. -- Thus, the following @loop@ is not doing something very -- meaningful.- loop [] = return (Left [], Just "")+ loop :: [[I.Term]] -> TCM AutoResult+ loop [] = return $ AutoResult (Solutions []) (Just "") loop (term : terms') = do -- On exception, try next solution flip catchError (const $ loop terms') $ do@@ -316,10 +332,10 @@ case lookup mi riis of Nothing -> -- catchError- (giveExpr Nothing mi expr >> return (Nothing, Nothing))+ (giveExpr WithoutForce Nothing mi expr >> return (Nothing, Nothing)) -- (const retry) -- (\_ -> return (Nothing, Just ("Failed to give expr for side solution of " ++ show mi)))- Just ii' -> do ae <- give ii' Nothing expr+ Just ii' -> do ae <- give WithoutForce ii' Nothing expr mv <- lookupMeta mi let scope = getMetaScope mv ce <- abstractToConcreteEnv (makeEnv scope) ae@@ -337,10 +353,8 @@ if mi' == mi then "" else (" " ++ case lookup mi' riis of {Nothing -> show mi'; Just ii -> show ii}) ) exprs let msgs = catMaybes $ msg : map snd giveress- msg' = case msgs of- [] -> Nothing- _ -> Just $ unlines msgs- return (Left $ catMaybes $ map fst giveress, msg')+ msg' = unlines msgs <$ guard (not $ null msgs)+ return $ AutoResult (Solutions $ catMaybes $ map fst giveress) msg' MCaseSplit -> do case thisdefinfo of@@ -353,7 +367,7 @@ let [rectyp'] = mymrectyp defdfv <- getdfv mi def myrecdef <- liftIO $ newIORef $ ConstDef {cdname = "", cdorigin = (Nothing, def), cdtype = rectyp', cdcont = Postulate, cddeffreevars = defdfv}- sols <- liftIO $ System.Timeout.timeout (timeout * 1000000) (+ sols <- liftIO $ System.Timeout.timeout (getTimeOut timeout * 1000000) ( let r d = do sols <- liftIO $ caseSplitSearch ticks __IMPOSSIBLE__ myhints meqr __IMPOSSIBLE__ d myrecdef ctx mytype pats case sols of@@ -364,25 +378,25 @@ Just (cls : _) -> withInteractionId ii $ do cls' <- liftIO $ runExceptT (mapM frommyClause cls) case cls' of- Left{} -> dispmsg "No solution found"+ Left{} -> stopWithMsg "No solution found" Right cls' -> do- cls'' <- forM cls' $ \ (I.Clause _ tel ps body t catchall) -> do+ cls'' <- forM cls' $ \ (I.Clause _ _ tel ps body t catchall reachable) -> do withCurrentModule (AN.qnameModule def) $ do -- Normalise the dot patterns ps <- addContext tel $ normalise ps body <- etaContract body- liftM modifyAbstractClause $ inTopContext $ reify $ AN.QNamed def $ I.Clause noRange tel ps body t catchall+ liftM modifyAbstractClause $ inTopContext $ reify $ AN.QNamed def $ I.Clause noRange noRange tel ps body t catchall reachable moduleTel <- lookupSection (AN.qnameModule def) pcs <- withInteractionId ii $ inTopContext $ addContext moduleTel $ mapM prettyA cls'' ticks <- liftIO $ readIORef ticks - return (Right $ Left (map (insertAbsurdPattern . PP.renderStyle (PP.style { PP.mode = PP.OneLineMode })) pcs), Nothing)+ return $ AutoResult (FunClauses $ map (insertAbsurdPattern . PP.renderStyle (PP.style { PP.mode = PP.OneLineMode })) pcs) Nothing - Just [] -> dispmsg "No solution found" -- case not possible at the moment because case split doesnt care about search exhaustiveness- Nothing -> dispmsg $ "No solution found at time out (" ++ show timeout ++ "s)"- _ -> dispmsg "Metavariable dependencies not allowed in case split mode"- _ -> dispmsg "Metavariable is not at top level of clause RHS"+ Just [] -> stopWithMsg "No solution found" -- case not possible at the moment because case split doesnt care about search exhaustiveness+ Nothing -> stopWithMsg $ "No solution found at time out (" ++ show timeout ++ "s)"+ _ -> stopWithMsg "Metavariable dependencies not allowed in case split mode"+ _ -> stopWithMsg "Metavariable is not at top level of clause RHS" MRefine listmode -> do mv <- lookupMeta mi@@ -431,32 +445,31 @@ Just score -> Just (show cn, score) ) modnames - let sorthits = sortBy (\(_, (pa1, pb1)) (_, (pa2, pb2)) -> case compare pa2 pa1 of {EQ -> compare pb1 pb2; o -> o}) hits+ let sorthits = List.sortBy (\(_, (pa1, pb1)) (_, (pa2, pb2)) -> case compare pa2 pa1 of {EQ -> compare pb1 pb2; o -> o}) hits if listmode || pick == (-1) then let pick' = max 0 pick in if pick' >= length sorthits then- dispmsg $ insuffcands $ length sorthits+ stopWithMsg $ insuffcands $ length sorthits else let showhits = take 10 $ drop pick' sorthits- in dispmsg $ "Listing candidate(s) " ++ show pick' ++ "-" ++ show (pick' + length showhits - 1) ++ " (found " ++ show (length sorthits) ++ " in total)\n" +++ in stopWithMsg $ "Listing candidate(s) " ++ show pick' ++ "-" ++ show (pick' + length showhits - 1) ++ " (found " ++ show (length sorthits) ++ " in total)\n" ++ unlines (map (\(i, (cn, _)) -> show i ++ " " ++ cn) (zip [pick'..pick' + length showhits - 1] showhits)) else if pick >= length sorthits then- dispmsg $ insuffcands $ length sorthits+ stopWithMsg $ insuffcands $ length sorthits else- return (Right $ Right (fst $ sorthits !! pick), Nothing)+ return $ AutoResult (Refinement $ fst $ sorthits !! pick) Nothing where agsyinfo ticks = "" -- Get the functions and axioms defined in the same module as @def@.-autohints :: AutoHintMode -> I.MetaId -> Maybe AN.QName ->- TCM [(Bool, AN.QName)]+autohints :: AutoHintMode -> I.MetaId -> Maybe AN.QName -> TCM [Hint] autohints AHMModule mi (Just def) = do scope <- clScope . getMetaInfo <$> lookupMeta mi let names = Scope.nsNames $ Scope.everythingInScope scope qnames = map (Scope.anameName . head) $ Map.elems names modnames = filter (\n -> AN.qnameModule n == AN.qnameModule def && n /= def) qnames- map (False,) <$> do+ map (Hint False) <$> do (`filterM` modnames) $ \ n -> do c <- getConstInfo n case theDef c of@@ -467,48 +480,27 @@ autohints _ _ _ = return [] -insuffsols :: Int -> String-insuffsols 0 = "No solution found"-insuffsols n = "Only " ++ show n ++ " solution(s) found" -insuffcands :: Int -> String-insuffcands 0 = "No candidate found"-insuffcands n = "Only " ++ show n ++ " candidate(s) found" -data Mode = MNormal Bool Bool -- true if list mode, true if disprove-- | MCaseSplit-- | MRefine Bool -- true if list mode---data AutoHintMode = AHMNone- | AHMModule+-- | Names for the equality reasoning combinators+-- Empty if any of these names is not defined. -parseargs :: String -> ([String], Int, Int, Mode, AutoHintMode)-parseargs s =- let r ("-t" : timeout : ws) (_, pick, mode, hintmode) =- r ws (read timeout, pick, mode, hintmode)- r ("-s" : pick : ws) (timeout, _, mode, hintmode) =- r ws (timeout, read pick, mode, hintmode)+getEqCombinators :: InteractionId -> Range -> TCM [Hint]+getEqCombinators ii rng = do+ let eqCombinators = ["_≡_", "begin_", "_≡⟨_⟩_", "_∎", "sym", "cong"]+ raw <- mapM (parseExprIn ii rng) eqCombinators `catchError` const (pure [])+ return $ fromMaybe [] $ mapM getHeadAsHint raw +-- | Templates for error messages - r ("-l" : ws) (timeout, pick, MNormal _ disprove, hintmode) =- r ws (timeout, pick, MNormal True disprove, hintmode)- r ("-l" : ws) (timeout, pick, MRefine _, hintmode) =- r ws (timeout, pick, MRefine True, hintmode)- r ("-d" : ws) (timeout, pick, MNormal listmode _, hintmode) =- r ws (timeout, pick, MNormal listmode True, hintmode)- r ("-m" : ws) (timeout, pick, mode, _) =- r ws (timeout, pick, mode, AHMModule)+genericNotEnough :: String -> Int -> String+genericNotEnough str n = List.intercalate " " $ case n of+ 0 -> [ "No" , str, "found"]+ 1 -> [ "Only 1", str, "found" ]+ _ -> [ "Only", show n, str ++ "s", "found" ] - r ("-c" : ws) (timeout, pick, _, hintmode) =- r ws (timeout, pick, MCaseSplit, hintmode)+insuffsols :: Int -> String+insuffsols = genericNotEnough "solution" - r ("-r" : ws) (timeout, pick, _, hintmode) =- r ws (timeout, (-1), MRefine False, hintmode)- r (h : ws) x =- let (hints, timeout, pick, mode, hintmode) = r ws x- in (h : hints, timeout, pick, mode, hintmode)- r [] (x,y,z,w) = ([],x,y,z,w)- in r (words s) (5, 0, MNormal False False, AHMNone)+insuffcands :: Int -> String+insuffcands = genericNotEnough "candidate"
src/full/Agda/Auto/CaseSplit.hs view
@@ -1,12 +1,25 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE UndecidableInstances #-} module Agda.Auto.CaseSplit where +#if __GLASGOW_HASKELL__ <= 708+import Control.Applicative ( (<$>), (<*>), pure )+#endif+ import Data.IORef+import Data.Tuple (swap) import Data.List (findIndex, union)+import Data.Monoid ((<>), Sum(..))+import Data.Foldable (foldMap)+import qualified Data.Set as Set import qualified Data.IntMap as IntMap+import Control.Monad.State as St hiding (lift)+import Control.Monad.Reader as Rd hiding (lift)+import qualified Control.Monad.State as St+import Data.Function +import Agda.Syntax.Common (Hiding(..)) import Agda.Auto.NarrowingSearch import Agda.Auto.Syntax @@ -15,18 +28,19 @@ #include "undefined.h" import Agda.Utils.Impossible+import Agda.Utils.Monad (or2M) abspatvarname :: String abspatvarname = "\0absurdPattern" costCaseSplitVeryHigh, costCaseSplitHigh, costCaseSplitLow, costAddVarDepth- :: Nat+ :: Cost costCaseSplitVeryHigh = 10000 costCaseSplitHigh = 5000 costCaseSplitLow = 2000 costAddVarDepth = 1000 -data HI a = HI FMode a+data HI a = HI Hiding a drophid :: [HI a] -> [a] drophid = map (\(HI _ x) -> x)@@ -43,39 +57,33 @@ | CSOmittedArg type Sol o = [(CSCtx o, [CSPat o], Maybe (MExp o))] -caseSplitSearch :: forall o . IORef Int -> Int -> [ConstRef o] -> Maybe (EqReasoningConsts o) -> Int -> Int -> ConstRef o -> CSCtx o -> MExp o -> [CSPat o] -> IO [Sol o]+caseSplitSearch ::+ forall o . IORef Int -> Int -> [ConstRef o] ->+ Maybe (EqReasoningConsts o) -> Int -> Cost -> ConstRef o ->+ CSCtx o -> MExp o -> [CSPat o] -> IO [Sol o] caseSplitSearch ticks nsolwanted chints meqr depthinterval depth recdef ctx tt pats = do- let branchsearch depth ctx tt termcheckenv = do-+ let branchsearch :: Cost -> CSCtx o -> MExp o ->+ ([Nat], Nat, [Nat]) -> IO (Maybe (MExp o))+ branchsearch depth ctx tt termcheckenv = do nsol <- newIORef 1 m <- initMeta sol <- newIORef Nothing let trm = Meta m- hsol = do trm' <- expandExp trm--+ hsol = do trm' <- expandMetas trm writeIORef sol (Just trm')--- hpartsol = __IMPOSSIBLE__-- initcon = mpret $ Sidecondition (localTerminationSidecond termcheckenv recdef trm)- (-- (case meqr of- Nothing -> id- Just eqr -> mpret . Sidecondition (calcEqRState eqr trm)- )-- (tcSearch False (map (\(id, t) -> (id, closify t)) (drophid ctx)) (closify tt) trm)- )+ initcon = mpret+ $ Sidecondition+ (localTerminationSidecond termcheckenv recdef trm)+ $ (case meqr of+ Nothing -> id+ Just eqr -> mpret . Sidecondition (calcEqRState eqr trm)+ ) $ tcSearch False (map (fmap closify) (drophid ctx))+ (closify tt) trm recdefd <- readIORef recdef- let env = RIEnv {rieHints = (recdef, HMRecCall) : map (\x -> (x, HMNormal)) chints,- rieDefFreeVars = cddeffreevars recdefd-- , rieEqReasoningConsts = meqr-+ let env = RIEnv { rieHints = (recdef, HMRecCall) : map (, HMNormal) chints+ , rieDefFreeVars = cddeffreevars recdefd+ , rieEqReasoningConsts = meqr } depreached <- topSearch ticks nsol hsol env initcon depth (depth + 1) rsol <- readIORef sol@@ -85,13 +93,15 @@ ff n (HI hid (id, t) : ctx) = HI hid (id, lift n t) : ff (n + 1) ctx caseSplitSearch' branchsearch depthinterval depth recdef ctx' tt pats -caseSplitSearch' :: forall o . (Int -> CSCtx o -> MExp o -> ([Nat], Nat, [Nat]) -> IO (Maybe (MExp o))) -> Int -> Int -> ConstRef o -> CSCtx o -> MExp o -> [CSPat o] -> IO [Sol o]+caseSplitSearch' :: forall o .+ (Cost -> CSCtx o -> MExp o -> ([Nat], Nat, [Nat]) -> IO (Maybe (MExp o))) ->+ Int -> Cost -> ConstRef o -> CSCtx o -> MExp o -> [CSPat o] -> IO [Sol o] caseSplitSearch' branchsearch depthinterval depth recdef ctx tt pats = do recdefd <- readIORef recdef sols <- rc depth (cddeffreevars recdefd) ctx tt pats return sols where- rc :: Int -> Int -> CSCtx o -> MExp o -> [CSPat o] -> IO [Sol o]+ rc :: Cost -> Int -> CSCtx o -> MExp o -> [CSPat o] -> IO [Sol o] rc depth _ _ _ _ | depth < 0 = return [] rc depth nscrutavoid ctx tt pats = do @@ -107,7 +117,8 @@ case sols1 of (_:_) -> return sols1 [] -> do- let r [] = return []+ let r :: [Nat] -> IO [Sol o]+ r [] = return [] r (v:vs) = do sols2 <- splitvar mblkvar v case sols2 of@@ -128,7 +139,7 @@ splitvar :: [Nat] -> Nat -> IO [Sol o] splitvar mblkvar scrut = do let scruttype = infertypevar ctx scrut- case rm scruttype of+ case rm __IMPOSSIBLE__ scruttype of App _ _ (Const c) _ -> do cd <- readIORef c case cdcont cd of@@ -139,7 +150,7 @@ case findperm (map snd (drophid ctx)) of Just perm -> let HI scrhid(_, scrt) = ctx !! scrut- ctx1 = take scrut ctx ++ (HI scrhid (stringToMyId abspatvarname, scrt)) : drop (scrut + 1) ctx+ ctx1 = take scrut ctx ++ (HI scrhid (Id abspatvarname, scrt)) : drop (scrut + 1) ctx (ctx', _, pats') = applyperm perm ctx1 tt ({-map (replacep scrut 1 CSAbsurd __IMPOSSIBLE__) -}pats) in [(ctx', pats', Nothing)] Nothing -> __IMPOSSIBLE__ -- no permutation found@@ -150,18 +161,18 @@ dobranches [] = return [[]] dobranches (con : cons) = do cond <- readIORef con- let ff t = case rm t of+ let ff t = case rm __IMPOSSIBLE__ t of Pi _ h _ it (Abs id ot) -> let (xs, inft) = ff ot- in ((Pair h (scrut + length xs), id, lift (scrut + length xs + 1) it) : xs, inft)+ in (((h, scrut + length xs), id, lift (scrut + length xs + 1) it) : xs, inft) _ -> ([], lift scrut t) (newvars, inftype) = ff (cdtype cond)- constrapp = mm $ App Nothing (mm OKVal) (Const con) (foldl (\xs (Pair h v, _, _) -> mm $ ALCons h (mm $ App Nothing (mm OKVal) (Var v) (mm ALNil)) xs) (mm ALNil) (reverse newvars))- pconstrapp = CSPatConApp con (map (\(Pair hid v, _, _) -> HI hid (CSPatVar v)) newvars)+ constrapp = NotM $ App Nothing (NotM OKVal) (Const con) (foldl (\xs ((h, v), _, _) -> NotM $ ALCons h (NotM $ App Nothing (NotM OKVal) (Var v) (NotM ALNil)) xs) (NotM ALNil) (reverse newvars))+ pconstrapp = CSPatConApp con (map (\((hid, v), _, _) -> HI hid (CSPatVar v)) newvars) thesub = replace scrut (length newvars) constrapp Id newvarprefix = fst $ (drophid ctx) !! scrut ctx1 = map (\(HI hid (id, t)) -> HI hid (id, thesub t)) (take scrut ctx) ++- reverse (map (\((Pair hid _, id, t), i) ->+ reverse (map (\(((hid, _), id, t), i) -> HI hid (Id (case id of {NoId -> newvarprefix{- ++ show i-}; Id id -> id}), t) ) (zip newvars [0..])) ++ map (\(HI hid (id, t)) -> HI hid (id, thesub t)) (drop (scrut + 1) ctx)@@ -180,12 +191,15 @@ let (ctx2, tt2, pats2) = removevar ctx1 tt' pats' unif --cost = if elem scrut mblkvar then costCaseSplit - (costCaseSplit - costCaseSplitFollow) `div` (length mblkvar) else costCaseSplit cost = if null mblkvar then- if scrut < length ctx - nscrutavoid && nothid then costCaseSplitLow + costAddVarDepth * depthofvar scrut pats else costCaseSplitVeryHigh+ if scrut < length ctx - nscrutavoid && nothid+ then costCaseSplitLow + costAddVarDepth+ * Cost (depthofvar scrut pats)+ else costCaseSplitVeryHigh else if elem scrut mblkvar then costCaseSplitLow else (if scrut < length ctx - nscrutavoid && nothid then costCaseSplitHigh else costCaseSplitVeryHigh) nothid = let HI hid _ = ctx !! scrut- in case hid of {Hidden -> False; Instance -> False; NotHidden -> True}+ in hid == NotHidden sols <- rc (depth - cost) (length ctx - 1 - scrut) ctx2 tt2 pats2@@ -199,72 +213,73 @@ infertypevar :: CSCtx o -> Nat -> MExp o infertypevar ctx v = snd $ (drophid ctx) !! v-replace :: Nat -> Nat -> MExp o -> MExp o -> MExp o-replace sv nnew re = r 0- where- r n e =- case rm e of- App uid ok elr@(Var v) args ->- if v >= n then- if v - n == sv then- betareduce (lift n re) (rs n args)- else- if v - n > sv then- mm $ App uid ok (Var (v + nnew - 1)) (rs n args)- else- mm $ App uid ok elr (rs n args)- else- mm $ App uid ok elr (rs n args)- App uid ok elr@(Const _) args ->- mm $ App uid ok elr (rs n args)- Lam hid (Abs mid e) -> mm $ Lam hid (Abs mid (r (n + 1) e))- Pi uid hid possdep it (Abs mid ot) -> mm $ Pi uid hid possdep (r n it) (Abs mid (r (n + 1) ot))- Sort{} -> e - AbsurdLambda{} -> e+class Replace o t u | t u -> o where+ replace' :: Nat -> MExp o -> t -> Reader (Nat, Nat) u +replace :: Replace o t u => Nat -> Nat -> MExp o -> t -> u+replace sv nnew e t = replace' 0 e t `runReader` (sv, nnew) - rs n es =- case rm es of- ALNil -> mm $ ALNil- ALCons hid a as -> mm $ ALCons hid (r n a) (rs n as)+instance Replace o t u => Replace o (Abs t) (Abs u) where+ replace' n re (Abs mid b) = Abs mid <$> replace' (n + 1) re b - ALProj{} -> __IMPOSSIBLE__+instance Replace o (Exp o) (MExp o) where+ replace' n re e = case e of+ App uid ok elr@(Var v) args -> do+ ih <- NotM <$> replace' n re args+ (sv, nnew) <- ask+ return $+ if v >= n+ then if v - n == sv+ then betareduce (lift n re) ih+ else if v - n > sv+ then NotM $ App uid ok (Var (v + nnew - 1)) ih+ else NotM $ App uid ok elr ih+ else NotM $ App uid ok elr ih+ App uid ok elr@Const{} args ->+ NotM . App uid ok elr . NotM <$> replace' n re args+ Lam hid b -> NotM . Lam hid <$> replace' (n + 1) re b+ Pi uid hid possdep it b ->+ fmap NotM $ Pi uid hid possdep <$> replace' n re it <*> replace' n re b+ Sort{} -> return $ NotM e+ AbsurdLambda{} -> return $ NotM e +instance Replace o t u => Replace o (MM t (RefInfo o)) u where+ replace' n re = replace' n re . rm __IMPOSSIBLE__ - ALConPar as -> mm $ ALConPar (rs n as)+instance Replace o (ArgList o) (ArgList o) where+ replace' n re args = case args of+ ALNil -> return ALNil+ ALCons hid a as ->+ ALCons hid <$> replace' n re a <*> (NotM <$> replace' n re as)+ ALProj{} -> __IMPOSSIBLE__+ ALConPar as -> ALConPar . NotM <$> replace' n re as betareduce :: MExp o -> MArgList o -> MExp o-betareduce e args = case rm args of+betareduce e args = case rm __IMPOSSIBLE__ args of ALNil -> e- ALCons _ a rargs -> case rm e of- App uid ok elr eargs -> mm $ App uid ok elr (concatargs eargs args)+ ALCons _ a rargs -> case rm __IMPOSSIBLE__ e of+ App uid ok elr eargs -> NotM $ App uid ok elr (concatargs eargs args) Lam _ (Abs _ b) -> betareduce (replace 0 0 a b) rargs _ -> __IMPOSSIBLE__ -- not type correct if this happens- ALProj{} -> __IMPOSSIBLE__- ALConPar as -> __IMPOSSIBLE__ -concatargs :: MM (ArgList o) (RefInfo o) -> MArgList o -> MArgList o-concatargs xs ys = case rm xs of+concatargs :: MArgList o -> MArgList o -> MArgList o+concatargs xs ys = case rm __IMPOSSIBLE__ xs of ALNil -> ys - ALCons hid x xs -> mm $ ALCons hid x (concatargs xs ys)+ ALCons hid x xs -> NotM $ ALCons hid x (concatargs xs ys) ALProj{} -> __IMPOSSIBLE__ - ALConPar as -> mm $ ALConPar (concatargs xs ys)--eqelr :: Elr o -> Elr o -> Bool-eqelr (Var v1) (Var v2) = v1 == v2-eqelr (Const c1) (Const c2) = c1 == c2-eqelr _ _ = False+ ALConPar as -> NotM $ ALConPar (concatargs xs ys) -replacep :: Nat -> Nat -> CSPatI o -> MExp o -> CSPat o -> CSPat o+replacep :: forall o. Nat -> Nat -> CSPatI o -> MExp o -> CSPat o -> CSPat o replacep sv nnew rp re = r where+ r :: CSPat o -> CSPat o r (HI hid (CSPatConApp c ps)) = HI hid (CSPatConApp c (map r ps)) r (HI hid (CSPatVar v)) = if v == sv then HI hid rp@@ -279,76 +294,140 @@ r _ = __IMPOSSIBLE__ -- other constructors dont appear in indata Pats -rm :: MM a b -> a-rm (NotM x) = x-rm (Meta{}) = __IMPOSSIBLE__ -mm :: a -> MM a b-mm = NotM -unifyexp :: MExp o -> MExp o -> Maybe [(Nat, MExp o)]-unifyexp e1 e2 = r e1 e2 (\unif -> Just unif) []- where- r e1 e2 cont unif = case (rm e1, rm e2) of- (App _ _ elr1 args1, App _ _ elr2 args2) | eqelr elr1 elr2 -> rs args1 args2 cont unif- (Lam hid1 (Abs _ b1), Lam hid2 (Abs _ b2)) | hid1 == hid2 -> r b1 b2 cont unif- (Pi _ hid1 _ it1 (Abs _ ot1), Pi _ hid2 _ it2 (Abs _ ot2)) | hid1 == hid2 -> r it1 it2 (r ot1 ot2 cont) unif- (Sort _, Sort _) -> cont unif -- a bit sloppy- (App _ _ (Var v) (NotM ALNil), App _ _ (Var u) (NotM ALNil))- | v == u -> cont unif+-- Unification takes two values of the same type and generates a list+-- of assignments making the two terms equal.++type Assignments o = [(Nat, Exp o)]++class Unify o t | t -> o where+ unify' :: t -> t -> StateT (Assignments o) Maybe ()+ notequal' :: t -> t -> ReaderT (Nat, Nat) (StateT (Assignments o) IO) Bool++unify :: Unify o t => t -> t -> Maybe (Assignments o)+unify t u = unify' t u `execStateT` []++notequal :: Unify o t => Nat -> Nat -> t -> t -> IO Bool+notequal fstnew nbnew t1 t2 = notequal' t1 t2 `runReaderT` (fstnew, nbnew)+ `evalStateT` []++instance Unify o t => Unify o (MM t (RefInfo o)) where+ unify' = unify' `on` rm __IMPOSSIBLE__++ notequal' = notequal' `on` rm __IMPOSSIBLE__++unifyVar :: Nat -> Exp o -> StateT (Assignments o) Maybe ()+unifyVar v e = do+ unif <- get+ case lookup v unif of+ Nothing -> modify ((v, e) :)+ Just e' -> unify' e e'++instance Unify o t => Unify o (Abs t) where+ unify' (Abs _ b1) (Abs _ b2) = unify' b1 b2++ notequal' (Abs _ b1) (Abs _ b2) = notequal' b1 b2++instance Unify o (Exp o) where+ unify' e1 e2 = case (e1, e2) of+ (App _ _ elr1 args1, App _ _ elr2 args2) | elr1 == elr2 -> unify' args1 args2+ (Lam hid1 b1, Lam hid2 b2) | hid1 == hid2 -> unify' b1 b2+ (Pi _ hid1 _ a1 b1, Pi _ hid2 _ a2 b2) | hid1 == hid2 -> unify' a1 a2+ >> unify' b1 b2+ (Sort _, Sort _) -> return () -- a bit sloppy (App _ _ (Var v) (NotM ALNil), _)- | elem v (freevars e2) -> Nothing -- Occurs check+ | elem v (freevars e2) -> St.lift Nothing -- Occurs check (_, App _ _ (Var v) (NotM ALNil))- | elem v (freevars e1) -> Nothing -- Occurs check- (App _ _ (Var v) (NotM ALNil), _) ->- case lookup v unif of- Nothing -> cont ((v, e2) : unif)- Just e1' -> r e1' e2 cont unif- (_, App _ _ (Var v) (NotM ALNil)) ->- case lookup v unif of- Nothing -> cont ((v, e1) : unif)- Just e2' -> r e1 e2' cont unif- _ -> Nothing- rs args1 args2 cont unif = case (rm args1, rm args2) of- (ALNil, ALNil) -> cont unif- (ALCons hid1 a1 as1, ALCons hid2 a2 as2) | hid1 == hid2 -> r a1 a2 (rs as1 as2 cont) unif- (ALConPar as1, ALCons _ _ as2) -> rs as1 as2 cont unif- (ALCons _ _ as1, ALConPar as2) -> rs as1 as2 cont unif- (ALConPar as1, ALConPar as2) -> rs as1 as2 cont unif- _ -> Nothing+ | elem v (freevars e1) -> St.lift Nothing -- Occurs check+ (App _ _ (Var v) (NotM ALNil), _) -> unifyVar v e2+ (_, App _ _ (Var v) (NotM ALNil)) -> unifyVar v e1+ _ -> St.lift Nothing -lift :: Nat -> MExp o -> MExp o-lift 0 = id-lift n = r 0- where- r j e =- case rm e of- App uid ok elr args -> case elr of- Var v | v >= j -> mm $ App uid ok (Var (v + n)) (rs j args)- _ -> mm $ App uid ok elr (rs j args)- Lam hid (Abs mid e) -> mm $ Lam hid (Abs mid (r (j + 1) e))- Pi uid hid possdep it (Abs mid ot) -> mm $ Pi uid hid possdep (r j it) (Abs mid (r (j + 1) ot))- Sort{} -> e+ notequal' e1 e2 = do+ (fstnew, nbnew) <- ask+ unifier <- get+ case (e1, e2) of+ (App _ _ elr1 es1, App _ _ elr2 es2) | elr1 == elr2 -> notequal' es1 es2+ (_, App _ _ (Var v2) (NotM ALNil)) -- why is this not symmetric?!+ | fstnew <= v2 && v2 < fstnew + nbnew ->+ case lookup v2 unifier of+ Nothing -> modify ((v2, e1):) >> return False+ Just e2' -> notequal' e1 e2'+{-+ GA: Skipped these: Not sure why we'd claim they're impossible+ (_, App _ _ (Var v2) (NotM ALProj{})) -> __IMPOSSIBLE__+ (_, App _ _ (Var v2) (NotM ALConPar{})) -> __IMPOSSIBLE__+-}+ (App _ _ (Const c1) es1, App _ _ (Const c2) es2) -> do+ cd1 <- liftIO $ readIORef c1+ cd2 <- liftIO $ readIORef c2+ case (cdcont cd1, cdcont cd2) of+ (Constructor{}, Constructor{}) -> if c1 == c2 then notequal' es1 es2+ else return True+ _ -> return False+{- GA: Why don't we have a case for distinct heads after all these+ unification cases for vars with no spines & metas that can+ be looked up?+ (App _ _ elr1 _, App _ _ elr2 _) | elr1 <> elr2 -> return True+-}+ _ -> return False - AbsurdLambda{} -> e+instance Unify o (ArgList o) where+ unify' args1 args2 = case (args1, args2) of+ (ALNil, ALNil) -> pure ()+ (ALCons hid1 a1 as1, ALCons hid2 a2 as2) | hid1 == hid2 -> unify' a1 a2+ >> unify' as1 as2+ (ALConPar as1, ALCons _ _ as2) -> unify' as1 as2+ (ALCons _ _ as1, ALConPar as2) -> unify' as1 as2+ (ALConPar as1, ALConPar as2) -> unify' as1 as2+ _ -> St.lift Nothing + notequal' args1 args2 = case (args1, args2) of+ (ALCons _ e es, ALCons _ f fs) -> notequal' e f `or2M` notequal' es fs+ (ALConPar es1, ALConPar es2) -> notequal' es1 es2+ _ -> return False - rs j es =- case rm es of- ALNil -> mm $ ALNil- ALCons hid a as -> mm $ ALCons hid (r j a) (rs j as)+-- This definition is only here to respect the previous interface.+unifyexp :: MExp o -> MExp o -> Maybe ([(Nat, MExp o)])+unifyexp e1 e2 = fmap (NotM <$>) <$> unify e1 e2 - ALProj{} -> __IMPOSSIBLE__+class Lift t where+ lift' :: Nat -> Nat -> t -> t +lift :: Lift t => Nat -> t -> t+lift 0 = id+lift n = lift' n 0 - ALConPar as -> mm $ ALConPar (rs j as)+instance Lift t => Lift (Abs t) where+ lift' n j (Abs mid b) = Abs mid (lift' n (j + 1) b) +instance Lift t => Lift (MM t r) where+ lift' n j = NotM . lift' n j . rm __IMPOSSIBLE__ +instance Lift (Exp o) where+ lift' n j e = case e of+ App uid ok elr args -> case elr of+ Var v | v >= j -> App uid ok (Var (v + n)) (lift' n j args)+ _ -> App uid ok elr (lift' n j args)+ Lam hid b -> Lam hid (lift' n j b)+ Pi uid hid possdep it b -> Pi uid hid possdep (lift' n j it) (lift' n j b)+ Sort{} -> e+ AbsurdLambda{} -> e++instance Lift (ArgList o) where+ lift' n j args = case args of+ ALNil -> ALNil+ ALCons hid a as -> ALCons hid (lift' n j a) (lift' n j as)+ ALProj{} -> __IMPOSSIBLE__+ ALConPar as -> ALConPar (lift' n j as)++ removevar :: CSCtx o -> MExp o -> [CSPat o] -> [(Nat, MExp o)] -> (CSCtx o, MExp o, [CSPat o]) removevar ctx tt pats [] = (ctx, tt, pats) removevar ctx tt pats ((v, e) : unif) = let- e2 = replace v 0 (__IMPOSSIBLE__ {- occurs check failed -}) e+ e2 = replace v 0 __IMPOSSIBLE__ {- occurs check failed -} e thesub = replace v 0 e2 ctx1 = map (\(HI hid (id, t)) -> HI hid (id, thesub t)) (take v ctx) ++ map (\(HI hid (id, t)) -> HI hid (id, thesub t)) (drop (v + 1) ctx)@@ -358,84 +437,26 @@ in removevar ctx1 tt' pats' unif' -notequal :: Nat -> Nat -> MExp o -> MExp o -> IO Bool-notequal firstnew nnew e1 e2 =- case (rm e1, rm e2) of- (App _ _ _ es1, App _ _ _ es2) -> rs es1 es2 (\_ -> return False) []- _ -> __IMPOSSIBLE__- where- rs :: MArgList o -> MArgList o -> ([(Nat, MExp o)] -> IO Bool) -> [(Nat, MExp o)] -> IO Bool- rs es1 es2 cont unifier2 =- case (rm es1, rm es2) of- (ALCons _ e1 es1, ALCons _ e2 es2) -> r e1 e2 (rs es1 es2 cont) unifier2-- (ALConPar es1, ALConPar es2) -> rs es1 es2 cont unifier2-- _ -> cont unifier2-- r :: MExp o -> MExp o -> ([(Nat, MExp o)] -> IO Bool) -> [(Nat, MExp o)] -> IO Bool- r e1 e2 cont unifier2 = case rm e2 of- App _ _ (Var v2) es2 | firstnew <= v2 && v2 < firstnew + nnew ->- case rm es2 of- ALNil ->- case lookup v2 unifier2 of- Nothing -> cont ((v2, e1) : unifier2)- Just e2' -> cc e1 e2'- ALCons{} -> cont unifier2-- ALProj{} -> __IMPOSSIBLE__--- ALConPar{} -> __IMPOSSIBLE__-- _ -> cc e1 e2- where- cc e1 e2 = case (rm e1, rm e2) of- (App _ _ (Const c1) es1, App _ _ (Const c2) es2) -> do- cd1 <- readIORef c1- cd2 <- readIORef c2- case (cdcont cd1, cdcont cd2) of- (Constructor{}, Constructor{}) ->- if c1 == c2 then- rs es1 es2 cont unifier2- else- return True- _ -> cont unifier2- _ -> cont unifier2- findperm :: [MExp o] -> Maybe [Nat] findperm ts = let frees = map freevars ts- m = IntMap.fromList (map (\i -> (i, length (filter (elem i) frees))) [0..length ts - 1])+ m = IntMap.fromList $+ map (\i -> (i, length (filter (elem i) frees)))+ [0..length ts - 1] r _ perm 0 = Just $ reverse perm r m perm n =- case lookup 0 (map (\(x,y) -> (y,x)) (IntMap.toList m)) of+ case lookup 0 (map swap (IntMap.toList m)) of Nothing -> Nothing- Just i -> r (foldl (\m i -> IntMap.adjust (\x -> x - 1) i m) (IntMap.insert i (-1) m) (frees !! i)) (i : perm) (n - 1)+ Just i -> r (foldl (flip $ IntMap.adjust (subtract 1))+ (IntMap.insert i (-1) m)+ (frees !! i))+ (i : perm) (n - 1) in r m [] (length ts) -freevars :: MExp o -> [Nat]-freevars = f 0- where- f n e = case rm e of- App _ _ (Var v) args -> union [v - n] (fs n args)- App _ _ (Const _) args -> fs n args- Lam _ (Abs _ b) -> f (n + 1) b- Pi _ _ _ it (Abs _ ot) -> union (f n it) (f (n + 1) ot)- Sort{} -> [] - AbsurdLambda{} -> []--- fs n es = case rm es of- ALNil -> []- ALCons _ e es -> union (f n e) (fs n es)-- ALProj{} -> __IMPOSSIBLE__--- ALConPar es -> fs n es+freevars :: FreeVars t => t -> [Nat]+freevars = Set.toList . freeVars applyperm :: [Nat] -> CSCtx o -> MExp o -> [CSPat o] -> (CSCtx o, MExp o, [CSPat o])@@ -444,48 +465,22 @@ ctx2 = map (\i -> ctx1 !! i) perm ctx3 = seqctx ctx2 tt' = rename (ren perm) tt- pats' = map (renamep (ren perm)) pats+ pats' = map (rename (ren perm)) pats in (ctx3, tt', pats') ren :: [Nat] -> Nat -> Int ren n i = let Just j = findIndex (== i) n in j -rename :: (Nat -> Nat) -> MExp o -> MExp o-rename ren = r 0- where- r j e =- case rm e of- App uid ok elr args -> case elr of- Var v | v >= j -> mm $ App uid ok (Var (ren (v - j) + j)) (rs j args)- _ -> mm $ App uid ok elr (rs j args)- Lam hid (Abs mid e) -> mm $ Lam hid (Abs mid (r (j + 1) e))- Pi uid hid possdep it (Abs mid ot) -> mm $ Pi uid hid possdep (r j it) (Abs mid (r (j + 1) ot))- Sort{} -> e-- AbsurdLambda{} -> e--- rs j es =- case rm es of- ALNil -> mm $ ALNil- ALCons hid a as -> mm $ ALCons hid (r j a) (rs j as)-- ALProj{} -> __IMPOSSIBLE__--- ALConPar as -> mm $ ALConPar (rs j as)---renamep :: (Nat -> Nat) -> CSPat o -> CSPat o-renamep ren = r- where- r (HI hid (CSPatConApp c pats)) = HI hid (CSPatConApp c (map r pats))- r (HI hid (CSPatVar i)) = HI hid (CSPatVar $ ren i)- r (HI hid (CSPatExp e)) = HI hid (CSPatExp $ rename ren e)-- r p@(HI _ CSOmittedArg) = p+instance Renaming t => Renaming (HI t) where+ renameOffset j ren (HI hid t) = HI hid $ renameOffset j ren t - r _ = __IMPOSSIBLE__+instance Renaming (CSPatI o) where+ renameOffset j ren e = case e of+ CSPatConApp c pats -> CSPatConApp c $ map (renameOffset j ren) pats+ CSPatVar i -> CSPatVar $ j + ren i+ CSPatExp e -> CSPatExp $ renameOffset j ren e+ CSOmittedArg -> e+ _ -> __IMPOSSIBLE__ seqctx :: CSCtx o -> CSCtx o seqctx = r (-1)@@ -503,49 +498,61 @@ in depth -- --------------------+-- | Speculation: Type class computing the size (?) of a pattern+-- and collecting the vars it introduces+class LocalTerminationEnv a where+ sizeAndBoundVars :: a -> (Sum Nat, [Nat]) -localTerminationEnv :: [CSPat o] -> ([Nat], Nat, [Nat])-localTerminationEnv pats =- let g _ [] = ([], 0, [])- g i (hp@(HI _ p) : ps) = case p of- CSPatConApp{} ->- let (size, vars) = h hp- (is, size', vars') = g (i + 1) ps- in (i : is, size + size', vars ++ vars')- _ -> g (i + 1) ps- h (HI _ p) = case p of- CSPatConApp c ps ->- let (size, vars) = hs ps- in (size + 1, vars)- CSPatVar n -> (0, [n])- CSPatExp e -> he e- _ -> (0, [])- hs [] = (0, [])- hs (p : ps) =- let (size, vars) = h p- (size', vars') = hs ps- in (size + size', vars ++ vars')- he e = case rm e of- App _ _ (Var v) _ -> (0, [v])- App _ _ (Const _) args ->- let (size, vars) = hes args- in (size + 1, vars)- _ -> (0, [])- hes as = case rm as of- ALNil -> (0, [])- ALCons _ a as ->- let (size, vars) = he a- (size', vars') = hes as- in (size + size', vars ++ vars')+instance LocalTerminationEnv a => LocalTerminationEnv (HI a) where+ sizeAndBoundVars (HI _ p) = sizeAndBoundVars p - ALProj{} -> __IMPOSSIBLE__+instance LocalTerminationEnv (CSPatI o) where+ sizeAndBoundVars p = case p of+ CSPatConApp _ ps -> (1, []) <> sizeAndBoundVars ps+ CSPatVar n -> (0, [n])+ CSPatExp e -> sizeAndBoundVars e+ _ -> (0, []) +instance LocalTerminationEnv a => LocalTerminationEnv [a] where+ sizeAndBoundVars = foldMap sizeAndBoundVars - ALConPar as -> hes as+instance LocalTerminationEnv (MExp o) where+-- sizeAndBoundVars e = case rm __IMPOSSIBLE__ e of+-- GA: 2017 06 27: Not actually impossible! (cf. #2620)+ sizeAndBoundVars Meta{} = (0, [])+-- Does this default behaviour even make sense? The catchall in the+-- following match seems to suggest it does+ sizeAndBoundVars (NotM e) = case e of+ App _ _ (Var v) _ -> (0, [v])+ App _ _ (Const _) args -> (1, []) <> sizeAndBoundVars args+ _ -> (0, []) - in g 0 pats+instance (LocalTerminationEnv a, LocalTerminationEnv b) => LocalTerminationEnv (a, b) where+ sizeAndBoundVars (a, b) = sizeAndBoundVars a <> sizeAndBoundVars b +instance LocalTerminationEnv (MArgList o) where+ sizeAndBoundVars as = case rm __IMPOSSIBLE__ as of+ ALNil -> (0, [])+ ALCons _ a as -> sizeAndBoundVars (a, as)+ ALProj{} -> __IMPOSSIBLE__+ ALConPar as -> sizeAndBoundVars as ++-- | Take a list of patterns and returns (is, size, vars) where (speculation):+--- * the is are the pattern indices the vars are contained in+-- * size is total number of constructors removed (?) to access vars+localTerminationEnv :: [CSPat o] -> ([Nat], Nat, [Nat])+localTerminationEnv pats = (is, getSum s, vs) where++ (is , s , vs) = g 0 pats++ g :: Nat -> [CSPat o] -> ([Nat], Sum Nat, [Nat])+ g _ [] = ([], 0, [])+ g i (hp@(HI _ p) : ps) = case p of+ CSPatConApp{} -> let (size, vars) = sizeAndBoundVars hp+ in ([i], size, vars) <> g (i + 1) ps+ _ -> g (i + 1) ps+ localTerminationSidecond :: ([Nat], Nat, [Nat]) -> ConstRef o -> MExp o -> EE (MyPB o) localTerminationSidecond (is, size, vars) reccallc b = ok b@@ -629,8 +636,8 @@ NotB (hntt, blks) <- hnn_blks (Clos [] tt) case f blks of Just v -> return [v]- Nothing -> case hntt of- HNApp _ (Const c) args -> do+ Nothing -> case rawValue hntt of+ HNApp (Const c) args -> do cd <- readIORef c case cdcont cd of Datatype{} -> g [] args@@ -638,8 +645,8 @@ _ -> return [] where f blks = case blks of- (_:_) -> case last blks of- HNApp _ (Var v) _ -> Just v+ (_:_) -> case rawValue (last blks) of+ HNApp (Var v) _ -> Just v _ -> Nothing _ -> Nothing g vs args = do
src/full/Agda/Auto/Convert.hs view
@@ -4,16 +4,17 @@ import Control.Applicative hiding (getConst, Const(..)) import Data.IORef+import Data.Maybe (catMaybes) import Data.Map (Map) import qualified Data.Map as Map-import Data.Maybe import Data.Traversable (traverse) import Control.Monad.State +import Agda.Syntax.Common (Hiding(..), getHiding) import Agda.Syntax.Concrete (exprFieldA) import qualified Agda.Syntax.Internal as I import qualified Agda.Syntax.Internal.Pattern as IP-import qualified Agda.Syntax.Common as Common+import qualified Agda.Syntax.Common as Cm import qualified Agda.Syntax.Abstract.Name as AN import qualified Agda.Syntax.Abstract as A import qualified Agda.Syntax.Position as SP@@ -25,39 +26,39 @@ import Agda.TypeChecking.Monad.MetaVars (lookupMeta, withMetaInfo, lookupInteractionPoint) import Agda.TypeChecking.Monad.Context (getContextArgs) import Agda.TypeChecking.Monad.Constraints (getAllConstraints)-import Agda.TypeChecking.Substitute (piApply, applySubst, renamingR)+import Agda.TypeChecking.Substitute (applySubst, renamingR) import Agda.TypeChecking.Telescope (piApplyM) import qualified Agda.TypeChecking.Substitute as I (absBody)-import Agda.TypeChecking.Reduce (Normalise, normalise, instantiate)+import Agda.TypeChecking.Reduce (normalise, instantiate) import Agda.TypeChecking.EtaContract (etaContract) import Agda.TypeChecking.Monad.Builtin (constructorForm)-import Agda.TypeChecking.Free (freeIn)-import qualified Agda.Utils.HashMap as HMap+import Agda.TypeChecking.Free as Free (freeIn)+import Agda.TypeChecking.Errors ( stringTCErr ) import Agda.Interaction.MakeCase (getClauseForIP) import Agda.Auto.NarrowingSearch-import Agda.Auto.Syntax+import Agda.Auto.Syntax hiding (getConst) import Agda.Auto.CaseSplit hiding (lift) import Agda.Utils.Either-import Agda.Utils.Except- ( Error(strMsg)- , ExceptT- , MonadError(throwError)- )+import Agda.Utils.Except ( ExceptT , MonadError(throwError) ) import Agda.Utils.Lens+import Agda.Utils.Pretty ( prettyShow ) import Agda.Utils.Impossible #include "undefined.h" -norm :: Normalise t => t -> MB.TCM t-norm x = normalise x---norm x = return x+data Hint = Hint+ { hintIsConstructor :: Bool+ , hintQName :: I.QName+ } -type O = (Maybe Int, AN.QName) -- Nothing - Def, Just npar - Con with npar parameters which don't appear in Agda+type O = (Maybe Int, AN.QName)+ -- Nothing - Def+ -- Just npar - Con with npar parameters which don't appear in Agda data TMode = TMAll -- can be extended to distinguish between different modes (all, only def) deriving Eq@@ -83,8 +84,14 @@ } type TOM = StateT S MB.TCM+type MOT = ExceptT String IO -tomy :: I.MetaId -> [(Bool, AN.QName)] -> [I.Type] -> MB.TCM ([ConstRef O], [MExp O], Map I.MetaId (Metavar (Exp O) (RefInfo O), MExp O, [MExp O], [I.MetaId]), [(Bool, MExp O, MExp O)], Map AN.QName (TMode, ConstRef O))+tomy :: I.MetaId -> [Hint] -> [I.Type] ->+ MB.TCM ([ConstRef O]+ , [MExp O]+ , Map I.MetaId (Metavar (Exp O) (RefInfo O), MExp O, [MExp O], [I.MetaId])+ , [(Bool, MExp O, MExp O)]+ , Map AN.QName (TMode, ConstRef O)) tomy imi icns typs = do eqs <- getEqs let@@ -98,17 +105,17 @@ def <- lift $ getConstInfo cn let typ = MB.defType def defn = MB.theDef def- typ <- lift $ norm typ- typ' <- tomyType typ+ typ <- lift $ normalise typ+ typ' <- convert typ let clausesToDef clauses = do- clauses' <- tomyClauses clauses+ clauses' <- convert clauses let narg = case clauses of [] -> 0 I.Clause {I.namedClausePats = xs} : _ -> length xs return (Def narg clauses' Nothing Nothing, []) (cont, projfcns2) <- case defn of MB.Axiom {} -> return (Postulate, [])- MB.AbstractDefn -> return (Postulate, [])+ MB.AbstractDefn{} -> return (Postulate, []) MB.Function {MB.funClauses = clauses} -> clausesToDef clauses -- MB.Primitive {MB.primClauses = []} -> throwError $ strMsg "Auto: Primitive functions are not supported" -- Andreas, 2013-06-17 breaks interaction/AutoMisc MB.Primitive {MB.primClauses = clauses} -> clausesToDef clauses@@ -116,7 +123,7 @@ cons2 <- mapM (\con -> getConst True con TMAll) cons return (Datatype cons2 [], []) MB.Record {MB.recFields = fields, MB.recTel = tel} -> do -- the value of recPars seems unreliable or don't know what it signifies- let pars n (I.El _ (I.Pi it typ)) = Common.Arg (Common.domInfo it) (I.var n) :+ let pars n (I.El _ (I.Pi it typ)) = Cm.Arg (Cm.domInfo it) (I.var n) : pars (n - 1) (I.unAbs typ) pars n (I.El s (I.Shared p)) = pars n (I.El s (I.derefPtr p)) pars _ (I.El _ _) = []@@ -124,12 +131,12 @@ I.Def cn $ map I.Apply $ pars (npar - 1) typ contyp npar (I.ExtendTel it (I.Abs v tel)) = I.El (I.mkType 0 {- arbitrary -}) (I.Pi it (I.Abs v (contyp (npar + 1) tel))) contyp npar (I.ExtendTel it I.NoAbs{}) = __IMPOSSIBLE__- contyp' <- tomyType $ contyp 0 tel+ contyp' <- convert $ contyp 0 tel cc <- lift $ liftIO $ readIORef c let Datatype [con] [] = cdcont cc lift $ liftIO $ modifyIORef con (\cdef -> cdef {cdtype = contyp'}) - projfcns <- mapM (\name -> getConst False name TMAll) (map Common.unArg fields)+ projfcns <- mapM (\name -> getConst False name TMAll) (map Cm.unArg fields) return (Datatype [con] projfcns, []{-map snd fields-}) MB.Constructor {MB.conData = dt} -> do@@ -162,20 +169,20 @@ Nothing -> return () Just sol -> do m <- getMeta mi- sol' <- tomyExp sol+ sol' <- convert sol modify $ \s -> s {sEqs = (Map.insert (Map.size (fst $ sEqs s)) (Just (False, Meta m, sol')) (fst $ sEqs s), snd $ sEqs s)} let tt = MB.jMetaType $ mvJudgement mv minfo = getMetaInfo mv- localVars = map (snd . Common.unDom . ctxEntry) . envContext . clEnv $ minfo+ localVars = map (snd . Cm.unDom . ctxEntry) . envContext . clEnv $ minfo (targettype, localVars) <- lift $ withMetaInfo minfo $ do vs <- getContextArgs targettype <- tt `piApplyM` permute (takeP (length vs) $ mvPermutation mv) vs- targettype <- norm targettype- localVars <- mapM norm localVars+ targettype <- normalise targettype+ localVars <- mapM normalise localVars return (targettype, localVars) modify (\s -> s {sCurMeta = Just mi})- typ' <- tomyType targettype- ctx' <- mapM tomyType localVars+ typ' <- convert targettype+ ctx' <- mapM convert localVars modify (\s -> s {sCurMeta = Nothing}) modify (\s -> s {sMetas = (Map.adjust (\(m, _, deps) -> (m, Just (typ', ctx'), deps)) mi (fst $ sMetas s), snd $ sMetas s)}) r projfcns@@ -184,16 +191,16 @@ case nxt of Just eqi -> do let (ineq, e, i) = eqs !! eqi- e' <- tomyExp e- i' <- tomyExp i+ e' <- convert e+ i' <- convert i modify (\s -> s {sEqs = (Map.adjust (\_ -> Just (ineq, e', i')) eqi (fst $ sEqs s), snd $ sEqs s)}) r projfcns Nothing -> return projfcns ((icns', typs'), s) <- runStateT (do _ <- getMeta imi- icns' <- mapM (\(iscon, name) -> getConst iscon name TMAll) icns- typs' <- mapM tomyType typs+ icns' <- mapM (\ (Hint iscon name) -> getConst iscon name TMAll) icns+ typs' <- mapM convert typs projfcns <- r [] projfcns' <- mapM (\name -> getConst False name TMAll) projfcns [] <- r []@@ -227,8 +234,8 @@ mainm <- gets sMainMeta dfv <- lift $ getdfv mainm name let nomi = I.arity (MB.defType def)- ccon <- lift $ liftIO $ newIORef (ConstDef {cdname = show name ++ ".CONS", cdorigin = (Just nomi, conname), cdtype = __IMPOSSIBLE__, cdcont = Constructor (nomi - dfv), cddeffreevars = dfv}) -- ?? correct value of deffreevars for records?- c <- lift $ liftIO $ newIORef (ConstDef {cdname = show name, cdorigin = (Nothing, name), cdtype = __IMPOSSIBLE__, cdcont = Datatype [ccon] [], cddeffreevars = dfv}) -- ?? correct value of deffreevars for records?+ ccon <- lift $ liftIO $ newIORef (ConstDef {cdname = prettyShow name ++ ".CONS", cdorigin = (Just nomi, conname), cdtype = __IMPOSSIBLE__, cdcont = Constructor (nomi - dfv), cddeffreevars = dfv}) -- ?? correct value of deffreevars for records?+ c <- lift $ liftIO $ newIORef (ConstDef {cdname = prettyShow name, cdorigin = (Nothing, name), cdtype = __IMPOSSIBLE__, cdcont = Datatype [ccon] [], cddeffreevars = dfv}) -- ?? correct value of deffreevars for records? modify (\s -> s {sConsts = (Map.insert name (mode, c) cmap, name : snd (sConsts s))}) return $ if iscon then ccon else c _ -> do@@ -239,16 +246,16 @@ Nothing -> do (miscon, sname) <- if iscon then do let MB.Constructor {MB.conPars = npar, MB.conData = dname} = MB.theDef def- return (Just npar, show dname ++ "." ++ show (I.qnameName name))+ return (Just npar, prettyShow dname ++ "." ++ prettyShow (I.qnameName name)) else- return (Nothing, show name)+ return (Nothing, prettyShow name) mainm <- gets sMainMeta dfv <- lift $ getdfv mainm name c <- lift $ liftIO $ newIORef (ConstDef {cdname = sname, cdorigin = (miscon, name), cdtype = __IMPOSSIBLE__, cdcont = __IMPOSSIBLE__, cddeffreevars = dfv}) modify (\s -> s {sConsts = (Map.insert name (mode, c) cmap, name : snd (sConsts s))}) return c -getdfv :: I.MetaId -> A.QName -> MB.TCM Common.Nat+getdfv :: I.MetaId -> A.QName -> MB.TCM Cm.Nat getdfv mainm name = do mv <- lookupMeta mainm withMetaInfo (getMetaInfo mv) $ getDefFreeVars name@@ -268,7 +275,7 @@ getEqs = do eqs <- getAllConstraints let r = mapM (\eqc -> do- neqc <- norm eqc+ neqc <- normalise eqc case MB.clValue $ MB.theConstraint neqc of MB.ValueCmp ineq _ i e -> do ei <- etaContract i@@ -288,150 +295,115 @@ copatternsNotImplemented = MB.typeError $ MB.NotImplemented $ "The Agda synthesizer (Agsy) does not support copatterns yet" -tomyClauses :: [I.Clause] -> TOM [([Pat O], MExp O)]-tomyClauses [] = return []-tomyClauses (cl:cls) = do- cl' <- tomyClause cl- cls' <- tomyClauses cls- return $ case cl' of- Just cl' -> cl' : cls'- Nothing -> cls'+literalsNotImplemented :: MB.TCM a+literalsNotImplemented = MB.typeError $ MB.NotImplemented $+ "The Agda synthesizer (Agsy) does not support literals yet" -tomyClause :: I.Clause -> TOM (Maybe ([Pat O], MExp O))-tomyClause cl = do- let -- Jesper, 2016-07-28: I can't figure out if this should be the old or new+class Conversion m a b where+ convert :: a -> m b++instance Conversion TOM [I.Clause] [([Pat O], MExp O)] where+ convert = fmap catMaybes . mapM convert++instance Conversion TOM I.Clause (Maybe ([Pat O], MExp O)) where+ convert cl = do+ let -- Jesper, 2016-07-28:+ -- I can't figure out if this should be the old or new -- clause body (i.e. relative to the positions of pattern variables or -- relative to the clauseTel). Both options pass the test suite, so I -- have the impression it doesn't actually matter. -- ALTERNATIVE CODE: -- perm = fromMaybe __IMPOSSIBLE__ $ IP.clausePerm cl -- body = applySubst (renamingR perm) $ I.clauseBody cl- body = I.clauseBody cl- pats = I.clausePats cl- pats' <- mapM tomyPat $ IP.unnumberPatVars pats- body' <- traverse tomyExp =<< lift (norm body)- return $ case body' of- Just body' -> Just (pats', body')- Nothing -> Nothing--tomyPat :: Common.Arg I.Pattern -> TOM (Pat O)-tomyPat p = case Common.unArg p of- I.ProjP{} -> lift $ copatternsNotImplemented- I.VarP n -> return $ PatVar (show n)- I.DotP _ -> return $ PatVar "_" -- because Agda includes these when referring to variables in the body- I.ConP con _ pats -> do- let n = I.conName con- c <- getConst True n TMAll- pats' <- mapM (tomyPat . fmap Common.namedThing) pats- def <- lift $ getConstInfo n- cc <- lift $ liftIO $ readIORef c- let Just npar = fst $ cdorigin cc- return $ PatConApp c (replicate npar PatExp ++ pats')- I.LitP _ -> throwError $ strMsg "Auto: Literals in patterns are not supported"--weaken :: Int -> MExp O -> MExp O-weaken _ e@(Meta m) = e-weaken i (NotM e) =- case e of- App uid okh elr as ->- let elr' = case elr of- Var v -> if v >= i then Var (v + 1) else elr- Const{} -> elr- as' = weakens i as- in NotM $ App uid okh elr' as'- Lam hid (Abs mid t) ->- let t' = weaken (i + 1) t- in NotM $ Lam hid (Abs mid t')- Pi uid hid possdep x (Abs mid y) ->- let x' = weaken i x- y' = weaken (i + 1) y- in NotM $ Pi uid hid possdep x' (Abs mid y')- Sort{} -> NotM e-- AbsurdLambda{} -> NotM e---weakens :: Int -> MArgList O -> MArgList O-weakens _ as@(Meta m) = as-weakens i (NotM as) =- case as of- ALNil -> NotM as- ALCons hid x xs ->- let x' = weaken i x- xs' = weakens i xs- in NotM $ ALCons hid x' xs'-- ALProj{} -> __IMPOSSIBLE__+ body = I.clauseBody cl+ pats = I.clausePats cl+ pats' <- mapM convert (IP.unnumberPatVars pats :: [Cm.Arg I.Pattern])+ body' <- traverse convert =<< lift (normalise body)+ return $ (pats',) <$> body' - ALConPar xs ->- let xs' = weakens i xs- in NotM $ ALConPar xs'+instance Conversion TOM (Cm.Arg I.Pattern) (Pat O) where+ convert p = case Cm.unArg p of+ I.VarP n -> return $ PatVar (show n)+ I.DotP _ -> return $ PatVar "_"+ -- because Agda includes these when referring to variables in the body+ I.AbsurdP{} -> return $ PatVar I.absurdPatternName+ I.ConP con _ pats -> do+ let n = I.conName con+ c <- getConst True n TMAll+ pats' <- mapM (convert . fmap Cm.namedThing) pats+ def <- lift $ getConstInfo n+ cc <- lift $ liftIO $ readIORef c+ let Just npar = fst $ cdorigin cc+ return $ PatConApp c (replicate npar PatExp ++ pats') + -- UNSUPPORTED CASES+ I.ProjP{} -> lift copatternsNotImplemented+ I.LitP _ -> lift literalsNotImplemented -tomyType :: I.Type -> TOM (MExp O)-tomyType (I.El _ t) = tomyExp t -- sort info is thrown away+instance Conversion TOM I.Type (MExp O) where+ convert (I.El _ t) = convert t -- sort info is thrown away -tomyExp :: I.Term -> TOM (MExp O)-tomyExp v0 =- case I.unSpine v0 of- I.Var v es -> do- let Just as = I.allApplyElims es- as' <- tomyExps as- return $ NotM $ App Nothing (NotM OKVal) (Var v) as'- I.Lam info b -> do- b' <- tomyExp (I.absBody b)- return $ NotM $ Lam (cnvh info) (Abs (Id $ I.absName b) b')- t@I.Lit{} -> do- t <- lift $ constructorForm t- case t of- I.Lit{} -> throwError $ strMsg "Auto: Literals in terms are not supported"- _ -> tomyExp t- I.Level l -> tomyExp =<< lift (reallyUnLevelView l)- I.Def name es -> do- let Just as = I.allApplyElims es- c <- getConst False name TMAll- as' <- tomyExps as- return $ NotM $ App Nothing (NotM OKVal) (Const c) as'- I.Con con ci as -> do- let name = I.conName con- c <- getConst True name TMAll- as' <- tomyExps as- def <- lift $ getConstInfo name- cc <- lift $ liftIO $ readIORef c- let Just npar = fst $ cdorigin cc- return $ NotM $ App Nothing (NotM OKVal) (Const c) (foldl (\x _ -> NotM $ ALConPar x) as' [1..npar])- I.Pi (Common.Dom info x) b -> do- let y = I.absBody b- name = I.absName b- x' <- tomyType x- y' <- tomyType y- return $ NotM $ Pi Nothing (cnvh info) (Agda.TypeChecking.Free.freeIn 0 y) x' (Abs (Id name) y')- I.Sort (I.Type (I.Max [I.ClosedLevel l])) -> return $ NotM $ Sort $ Set $ fromIntegral l- I.Sort _ -> return $ NotM $ Sort UnknownSort- t@I.MetaV{} -> do- t <- lift $ instantiate t- case t of- I.MetaV mid _ -> do- mcurmeta <- gets sCurMeta- case mcurmeta of- Nothing -> return ()- Just curmeta ->- modify $ \ s -> s { sMetas = ( Map.adjust (\(m, x, deps) -> (m, x, mid : deps)) curmeta (fst $ sMetas s)+instance Conversion TOM I.Term (MExp O) where+ convert v0 =+ case I.unSpine v0 of+ I.Var v es -> do+ let Just as = I.allApplyElims es+ as' <- convert as+ return $ NotM $ App Nothing (NotM OKVal) (Var v) as'+ I.Lam info b -> do+ b' <- convert (I.absBody b)+ return $ NotM $ Lam (getHiding info) (Abs (Id $ I.absName b) b')+ t@I.Lit{} -> do+ t <- lift $ constructorForm t+ case t of+ I.Lit{} -> lift literalsNotImplemented+ _ -> convert t+ I.Level l -> convert =<< lift (reallyUnLevelView l)+ I.Def name es -> do+ let Just as = I.allApplyElims es+ c <- getConst False name TMAll+ as' <- convert as+ return $ NotM $ App Nothing (NotM OKVal) (Const c) as'+ I.Con con ci as -> do+ let name = I.conName con+ c <- getConst True name TMAll+ as' <- convert as+ def <- lift $ getConstInfo name+ cc <- lift $ liftIO $ readIORef c+ let Just npar = fst $ cdorigin cc+ return $ NotM $ App Nothing (NotM OKVal) (Const c) (foldl (\x _ -> NotM $ ALConPar x) as' [1..npar])+ I.Pi (Cm.Dom{domInfo = info, unDom = x}) b -> do+ let y = I.absBody b+ name = I.absName b+ x' <- convert x+ y' <- convert y+ return $ NotM $ Pi Nothing (getHiding info) (Free.freeIn 0 y) x' (Abs (Id name) y')+ I.Sort (I.Type (I.Max [I.ClosedLevel l])) -> return $ NotM $ Sort $ Set $ fromIntegral l+ I.Sort _ -> return $ NotM $ Sort UnknownSort+ t@I.MetaV{} -> do+ t <- lift $ instantiate t+ case t of+ I.MetaV mid _ -> do+ mcurmeta <- gets sCurMeta+ case mcurmeta of+ Nothing -> return ()+ Just curmeta ->+ modify $ \ s -> s { sMetas = ( Map.adjust (\(m, x, deps) -> (m, x, mid : deps)) curmeta (fst $ sMetas s) , snd $ sMetas s ) }- m <- getMeta mid- return $ Meta m- _ -> tomyExp t- I.DontCare _ -> return $ NotM $ dontCare- I.Shared p -> tomyExp $ I.derefPtr p+ m <- getMeta mid+ return $ Meta m+ _ -> convert t+ I.DontCare _ -> return $ NotM dontCare+ I.Shared p -> convert $ I.derefPtr p -tomyExps :: I.Args -> TOM (MM (ArgList O) (RefInfo O))-tomyExps [] = return $ NotM ALNil-tomyExps (Common.Arg info a : as) = do- a' <- tomyExp a- as' <- tomyExps as- return $ NotM $ ALCons (cnvh info) a' as'+instance Conversion TOM a b => Conversion TOM (Cm.Arg a) (Hiding, b) where+ convert (Cm.Arg info a) = (getHiding info,) <$> convert a +instance Conversion TOM I.Args (MM (ArgList O) (RefInfo O)) where+ convert as = NotM . foldr (\ (hid,t) -> ALCons hid t . NotM) ALNil+ <$> mapM convert as+ tomyIneq :: MB.Comparison -> Bool tomyIneq MB.CmpEq = False tomyIneq MB.CmpLeq = True@@ -448,7 +420,7 @@ fmExp m (I.Level (I.Max as)) = any (fmLevel m) as fmExp m (I.Def _ as) = fmExps m $ I.argsFromElims as fmExp m (I.Con _ ci as) = fmExps m as-fmExp m (I.Pi x y) = fmType m (Common.unDom x) || fmType m (I.unAbs y)+fmExp m (I.Pi x y) = fmType m (Cm.unDom x) || fmType m (I.unAbs y) fmExp m (I.Sort _) = False fmExp m (I.MetaV mid _) = mid == m fmExp m (I.DontCare _) = False@@ -456,7 +428,7 @@ fmExps :: I.MetaId -> I.Args -> Bool fmExps m [] = False-fmExps m (a : as) = fmExp m (Common.unArg a) || fmExps m as+fmExps m (a : as) = fmExp m (Cm.unArg a) || fmExps m as fmLevel :: I.MetaId -> I.PlusLevel -> Bool fmLevel m I.ClosedLevel{} = False@@ -468,71 +440,65 @@ -- --------------------------------------------- -cnvh :: Common.LensHiding a => a -> FMode-cnvh info = case Common.getHiding info of- Common.NotHidden -> NotHidden- Common.Instance -> Instance- Common.Hidden -> Hidden--icnvh :: FMode -> Common.ArgInfo-icnvh h = Common.setHiding h' $- Common.setOrigin Common.Inserted $- Common.defaultArgInfo+icnvh :: Hiding -> Cm.ArgInfo+icnvh h = Cm.setHiding h $+ Cm.setOrigin o $+ Cm.defaultArgInfo where- h' = case h of- NotHidden -> Common.NotHidden- Instance -> Common.Instance- Hidden -> Common.Hidden+ -- Andreas, 2017-01-18, issue #819.+ -- Visible arguments are made UserWritten,+ -- otherwise they might not be printed in patterns.+ o = case h of+ NotHidden -> Cm.UserWritten+ Instance{} -> Cm.Inserted+ Hidden -> Cm.Inserted -- --------------------------------------------- -frommy :: MExp O -> ExceptT String IO I.Term-frommy = frommyExp+instance Conversion MOT a b => Conversion MOT (MM a (RefInfo O)) b where+ convert meta = case meta of+ NotM a -> convert a+ Meta m -> do+ ma <- lift $ readIORef $ mbind m+ case ma of+ Nothing -> throwError "meta not bound"+ Just a -> convert a -frommyType :: MExp O -> ExceptT String IO I.Type-frommyType e = do- e' <- frommyExp e- return $ I.El (I.mkType 0) e' -- 0 is arbitrary, sort not read by Agda when reifying+instance Conversion MOT a b => Conversion MOT (Abs a) (I.Abs b) where+ convert (Abs mid t) = I.Abs id <$> convert t where+ id = case mid of+ NoId -> "x"+ Id id -> id -frommyExp :: MExp O -> ExceptT String IO I.Term-frommyExp (Meta m) = do- bind <- lift $ readIORef $ mbind m- case bind of- Nothing -> throwError "meta not bound"- Just e -> frommyExp (NotM e)-frommyExp (NotM e) =- case e of- App _ _ (Var v) as ->- frommyExps 0 as (I.Var v [])- App _ _ (Const c) as -> do- cdef <- lift $ readIORef c- let (iscon, name) = cdorigin cdef+instance Conversion MOT (Exp O) I.Type where+ convert e = I.El (I.mkType 0) <$> convert e+ -- 0 is arbitrary, sort not read by Agda when reifying++instance Conversion MOT (Exp O) I.Term where+ convert e = case e of+ App _ _ (Var v) as -> frommyExps 0 as (I.Var v [])+ App _ _ (Const c) as -> do+ cdef <- lift $ readIORef c+ let (iscon, name) = cdorigin cdef {- case iscon of Just n -> do v <- getConTerm name -- We are not in TCM frommyExps n as v -}- (ndrop, h) = case iscon of- Just n -> (n, \ q -> I.Con (I.ConHead q Common.Inductive []) Common.ConOSystem) -- TODO: restore fields- Nothing -> (0, \ f vs -> I.Def f $ map I.Apply vs)- frommyExps ndrop as (h name [])- Lam hid (Abs mid t) -> do- t' <- frommyExp t- return $ I.Lam (icnvh hid) (I.Abs (case mid of {NoId -> "x"; Id id -> id}) t')- Pi _ hid _ x (Abs mid y) -> do- x' <- frommyType x- y' <- frommyType y- return $ I.Pi (Common.Dom (icnvh hid) x') (I.Abs (case mid of {NoId -> "x"; Id id -> id}) y')- -- maybe have case for Pi where possdep is False which produces Fun (and has to unweaken y), return $ I.Fun (Common.Arg (icnvh hid) x') y'- Sort (Set l) ->- return $ I.Sort (I.mkType (fromIntegral l))- Sort Type -> __IMPOSSIBLE__- Sort UnknownSort -> return $ I.Sort (I.mkType 0) -- hoping that it's thrown away-- AbsurdLambda hid ->- return $ I.Lam (icnvh hid) (I.Abs abslamvarname (I.Var 0 []))+ (ndrop, h) = case iscon of+ Just n -> (n, \ q -> I.Con (I.ConHead q Cm.Inductive []) Cm.ConOSystem) -- TODO: restore fields+ Nothing -> (0, \ f vs -> I.Def f $ map I.Apply vs)+ frommyExps ndrop as (h name [])+ Lam hid t -> I.Lam (icnvh hid) <$> convert t+ Pi _ hid _ x y -> I.Pi . Cm.Dom (icnvh hid) <$> convert x <*> convert y+ -- maybe have case for Pi where possdep is False which produces Fun (and has to unweaken y), return $ I.Fun (Cm.Arg (icnvh hid) x') y'+ Sort (Set l) -> return $ I.Sort (I.mkType (fromIntegral l))+ Sort Type -> __IMPOSSIBLE__+ Sort UnknownSort -> return $ I.Sort (I.mkType 0) -- hoping it's thrown away + AbsurdLambda hid -> return $ I.Lam (icnvh hid)+ $ I.Abs abslamvarname (I.Var 0 []) frommyExps :: Nat -> MArgList O -> I.Term -> ExceptT String IO I.Term frommyExps ndrop (Meta m) trm = do@@ -545,8 +511,8 @@ ALNil -> return trm ALCons _ _ xs | ndrop > 0 -> frommyExps (ndrop - 1) xs trm ALCons hid x xs -> do- x' <- frommyExp x- frommyExps ndrop xs (addend (Common.Arg (icnvh hid) x') trm)+ x' <- convert x+ frommyExps ndrop xs (addend (Cm.Arg (icnvh hid) x') trm) -- Andreas, 2013-10-19 TODO: restore postfix projections ALProj eas idx hid xs -> do@@ -557,7 +523,7 @@ cdef <- lift $ readIORef c let name = snd $ cdorigin cdef trm2 <- frommyExps 0 eas (I.Def name [])- frommyExps 0 xs (addend (Common.Arg (icnvh hid) trm) trm2)+ frommyExps 0 xs (addend (Cm.Arg (icnvh hid) trm) trm2) ALConPar xs | ndrop > 0 -> frommyExps (ndrop - 1) xs trm ALConPar _ -> __IMPOSSIBLE__@@ -576,10 +542,11 @@ modifyAbstractExpr :: A.Expr -> A.Expr modifyAbstractExpr = f where- f (A.App i e1 (Common.Arg info (Common.Named n e2))) =- A.App i (f e1) (Common.Arg info (Common.Named n (f e2)))- f (A.Lam i (A.DomainFree info n) _) | show (A.nameConcrete n) == abslamvarname =- A.AbsurdLam i $ Common.argInfoHiding info+ f (A.App i e1 (Cm.Arg info (Cm.Named n e2))) =+ A.App i (f e1) (Cm.Arg info (Cm.Named n (f e2)))+ f (A.Lam i (A.DomainFree info n) _)+ | prettyShow (A.nameConcrete n) == abslamvarname =+ A.AbsurdLam i $ Cm.argInfoHiding info f (A.Lam i b e) = A.Lam i b (f e) f (A.Rec i xs) = A.Rec i (map (mapLeft (over exprFieldA f)) xs) f (A.RecUpdate i e xs) = A.RecUpdate i (f e) (map (over exprFieldA f) xs)@@ -587,14 +554,14 @@ f e = e modifyAbstractClause :: A.Clause -> A.Clause-modifyAbstractClause (A.Clause lhs dots (A.RHS e mc) decls catchall) =- A.Clause lhs dots (A.RHS (modifyAbstractExpr e) mc) decls catchall+modifyAbstractClause (A.Clause lhs dots sdots (A.RHS e mc) decls catchall) =+ A.Clause lhs dots sdots (A.RHS (modifyAbstractExpr e) mc) decls catchall modifyAbstractClause cl = cl -- --------------------------------- -constructPats :: Map AN.QName (TMode, ConstRef O) -> I.MetaId -> I.Clause -> MB.TCM ([(FMode, MId)], [CSPat O])+constructPats :: Map AN.QName (TMode, ConstRef O) -> I.MetaId -> I.Clause -> MB.TCM ([(Hiding, MId)], [CSPat O]) constructPats cmap mainm clause = do let cnvps ns [] = return (ns, []) cnvps ns (p : ps) = do@@ -602,8 +569,8 @@ (ns'', p') <- cnvp ns' p return (ns'', p' : ps') cnvp ns p =- let hid = cnvh $ Common.argInfo p- in case Common.namedArg p of+ let hid = getHiding $ Cm.argInfo p+ in case Cm.namedArg p of I.VarP n -> return ((hid, Id n) : ns, HI hid (CSPatVar $ length ns)) I.ConP con _ ps -> do let c = I.conName con@@ -613,10 +580,11 @@ let Just npar = fst $ cdorigin cc return (ns', HI hid (CSPatConApp c2 (replicate npar (HI Hidden CSOmittedArg) ++ ps'))) I.DotP t -> do- (t2, _) <- runStateT (tomyExp t) (S {sConsts = (cmap, []), sMetas = initMapS, sEqs = initMapS, sCurMeta = Nothing, sMainMeta = mainm})+ (t2, _) <- runStateT (convert t) (S {sConsts = (cmap, []), sMetas = initMapS, sEqs = initMapS, sCurMeta = Nothing, sMainMeta = mainm}) return (ns, HI hid (CSPatExp t2))+ I.AbsurdP{} -> return ((hid, Id I.absurdPatternName) : ns, HI hid (CSPatVar $ length ns)) I.ProjP{} -> copatternsNotImplemented- _ -> __IMPOSSIBLE__+ I.LitP{} -> literalsNotImplemented (names, pats) <- cnvps [] (IP.unnumberPatVars $ I.namedClausePats clause) return (reverse names, pats) @@ -627,8 +595,8 @@ ctel (HI hid (mid, t) : ctx) = do let Id id = mid tel <- ctel ctx- t' <- frommyType t- return $ I.ExtendTel (Common.Dom (icnvh hid) t') (I.Abs id tel)+ t' <- convert t+ return $ I.ExtendTel (Cm.Dom (icnvh hid) t') (I.Abs id tel) tel <- ctel $ reverse ids let getperms 0 [] perm nv = return (perm, nv) getperms n [] _ _ = __IMPOSSIBLE__@@ -669,26 +637,28 @@ cdef <- lift $ readIORef c let (Just ndrop, name) = cdorigin cdef ps' <- cnvps ndrop ps- let con = I.ConHead name Common.Inductive [] -- TODO: restore record fields!+ let con = I.ConHead name Cm.Inductive [] -- TODO: restore record fields! return (I.ConP con I.noConPatternInfo ps') CSPatExp e -> do- e' <- frommyExp e {- renm e -} -- renaming before adding to clause below+ e' <- convert e {- renm e -} -- renaming before adding to clause below return (I.DotP e') CSAbsurd -> __IMPOSSIBLE__ -- CSAbsurd not used _ -> __IMPOSSIBLE__- return $ Common.Arg (icnvh hid) $ Common.unnamed p' -- TODO: recover names+ return $ Cm.Arg (icnvh hid) $ Cm.unnamed p' -- TODO: recover names ps <- cnvps 0 pats body <- case mrhs of Nothing -> return $ Nothing- Just e -> Just <$> frommyExp e+ Just e -> Just <$> convert e let cperm = Perm nv perm return $ I.Clause- { I.clauseRange = SP.noRange- , I.clauseTel = tel+ { I.clauseLHSRange = SP.noRange+ , I.clauseFullRange = SP.noRange+ , I.clauseTel = tel , I.namedClausePats = IP.numberPatVars __IMPOSSIBLE__ cperm $ applySubst (renamingR $ compactP cperm) ps , I.clauseBody = body , I.clauseType = Nothing -- TODO: compute clause type , I.clauseCatchall = False+ , I.clauseUnreachable = Nothing -- TODO: Don't know here whether reachable or not !? } contains_constructor :: [CSPat O] -> Bool@@ -735,15 +705,14 @@ -- --------------------------------------- -findClauseDeep :: Common.InteractionId -> MB.TCM (Maybe (AN.QName, I.Clause, Bool))+findClauseDeep :: Cm.InteractionId -> MB.TCM (Maybe (AN.QName, I.Clause, Bool)) findClauseDeep ii = ignoreAbstractMode $ do -- Andreas, 2016-09-04, issue #2162 MB.InteractionPoint { MB.ipClause = ipCl} <- lookupInteractionPoint ii- (f, clauseNo) <- case ipCl of- MB.IPClause f clauseNo _ -> return (f, clauseNo)- MB.IPNoClause -> MB.typeError $ MB.GenericError $- "Cannot apply the auto tactic here, we are not in a function clause"- (_, c, _) <- getClauseForIP f clauseNo- return $ Just (f, c, maybe __IMPOSSIBLE__ toplevel $ I.clauseBody c)+ case ipCl of+ MB.IPNoClause -> return Nothing+ MB.IPClause f clauseNo _ -> do+ (_, c, _) <- getClauseForIP f clauseNo+ return $ Just (f, c, maybe __IMPOSSIBLE__ toplevel $ I.clauseBody c) where toplevel e = case I.ignoreSharing e of@@ -783,15 +752,15 @@ (I.Lit lit1, I.Lit lit2) | lit1 == lit2 -> c (n + 1) (I.Def n1 as1, I.Def n2 as2) | n1 == n2 -> fes nl (n + 1) c as1 as2 (I.Con n1 _ as1, I.Con n2 _ as2) | n1 == n2 -> fs nl (n + 1) c as1 as2- (I.Pi (Common.Dom info1 it1) ot1, I.Pi (Common.Dom info2 it2) ot2) | Common.argInfoHiding info1 == Common.argInfoHiding info2 -> ft nl n (\n -> ft (nl + 1) n c (I.absBody ot1) (I.absBody ot2)) it1 it2+ (I.Pi (Cm.Dom{domInfo = info1, unDom = it1}) ot1, I.Pi (Cm.Dom{domInfo = info2, unDom = it2}) ot2) | Cm.argInfoHiding info1 == Cm.argInfoHiding info2 -> ft nl n (\n -> ft (nl + 1) n c (I.absBody ot1) (I.absBody ot2)) it1 it2 (I.Sort{}, I.Sort{}) -> c n -- sloppy _ -> Nothing fs nl n c es1 es2 = case (es1, es2) of ([], []) -> c n- (Common.Arg info1 e1 : es1, Common.Arg info2 e2 : es2) | Common.argInfoHiding info1 == Common.argInfoHiding info2 -> f nl n (\n -> fs nl n c es1 es2) e1 e2+ (Cm.Arg info1 e1 : es1, Cm.Arg info2 e2 : es2) | Cm.argInfoHiding info1 == Cm.argInfoHiding info2 -> f nl n (\n -> fs nl n c es1 es2) e1 e2 _ -> Nothing fes nl n c es1 es2 = case (es1, es2) of ([], []) -> c n (I.Proj _ f : es1, I.Proj _ f' : es2) | f == f' -> fes nl n c es1 es2- (I.Apply (Common.Arg info1 e1) : es1, I.Apply (Common.Arg info2 e2) : es2) | Common.argInfoHiding info1 == Common.argInfoHiding info2 -> f nl n (\n -> fes nl n c es1 es2) e1 e2+ (I.Apply (Cm.Arg info1 e1) : es1, I.Apply (Cm.Arg info2 e2) : es2) | Cm.argInfoHiding info1 == Cm.argInfoHiding info2 -> f nl n (\n -> fes nl n c es1 es2) e1 e2 _ -> Nothing
src/full/Agda/Auto/NarrowingSearch.hs view
@@ -1,16 +1,20 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-} module Agda.Auto.NarrowingSearch where import Data.IORef hiding (writeIORef, modifyIORef) import qualified Data.IORef as NoUndo (writeIORef, modifyIORef) import Control.Monad.State+import Control.Applicative hiding (Const(..), getConst) #include "undefined.h" import Agda.Utils.Impossible+import Agda.Utils.Empty -type Prio = Int+newtype Prio = Prio { getPrio :: Int }+ deriving (Eq, Ord, Num) class Trav a blk | a -> blk where trav :: Monad m => (forall b . Trav b blk => MM b blk -> m ()) -> a -> m ()@@ -26,7 +30,7 @@ -- ^ Success. | Error String -- ^ Definite failure.- | forall a . AddExtraRef String (Metavar a blk) (Int, RefCreateEnv blk a)+ | forall a . AddExtraRef String (Metavar a blk) (Move' blk a) -- ^ Experimental. | And (Maybe [Term blk]) (MetaEnv (PB blk)) (MetaEnv (PB blk)) -- ^ Parallel conjunction of constraints.@@ -59,7 +63,7 @@ -- ^ List of observers, i.e., constraints blocked by this meta. , mcompoint :: IORef [SubConstraints blk] -- ^ Used for experiments with independence of subproofs.- , mextrarefs :: IORef [(Int, RefCreateEnv blk a)]+ , mextrarefs :: IORef [Move' blk a] -- ^ Experimental. } @@ -158,38 +162,60 @@ -- ----------------------- +newtype RefCreateEnv blk a = RefCreateEnv+ { runRefCreateEnv :: StateT ((IORef [SubConstraints blk]), Int) IO a } -type RefCreateEnv blk = StateT ( ( (IORef [SubConstraints blk])), Int) IO+instance Functor (RefCreateEnv blk) where+ fmap f = RefCreateEnv . fmap f . runRefCreateEnv -data Pair a b = Pair a b+instance Applicative (RefCreateEnv blk) where+ pure = RefCreateEnv . pure+ f <*> t = RefCreateEnv $ runRefCreateEnv f <*> runRefCreateEnv t +instance Monad (RefCreateEnv blk) where+ return = pure+ t >>= f = RefCreateEnv $ runRefCreateEnv t >>= runRefCreateEnv . f+++newtype Cost = Cost { getCost :: Int }+ deriving (Num, Eq, Ord)++data Move' blk a = Move+ { moveCost :: Cost+ , moveNext :: RefCreateEnv blk a+ }+ class Refinable a blk where- refinements :: blk -> [blk] -> Metavar a blk -> IO [(Int, RefCreateEnv blk a)]+ refinements :: blk -> [blk] -> Metavar a blk -> IO [Move' blk a] newPlaceholder :: RefCreateEnv blk (MM a blk)-newPlaceholder = do- (e@( ( mcompoint)), c) <- get+newPlaceholder = RefCreateEnv $ do+ (mcompoint, c) <- get m <- lift $ newMeta mcompoint- put (e, (c + 1))+ put (mcompoint, (c + 1)) return $ Meta m newOKHandle :: RefCreateEnv blk (OKHandle blk)-newOKHandle = do- (e@( ( _)), c) <- get+newOKHandle = RefCreateEnv $ do+ (e, c) <- get cp <- lift $ newIORef []- m <- lift $ newMeta cp+ m <- lift $ newMeta cp put (e, (c + 1)) return $ Meta m dryInstantiate :: RefCreateEnv blk a -> IO a-dryInstantiate bind = evalStateT bind ( ( __IMPOSSIBLE__), 0)+dryInstantiate bind = evalStateT (runRefCreateEnv bind) (__IMPOSSIBLE__, 0) type BlkInfo blk = (Bool, Prio, Maybe blk) -- Bool - is principal data MM a blk = NotM a | Meta (Metavar a blk) +rm :: Empty -> MM a b -> a+rm e (NotM x) = x+rm e Meta{} = absurd e+ type MetaEnv = IO @@ -290,7 +316,7 @@ type SRes = Either Bool Int -topSearch :: forall blk . IORef Int -> IORef Int -> HandleSol -> blk -> MetaEnv (PB blk) -> Int -> Int -> IO Bool+topSearch :: forall blk . IORef Int -> IORef Int -> HandleSol -> blk -> MetaEnv (PB blk) -> Cost -> Cost -> IO Bool topSearch ticks nsol hsol envinfo p searchdepth depthinterval = do depthreached <- newIORef False @@ -298,7 +324,7 @@ mainroot <- newCTree Nothing let- searchSubProb :: [(CTree blk, Maybe (IORef Bool))] -> Int -> IO SRes+ searchSubProb :: [(CTree blk, Maybe (IORef Bool))] -> Cost -> IO SRes searchSubProb [] depth = do when (depth < depthinterval) $ do @@ -311,7 +337,7 @@ return $ Left True searchSubProb ((root, firstdone) : restprobs) depth = let- search :: Int -> IO SRes+ search :: Cost -> IO SRes search depth = do pm <- readIORef $ ctpriometa root case pm of@@ -340,12 +366,13 @@ 0 -> split _ -> carryon - fork :: Refinable a blk => Metavar a blk -> Int -> IO SRes+ fork :: forall a. Refinable a blk => Metavar a blk -> Cost -> IO SRes fork m depth = do blkinfos <- extractblkinfos m refs <- refinements envinfo blkinfos m f refs where+ f :: [Move' blk a] -> IO SRes f [] = do erefs <- readIORef $ mextrarefs m case erefs of@@ -353,7 +380,7 @@ _ -> do NoUndo.writeIORef (mextrarefs m) [] f erefs- f ((cost, bind) : binds) = hsres (refine m bind (depth - cost) ) (f binds)+ f (Move cost bind : binds) = hsres (refine m bind (depth - cost)) (f binds) hsres :: IO SRes -> IO SRes -> IO SRes hsres x1 x2 = do res <- x1@@ -369,7 +396,7 @@ Right _ -> if found then __IMPOSSIBLE__ else return res2 Left found2 -> return $ Left (found || found2) - refine :: Metavar a blk -> RefCreateEnv blk a -> Int -> IO SRes+ refine :: Metavar a blk -> RefCreateEnv blk a -> Cost -> IO SRes refine _ _ depthleft | depthleft < 0 = do NoUndo.writeIORef depthreached True@@ -381,7 +408,7 @@ lift $ NoUndo.writeIORef ticks $! t + 1 - (bind, (_, nnewmeta)) <- lift $ runStateT bind ( ( (mcompoint m)), 0)+ (bind, (_, nnewmeta)) <- lift $ runStateT (runRefCreateEnv bind) (mcompoint m, 0) uwriteIORef (mbind m) (Just bind) mcomptr <- ureadIORef $ mcompoint m mapM_ (\comptr ->@@ -623,7 +650,7 @@ RightDisjunct -> p2 instance Refinable Choice blk where- refinements _ x _ = return [(0, return LeftDisjunct), (0, return RightDisjunct)]+ refinements _ x _ = return $ Move 0 . return <$> [LeftDisjunct, RightDisjunct] instance Refinable OKVal blk where
+ src/full/Agda/Auto/Options.hs view
@@ -0,0 +1,106 @@+module Agda.Auto.Options where++import Control.Monad.State+import Agda.Utils.Lens++data Mode = MNormal Bool Bool -- true if list mode, true if disprove++ | MCaseSplit++ | MRefine Bool -- true if list mode+++data AutoHintMode = AHMNone+ | AHMModule++type Hints = [String]++newtype TimeOut = TimeOut { getTimeOut :: Int }++instance Show TimeOut where+ show = show . getTimeOut++-- | Options for Auto, default value and lenses++data AutoOptions = AutoOptions+ { autoHints :: Hints+ , autoTimeOut :: TimeOut+ , autoPick :: Int+ , autoMode :: Mode+ , autoHintMode :: AutoHintMode+ }++initAutoOptions :: AutoOptions+initAutoOptions = AutoOptions+ { autoHints = []+ , autoTimeOut = TimeOut 1+ , autoPick = 0+ , autoMode = MNormal False False+ , autoHintMode = AHMNone+ }++aoHints :: Lens' Hints AutoOptions+aoHints f s =+ f (autoHints s) <&>+ \x -> s {autoHints = x}++aoTimeOut :: Lens' TimeOut AutoOptions+aoTimeOut f s =+ f (autoTimeOut s) <&>+ \x -> s {autoTimeOut = x}++aoPick :: Lens' Int AutoOptions+aoPick f s =+ f (autoPick s) <&>+ \x -> s {autoPick = x}++aoMode :: Lens' Mode AutoOptions+aoMode f s =+ f (autoMode s) <&>+ \x -> s {autoMode = x}++aoHintMode :: Lens' AutoHintMode AutoOptions+aoHintMode f s =+ f (autoHintMode s) <&>+ \x -> s {autoHintMode = x}++-- | Tokenising the input (makes `parseArgs` cleaner)++data AutoToken =+ M | C | R | D | L+ | T Int | S Int | H String++autoTokens :: [String] -> [AutoToken]+autoTokens [] = []+autoTokens ("-t" : t : ws) = T (read t) : autoTokens ws+autoTokens ("-s" : s : ws) = S (read s) : autoTokens ws+autoTokens ("-l" : ws) = L : autoTokens ws+autoTokens ("-d" : ws) = D : autoTokens ws+autoTokens ("-m" : ws) = M : autoTokens ws+autoTokens ("-c" : ws) = C : autoTokens ws+autoTokens ("-r" : ws) = R : autoTokens ws+autoTokens (h : ws) = H h : autoTokens ws++parseArgs :: String -> AutoOptions+parseArgs s = mapM_ step (autoTokens $ words s)+ `execState` initAutoOptions where++ step :: AutoToken -> State AutoOptions ()+ step M = aoHintMode .= AHMModule+ step C = aoMode .= MCaseSplit+ step R = aoPick .= (-1)+ >> aoMode .= MRefine False+ step (T t) = aoTimeOut .= TimeOut t+ step (S p) = aoPick .= p+ step (H h) = aoHints %= (h :)+ step D = do+ mode <- use aoMode+ case mode of+ MNormal lm _ -> aoMode .= MNormal lm True+ _ -> return ()+ step L = do+ mode <- use aoMode+ case mode of+ MNormal _ dp -> aoMode .= MNormal True dp+ MRefine _ -> aoMode .= MRefine True+ _ -> return ()
src/full/Agda/Auto/SearchControl.hs view
@@ -1,15 +1,17 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE UndecidableInstances #-}-+{-# LANGUAGE CPP #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Agda.Auto.SearchControl where +import Control.Applicative hiding (getConst, Const(..)) import Control.Monad import Data.IORef import Control.Monad.State-import Data.Maybe (mapMaybe)+import Data.Maybe (mapMaybe, fromMaybe) +import Agda.Syntax.Common (Hiding(..)) import Agda.Auto.NarrowingSearch import Agda.Auto.Syntax @@ -17,86 +19,187 @@ import Agda.Utils.Impossible instance Refinable (ArgList o) (RefInfo o) where- refinements _ infos _ =- return $ [- (0, return ALNil),+ refinements _ infos _ = return $ fmap (Move 0) $+ [ return ALNil, cons NotHidden, cons Hidden ]+ ++ if getIsDep infos then []+ else [ proj NotHidden, proj Hidden ] - (0, cons NotHidden),- (0, cons Hidden)+ where + getIsDep :: [RefInfo o] -> Bool+ getIsDep (x : xs) = case x of+ RICheckElim isDep -> isDep+ _ -> getIsDep xs+ getIsDep _ = __IMPOSSIBLE__ - ]+ proj :: Hiding -> RefCreateEnv (RefInfo o) (ArgList o)+ proj hid = ALProj <$> newPlaceholder <*> newPlaceholder+ <*> return hid <*> newPlaceholder - ++- (let isdep = rr infos- rr (RICheckElim isdep : _) = isdep- rr (_ : xs) = rr xs- rr _ = __IMPOSSIBLE__- proj hid = newPlaceholder >>= \p1 -> newPlaceholder >>= \p2 -> newPlaceholder >>= \p3 -> return $ ALProj p1 p2 hid p3- in if isdep then- []- else+ cons :: Hiding -> RefCreateEnv (RefInfo o) (ArgList o)+ cons hid = ALCons hid <$> newPlaceholder <*> newPlaceholder - [(0, proj NotHidden), (0, proj Hidden)] +data ExpRefInfo o = ExpRefInfo+ { eriMain :: Maybe (RefInfo o)+ , eriUnifs :: [RefInfo o]+ , eriInfTypeUnknown :: Bool+ , eriIsEliminand :: Bool+ , eriUsedVars :: Maybe ([UId o], [Elr o])+ , eriIotaStep :: Maybe Bool+ , eriPickSubsVar :: Bool+ , eriEqRState :: Maybe EqReasoningState+ } - )+initExpRefInfo :: ExpRefInfo o+initExpRefInfo = ExpRefInfo+ { eriMain = Nothing+ , eriUnifs = []+ , eriInfTypeUnknown = False+ , eriIsEliminand = False+ , eriUsedVars = Nothing+ , eriIotaStep = Nothing+ , eriPickSubsVar = False+ , eriEqRState = Nothing+ } - where cons hid = newPlaceholder >>= \p1 -> newPlaceholder >>= \p2 -> return $ ALCons hid p1 p2+getinfo :: [RefInfo o] -> ExpRefInfo o+getinfo = foldl step initExpRefInfo where + step :: ExpRefInfo o -> RefInfo o -> ExpRefInfo o+ step eri x@RIMainInfo{} = eri { eriMain = Just x }+ step eri x@RIUnifInfo{} = eri { eriUnifs = x : eriUnifs eri }+ step eri RIInferredTypeUnknown = eri { eriInfTypeUnknown = True }+ step eri RINotConstructor = eri { eriIsEliminand = True }+ step eri (RIUsedVars nuids nused) = eri { eriUsedVars = Just (nuids, nused) }+ step eri (RIIotaStep semif) = eri { eriIotaStep = Just iota' } where+ iota' = semif || fromMaybe False (eriIotaStep eri)+ step eri RIPickSubsvar = eri { eriPickSubsVar = True }+ step eri (RIEqRState s) = eri { eriEqRState = Just s }+ step eri _ = __IMPOSSIBLE__ -data ExpRefInfo o = ExpRefInfo {eriMain :: Maybe (RefInfo o), eriUnifs :: [RefInfo o], eriInfTypeUnknown, eriIsEliminand :: Bool, eriUsedVars :: Maybe ([UId o], [Elr o]),- eriIotaStep :: Maybe Bool, eriPickSubsVar :: Bool - , eriEqRState :: Maybe EqReasoningState+-- | @univar sub v@ figures out what the name of @v@ "outside" of+-- the substitution @sub@ ought to be, if anything. - }+univar :: [CAction o] -> Nat -> Maybe Nat+univar cl v = getOutsideName cl v 0 where -getinfo :: [RefInfo o] -> ExpRefInfo o-getinfo = f (ExpRefInfo {eriMain = Nothing- , eriUnifs = []- , eriInfTypeUnknown = False- , eriIsEliminand = False- , eriUsedVars = Nothing- , eriIotaStep = Nothing- , eriPickSubsVar = False- , eriEqRState = Nothing- }- )- where- f i [] = i- f i (x@RIMainInfo{} : xs) = f (i {eriMain = Just x}) xs- f i (x@RIUnifInfo{} : xs) = f (i {eriUnifs = x : eriUnifs i}) xs- f i (RIInferredTypeUnknown : xs) = f (i {eriInfTypeUnknown = True}) xs- f i (RINotConstructor : xs) = f (i {eriIsEliminand = True}) xs- f i (RIUsedVars nuids nused : xs) = f (i {eriUsedVars = Just (nuids, nused)}) xs- f i (RIIotaStep semif : xs) = f (i {eriIotaStep = Just (semif || maybe False id (eriIotaStep i))}) xs- f i (RIPickSubsvar : xs) = f (i {eriPickSubsVar = True}) xs+ getOutsideName :: [CAction o] -> Nat -> Nat -> Maybe Nat+ -- @v@ is offset by @v'@ binders+ getOutsideName [] v v' = Just (v' + v)+ -- @v@ was introduced by the weakening: disappears+ getOutsideName (Weak n : _) v v' | v < n = Nothing+ -- @v@ was introduced before the weakening: strengthened+ getOutsideName (Weak n : xs) v v' = getOutsideName xs (v - n) v'+ -- Name of @v@ before the substitution was pushed in+ -- had to be offset by 1+ getOutsideName (Sub _ : xs) v v' = getOutsideName xs v (v' + 1)+ -- If this is the place where @v@ was bound, it used to+ -- be called 0 + offset of all the vars substituted for+ getOutsideName (Skip : _) 0 v' = Just v'+ -- Going over a binder: de Bruijn name of @v@ decreased+ -- but offset increased+ getOutsideName (Skip : xs) v v' = getOutsideName xs (v - 1) (v' + 1) - f i (RIEqRState s : xs) = f (i {eriEqRState = Just s}) xs+-- | List of the variables instantiated by the substitution+subsvars :: [CAction o] -> [Nat]+subsvars = f 0 where - f i _ = __IMPOSSIBLE__+ f :: Nat -> [CAction o] -> [Nat]+ f n [] = []+ f n (Weak _ : xs) = f n xs -- why?+ f n (Sub _ : xs) = n : f (n + 1) xs+ f n (Skip : xs) = f (n + 1) xs +-- | Moves+-- A move is composed of a @Cost@ together with an action+-- computing the refined problem. -univar :: [CAction o] -> Nat -> Maybe Nat-univar cl v = f cl v 0- where- f [] v v' = Just (v' + v)- f (Weak n : _) v v' | v < n = Nothing- f (Weak n : xs) v v' = f xs (v - n) v'- f (Sub _ : xs) v v' = f xs v (v' + 1)- f (Skip : _) 0 v' = Just v'- f (Skip : xs) v v' = f xs (v - 1) (v' + 1)+type Move o = Move' (RefInfo o) (Exp o) -subsvars :: [CAction o] -> [Nat]-subsvars = f 0- where- f n [] = []- f n (Weak _ : xs) = f n xs- f n (Sub _ : xs) = n : f (n + 1) xs- f n (Skip : xs) = f (n + 1) xs+-- | New constructors+-- Taking a step towards a solution consists in picking a+-- constructor and filling in the missing parts with+-- placeholders to be discharged later on. +newAbs :: MId -> RefCreateEnv blk (Abs (MM a blk))+newAbs mid = Abs mid <$> newPlaceholder +newLam :: Hiding -> MId -> RefCreateEnv (RefInfo o) (Exp o)+newLam hid mid = Lam hid <$> newAbs mid++newPi :: UId o -> Bool -> Hiding -> RefCreateEnv (RefInfo o) (Exp o)+newPi uid dep hid = Pi (Just uid) hid dep <$> newPlaceholder <*> newAbs NoId++foldArgs :: [(Hiding, MExp o)] -> MArgList o+foldArgs = foldr (\ (h, a) sp -> NotM $ ALCons h a sp) (NotM ALNil)++-- | New spine of arguments potentially using placeholders++newArgs' :: [Hiding] -> [MExp o] -> RefCreateEnv (RefInfo o) (MArgList o)+newArgs' h tms = foldArgs . zip h . (++ tms) <$> replicateM size newPlaceholder+ where size = length h - length tms++newArgs :: [Hiding] -> RefCreateEnv (RefInfo o) (MArgList o)+newArgs h = newArgs' h []++-- | New @App@lication node using a new spine of arguments+-- respecting the @Hiding@ annotation++newApp' :: UId o -> ConstRef o -> [Hiding] -> [MExp o] ->+ RefCreateEnv (RefInfo o) (Exp o)+newApp' meta cst hds tms =+ App (Just meta) <$> newOKHandle <*> return (Const cst) <*> newArgs' hds tms++newApp :: UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)+newApp meta cst hds = newApp' meta cst hds []++-- | Equality reasoning steps+-- The begin token is accompanied by two steps because+-- it does not make sense to have a derivation any shorter+-- than that.++eqStep :: UId o -> EqReasoningConsts o -> Move o+eqStep meta eqrc = Move costEqStep $ newApp meta (eqrcStep eqrc)+ [Hidden, Hidden, NotHidden, Hidden, Hidden, NotHidden, NotHidden]++eqEnd :: UId o -> EqReasoningConsts o -> Move o+eqEnd meta eqrc = Move costEqEnd $ newApp meta (eqrcEnd eqrc)+ [Hidden, Hidden, NotHidden]++eqCong :: UId o -> EqReasoningConsts o -> Move o+eqCong meta eqrc = Move costEqCong $ newApp meta (eqrcCong eqrc)+ [Hidden, Hidden, Hidden, Hidden, NotHidden, Hidden, Hidden, NotHidden]++eqSym :: UId o -> EqReasoningConsts o -> Move o+eqSym meta eqrc = Move costEqSym $ newApp meta (eqrcSym eqrc)+ [Hidden, Hidden, Hidden, Hidden, NotHidden]++eqBeginStep2 :: UId o -> EqReasoningConsts o -> Move o+eqBeginStep2 meta eqrc = Move costEqStep $ do+ e1 <- newApp meta (eqrcStep eqrc)+ [Hidden, Hidden, NotHidden, Hidden, Hidden, NotHidden, NotHidden]+ e2 <- newApp' meta (eqrcStep eqrc)+ [Hidden, Hidden, NotHidden, Hidden, Hidden, NotHidden, NotHidden]+ [NotM e1]+ newApp' meta (eqrcBegin eqrc) [Hidden, Hidden, Hidden, Hidden, NotHidden]+ [NotM e2]+++-- | Pick the first unused UId amongst the ones you have seen (GA: ??)+-- Defaults to the head of the seen ones.++pickUid :: forall o. [UId o] -> [Maybe (UId o)] -> (Maybe (UId o), Bool)+pickUid used seen = maybe (head seen, False) (, True) $ firstUnused seen where+ {- ?? which uid to pick -}++ firstUnused :: [Maybe (UId o)] -> Maybe (Maybe (UId o))+ firstUnused [] = Nothing+ firstUnused (Nothing : _) = Just Nothing+ firstUnused (mu@(Just u) : us) =+ if u `elem` used then firstUnused us else Just mu+ instance Refinable (Exp o) (RefInfo o) where refinements envinfo infos meta = let@@ -105,122 +208,79 @@ meqr = rieEqReasoningConsts envinfo - ExpRefInfo {eriMain = Just (RIMainInfo n tt iotastepdone), eriUnifs = unis, eriInfTypeUnknown = inftypeunknown, eriIsEliminand = iseliminand, eriUsedVars = Just (uids, usedvars),- eriIotaStep = iotastep, eriPickSubsVar = picksubsvar-- , eriEqRState = meqrstate-- } = getinfo infos-- eqrstate = maybe EqRSNone id meqrstate+ ExpRefInfo { eriMain = Just (RIMainInfo n tt iotastepdone)+ , eriUnifs = unis+ , eriInfTypeUnknown = inftypeunknown+ , eriIsEliminand = iseliminand+ , eriUsedVars = Just (uids, usedvars)+ , eriIotaStep = iotastep+ , eriPickSubsVar = picksubsvar+ , eriEqRState = meqrstate+ } = getinfo infos - app muid elr = do p <- newPlaceholder- p <- case elr of- Var{} -> return p- Const c -> do- cd <- lift $ readIORef c- let dfvapp 0 _ = p- dfvapp i n = NotM $ ALCons NotHidden (NotM $ App Nothing (NotM $ OKVal) (Var n) (NotM ALNil)) (dfvapp (i - 1) (n - 1))- -- NotHidden is ok because agda reification throws these arguments away and agsy skips typechecking them- return $ dfvapp (cddeffreevars cd) (n - 1)+ eqrstate = fromMaybe EqRSNone meqrstate - okh <- newOKHandle- let uid = case muid of- Just _ -> muid- Nothing -> Just meta- return $ App uid okh elr p- lam hid id = do- p <- newPlaceholder- return $ Lam hid (Abs id p)- pi muid dep hid =- do p1 <- newPlaceholder- p2 <- newPlaceholder- let uid = case muid of- Just _ -> muid- Nothing -> Just meta- return $ Pi uid hid dep p1 (Abs NoId p2) set l = return $ Sort (Set l) in case unis of [] -> let - eqr = maybe __IMPOSSIBLE__ id meqr- foldargs [] = NotM ALNil- foldargs ((h, a) : xs) = NotM $ ALCons h a (foldargs xs)- eq_begin_step_step = (costEqStep,- do psb <- replicateM 4 newPlaceholder- okhb <- newOKHandle- pss1 <- replicateM 6 newPlaceholder- okhs1 <- newOKHandle- pss2 <- replicateM 7 newPlaceholder- okhs2 <- newOKHandle- return $ App (Just meta) okhb (Const $ eqrcBegin eqr) (foldargs (zip [Hidden, Hidden, Hidden, Hidden, NotHidden] (psb ++ [- NotM $ App (Just meta) okhs1 (Const $ eqrcStep eqr) (foldargs (zip [Hidden, Hidden, NotHidden, Hidden, Hidden, NotHidden, NotHidden] (pss1 ++ [- NotM $ App (Just meta) okhs2 (Const $ eqrcStep eqr) (foldargs (zip [Hidden, Hidden, NotHidden, Hidden, Hidden, NotHidden, NotHidden] pss2))- ])))- ])))- )- eq_step = (costEqStep,- do ps <- replicateM 7 newPlaceholder- okh <- newOKHandle- return $ App (Just meta) okh (Const $ eqrcStep eqr) (foldargs (zip [Hidden, Hidden, NotHidden, Hidden, Hidden, NotHidden, NotHidden] ps))- )- eq_end = (costEqEnd,- do ps <- replicateM 3 newPlaceholder- okh <- newOKHandle- return $ App (Just meta) okh (Const $ eqrcEnd eqr) (foldargs (zip [Hidden, Hidden, NotHidden] ps))- )- eq_sym = (costEqSym,- do ps <- replicateM 5 newPlaceholder- okh <- newOKHandle- return $ App (Just meta) okh (Const $ eqrcSym eqr) (foldargs (zip [Hidden, Hidden, Hidden, Hidden, NotHidden] ps))- )- eq_cong = (costEqCong,- do ps <- replicateM 8 newPlaceholder- okh <- newOKHandle- return $ App (Just meta) okh (Const $ eqrcCong eqr) (foldargs (zip [Hidden, Hidden, Hidden, Hidden, NotHidden, Hidden, Hidden, NotHidden] ps))- )+ eqr = fromMaybe __IMPOSSIBLE__ meqr+ eq_end = eqEnd meta eqr+ eq_step = eqStep meta eqr+ eq_cong = eqCong meta eqr+ eq_sym = eqSym meta eqr+ eq_begin_step2 = eqBeginStep2 meta eqr - pcav i = if inftypeunknown then costInferredTypeUnkown else i- pc i = pcav i- varcost v | v < n - deffreevars = pcav (case Just usedvars of {Just usedvars -> if elem v (mapMaybe (\x -> case x of {Var v -> Just v; Const{} -> Nothing}) usedvars) then costAppVarUsed else costAppVar; Nothing -> if picksubsvar then costAppVar else costAppVarUsed})- varcost v | otherwise = pcav costAppHint- varapps = map (\v ->- (varcost v,- app Nothing (Var v)- )) [0..n - 1]- hintapps = map (\(c, hm) ->- (cost c hm,- app Nothing (Const c)- )) hints- where cost c hm = pc (case iotastep of- Just _ -> costIotaStep- Nothing -> if elem c (mapMaybe (\x -> case x of {Var{} -> Nothing; Const c -> Just c}) usedvars) then- case hm of {HMNormal -> costAppHintUsed; HMRecCall -> costAppRecCallUsed}- else- case hm of {HMNormal -> costAppHint; HMRecCall -> costAppRecCall})+ adjustCost i = if inftypeunknown then costInferredTypeUnkown else i+ varcost v | v < n - deffreevars = adjustCost $+ if elem v (mapMaybe getVar usedvars)+ then costAppVarUsed else costAppVar+ varcost v | otherwise = adjustCost costAppHint+ varapps = map (\ v -> Move (varcost v) $ app n meta Nothing (Var v)) [0..n - 1]+ hintapps = map (\(c, hm) -> Move (cost c hm) (app n meta Nothing (Const c))) hints+ where+ cost :: ConstRef o -> HintMode -> Cost+ cost c hm = adjustCost $ case (iotastep , hm) of+ (Just _ , _ ) -> costIotaStep+ (Nothing , HMNormal) ->+ if elem c (mapMaybe getConst usedvars)+ then costAppHintUsed else costAppHint+ (Nothing , HMRecCall) ->+ if elem c (mapMaybe getConst usedvars)+ then costAppRecCallUsed else costAppRecCall generics = varapps ++ hintapps- in case tt of+ in case rawValue tt of _ | eqrstate == EqRSChain ->- return $ [eq_end, eq_step]+ return [eq_end, eq_step] - HNPi _ hid possdep _ (Abs id _) -> return $ (pc (if iotastepdone then costLamUnfold else costLam), lam hid id) : (costAbsurdLam, return $ AbsurdLambda hid) : generics+ HNPi hid _ _ (Abs id _) -> return $+ (Move (adjustCost (if iotastepdone then costLamUnfold else costLam)) $ newLam hid id)+ : (Move costAbsurdLam $ return $ AbsurdLambda hid)+ : generics - HNSort (Set l) -> return $ map (\l -> (pc costSort, set l)) [0..l - 1] ++ [(pc costPi, pi Nothing True NotHidden), (pc costPi, pi Nothing True Hidden)] ++ generics+ HNSort (Set l) -> return $+ map (Move (adjustCost costSort) . set) [0..l - 1]+ ++ map (Move (adjustCost costPi) . newPi meta True) [NotHidden, Hidden]+ ++ generics - HNApp _ (Const c) _ -> do+ HNApp (Const c) _ -> do cd <- readIORef c return $ case cdcont cd of- Datatype cons _ - | eqrstate == EqRSNone-- -> map (\c -> (pc (case iotastep of {Just True -> costUnification; _ -> if length cons <= 1 then costAppConstructorSingle else costAppConstructor}), app Nothing (Const c))) cons ++- generics+ Datatype cons _ | eqrstate == EqRSNone ->+ map (\c -> Move (adjustCost $ case iotastep of+ Just True -> costUnification+ _ -> if length cons <= 1+ then costAppConstructorSingle+ else costAppConstructor)+ $ app n meta Nothing (Const c)) cons+ ++ generics+ ++ (guard (maybe False ((c ==) . eqrcId) meqr)+ *> [eq_sym, eq_cong, eq_begin_step2]) - ++ if maybe False (\eqr -> c == eqrcId eqr) meqr then [eq_sym, eq_cong, eq_begin_step_step] else [] _ | eqrstate == EqRSPrf1 -> generics ++ [eq_sym, eq_cong] _ | eqrstate == EqRSPrf2 -> generics ++ [eq_cong] @@ -228,61 +288,67 @@ _ -> return generics (RIUnifInfo cl hne : _) -> let- subsvarapps = map (\v ->- (costUnification,- app Nothing (Var v)- )) (subsvars cl)- mlam = case tt of- HNPi _ hid _ _ (Abs id _) -> [(costUnification, lam hid id)]+ subsvarapps = map (Move costUnification . app n meta Nothing . Var) (subsvars cl)+ mlam = case rawValue tt of+ HNPi hid _ _ (Abs id _) -> [Move costUnification (newLam hid id)] _ -> [] generics = mlam ++ subsvarapps - pickuid seenuids =- case f seenuids of- Just uid -> (uid, True)- Nothing -> (head seenuids, False) -- ?? which uid to pick- where f [] = Nothing- f (Nothing:_) = Just Nothing- f (Just u:us) = if elem u uids then f us else Just (Just u) in- return $ case hne of- HNApp seenuids (Var v) _ ->- let (uid, isunique) = pickuid seenuids+ return $ case rawValue hne of+ HNApp (Var v) _ ->+ let (uid, isunique) = pickUid uids $ seenUIds hne uni = case univar cl v of- Just v | v < n -> [(if isunique then costUnification else costUnificationOccurs, app uid (Var v))]+ Just v | v < n -> [Move (costUnificationIf isunique) $ app n meta uid (Var v)] _ -> [] in uni ++ generics- HNApp seenuids (Const c) _ ->- let (uid, isunique) = pickuid seenuids- in (if isunique then costUnification else costUnificationOccurs, app uid (Const c)) : generics+ HNApp (Const c) _ ->+ let (uid, isunique) = pickUid uids $ seenUIds hne+ in (Move (costUnificationIf isunique) $ app n meta uid (Const c)) : generics HNLam{} -> generics- HNPi seenuids hid possdep _ _ ->- let (uid, isunique) = pickuid seenuids- in (if isunique then costUnification else costUnificationOccurs, pi uid possdep hid) : generics- HNSort (Set l) -> map (\l -> (costUnification, set l)) [0..l] ++ generics+ HNPi hid possdep _ _ ->+ let (uid, isunique) = pickUid uids $ seenUIds hne+ in (Move (costUnificationIf isunique)+ $ newPi (fromMaybe meta uid) possdep hid) : generics+ HNSort (Set l) -> map (Move costUnification . set) [0..l] ++ generics HNSort _ -> generics _ -> __IMPOSSIBLE__ -extraref :: UId o -> [Maybe (UId o)] -> ConstRef o ->- (Int, StateT (IORef [SubConstraints (RefInfo o)], Int) IO (Exp o))-extraref meta seenuids c = (costAppExtraRef, app (head seenuids) (Const c))- where- app muid elr = do p <- newPlaceholder- okh <- newOKHandle- let uid = case muid of- Just _ -> muid- Nothing -> Just meta- return $ App uid okh elr p+ where + app :: Nat -> UId o -> Maybe (UId o) -> Elr o ->+ RefCreateEnv (RefInfo o) (Exp o)+ app n meta muid elr = do+ p <- newPlaceholder+ p <- case elr of+ Var{} -> return p+ Const c -> do+ cd <- RefCreateEnv $ lift $ readIORef c+ let dfvapp 0 _ = p+ dfvapp i n = NotM $ ALCons NotHidden+ (NotM $ App Nothing (NotM $ OKVal) (Var n) (NotM ALNil))+ (dfvapp (i - 1) (n - 1))+ -- NotHidden is ok because agda reification throws these arguments+ -- away and agsy skips typechecking them+ return $ dfvapp (cddeffreevars cd) (n - 1)+ okh <- newOKHandle+ return $ App (Just $ fromMaybe meta muid) okh elr p ++extraref :: UId o -> [Maybe (UId o)] -> ConstRef o -> Move o+extraref meta seenuids c = Move costAppExtraRef $ app (head seenuids) (Const c)+ where+ app muid elr = App (Just $ fromMaybe meta muid)+ <$> newOKHandle <*> return elr <*> newPlaceholder+ instance Refinable (ICExp o) (RefInfo o) where refinements _ infos _ = let (RICopyInfo e : _) = infos- in return [(0, return e)]+ in return [Move 0 (return e)] instance Refinable (ConstRef o) (RefInfo o) where- refinements _ [RICheckProjIndex projs] _ = return $ map (\x -> (0, return x)) projs+ refinements _ [RICheckProjIndex projs] _ = return $ map (Move 0 . return) projs refinements _ _ _ = __IMPOSSIBLE__ @@ -293,8 +359,11 @@ costAppRecCallUsed, costAppConstructor, costAppConstructorSingle, costAppExtraRef, costLam, costLamUnfold, costPi, costSort, costIotaStep, costInferredTypeUnkown, costAbsurdLam- :: Int+ :: Cost +costUnificationIf :: Bool -> Cost+costUnificationIf b = if b then costUnification else costUnificationOccurs+ costIncrease = 1000 costUnificationOccurs = 100 -- 1000001 -- 1 -- 100 costUnification = 0000@@ -315,7 +384,7 @@ costInferredTypeUnkown = 1000006 -- 100 costAbsurdLam = 0 -costEqStep, costEqEnd, costEqSym, costEqCong :: Int+costEqStep, costEqEnd, costEqSym, costEqCong :: Cost costEqStep = 2000 costEqEnd = 0 costEqSym = 0@@ -325,7 +394,7 @@ prioCompBeta, prioCompBetaStructured, prioCompareArgList, prioCompIota, prioCompChoice, prioCompUnif, prioCompCopy, prioNoIota, prioAbsurdLambda, prioProjIndex- :: Int+ :: Prio prioNo = (-1) prioTypeUnknown = 0 prioTypecheckArgList = 3000@@ -342,7 +411,7 @@ prioProjIndex = 3000 -prioTypecheck :: Bool -> Int+prioTypecheck :: Bool -> Prio prioTypecheck False = 1000 prioTypecheck True = 0
src/full/Agda/Auto/Syntax.hs view
@@ -3,7 +3,13 @@ module Agda.Auto.Syntax where import Data.IORef+import qualified Data.Set as Set +#if __GLASGOW_HASKELL__ <= 708+import Control.Applicative ( (<$>), (<*>) )+#endif++import Agda.Syntax.Common (Hiding) import Agda.Auto.NarrowingSearch #include "undefined.h"@@ -15,8 +21,15 @@ data HintMode = HMNormal | HMRecCall --data EqReasoningConsts o = EqReasoningConsts {eqrcId, eqrcBegin, eqrcStep, eqrcEnd, eqrcSym, eqrcCong :: ConstRef o} -- "_≡_", "begin_", "_≡⟨_⟩_", "_∎", "sym", "cong"+data EqReasoningConsts o = EqReasoningConsts+ { eqrcId -- "_≡_"+ , eqrcBegin -- "begin_"+ , eqrcStep -- "_≡⟨_⟩_"+ , eqrcEnd -- "_∎"+ , eqrcSym -- "sym"+ , eqrcCong -- "cong"+ :: ConstRef o+ } data EqReasoningState = EqRSNone | EqRSChain | EqRSPrf1 | EqRSPrf2 | EqRSPrf3 deriving (Eq, Show)@@ -42,7 +55,8 @@ -- (used to put cost when traversing a definition -- by construction instantiation). }- | RIUnifInfo [CAction o] (HNExp o) -- meta environment, opp hne+ | RIUnifInfo [CAction o] (HNExp o)+ -- meta environment, opp hne | RICopyInfo (ICExp o) | RIIotaStep Bool -- True - semiflex | RIInferredTypeUnknown@@ -62,19 +76,9 @@ type Nat = Int --- | 'Hiding' in Agda.-data FMode = Hidden- | Instance- | NotHidden- deriving Eq-- data MId = Id String | NoId -stringToMyId :: String -> MId-stringToMyId = Id- -- | Abstraction with maybe a name. -- -- Different from Agda, where there is also info@@ -99,7 +103,8 @@ -- | Constant definitions. data DeclCont o- = Def Nat [Clause o] (Maybe Nat) (Maybe Nat) -- maybe an index to elimand argument, maybe index to elim arg if semiflex+ = Def Nat [Clause o] (Maybe Nat) -- maybe an index to elimand argument+ (Maybe Nat) -- maybe index to elim arg if semiflex | Datatype [ConstRef o] -- constructors [ConstRef o] -- projection functions (in case it is a record) @@ -124,7 +129,16 @@ data Elr o = Var Nat | Const (ConstRef o)+ deriving (Eq) +getVar :: Elr o -> Maybe Nat+getVar (Var n) = Just n+getVar Const{} = Nothing++getConst :: Elr o -> Maybe (ConstRef o)+getConst (Const c) = Just c+getConst Var{} = Nothing+ data Sort = Set Nat | UnknownSort@@ -142,13 +156,13 @@ , appElims :: MArgList o -- ^ Arguments. }- | Lam FMode (Abs (MExp o))+ | Lam Hiding (Abs (MExp o)) -- ^ Lambda with hiding information.- | Pi (Maybe (UId o)) FMode Bool (MExp o) (Abs (MExp o))+ | Pi (Maybe (UId o)) Hiding Bool (MExp o) (Abs (MExp o)) -- ^ @True@ if possibly dependent (var not known to not occur). -- @False@ if non-dependent. | Sort Sort- | AbsurdLambda FMode+ | AbsurdLambda Hiding -- ^ Absurd lambda with hiding information. dontCare :: Exp o@@ -160,10 +174,10 @@ data ArgList o = ALNil -- ^ No more eliminations.- | ALCons FMode (MExp o) (MArgList o)+ | ALCons Hiding (MExp o) (MArgList o) -- ^ Application and tail. - | ALProj (MArgList o) (MM (ConstRef o) (RefInfo o)) FMode (MArgList o)+ | ALProj (MArgList o) (MM (ConstRef o) (RefInfo o)) Hiding (MArgList o) -- ^ proj pre args, projfcn idx, tail | ALConPar (MArgList o)@@ -172,19 +186,26 @@ -- Inserted to cover glitch of polymorphic constructor -- applications coming from Agda - type MArgList o = MM (ArgList o) (RefInfo o) -data HNExp o = HNApp [Maybe (UId o)] (Elr o) (ICArgList o)- | HNLam [Maybe (UId o)] FMode (Abs (ICExp o))- | HNPi [Maybe (UId o)] FMode Bool (ICExp o) (Abs (ICExp o))- | HNSort Sort+data WithSeenUIds a o = WithSeenUIds+ { seenUIds :: [Maybe (UId o)]+ , rawValue :: a+ } +type HNExp o = WithSeenUIds (HNExp' o) o++data HNExp' o =+ HNApp (Elr o) (ICArgList o)+ | HNLam Hiding (Abs (ICExp o))+ | HNPi Hiding Bool (ICExp o) (Abs (ICExp o))+ | HNSort Sort+ -- | Head-normal form of 'ICArgList'. First entry is exposed. -- -- Q: Why are there no projection eliminations? data HNArgList o = HNALNil- | HNALCons FMode (ICExp o) (ICArgList o)+ | HNALCons Hiding (ICExp o) (ICArgList o) | HNALConPar (ICArgList o) -- | Lazy concatenation of argument lists under explicit substitutions.@@ -233,6 +254,7 @@ detectsemiflex :: ConstRef o -> [Clause o] -> IO Bool detectsemiflex _ _ = return False -- disabled+ categorizedecl :: ConstRef o -> IO () categorizedecl c = do cd <- readIORef c@@ -248,103 +270,72 @@ -- ------------------------------------------- -metaliseokh :: MExp o -> IO (MExp o)-metaliseokh = fm- where- fm (Meta m) = return $ Meta m- fm (NotM e) = do- e <- f e- return $ NotM e- f (App uid _ elr args) = do- m <- initMeta- args <- fms args- return $ App uid (Meta m) elr args- f (Lam hid (Abs id b)) = do- b <- fm b- return $ Lam hid (Abs id b)- f (Pi uid hid posdep it (Abs id ot)) = do- it <- fm it- ot <- fm ot- return $ Pi uid hid posdep it (Abs id ot)- f e@(Sort{}) = return e-- f e@(AbsurdLambda{}) = return e-+class MetaliseOKH t where+ metaliseOKH :: t -> IO t - fms (Meta m) = return $ Meta m- fms (NotM es) = do- es <- fs es- return $ NotM es- fs ALNil = return ALNil- fs (ALCons hid a as) = do- a <- fm a- as <- fms as- return $ ALCons hid a as+instance MetaliseOKH t => MetaliseOKH (MM t a) where+ metaliseOKH e = case e of+ Meta m -> return $ Meta m+ NotM e -> NotM <$> metaliseOKH e - fs (ALProj eas idx hid as) = do- eas <- fms eas- as <- fms as- return $ ALProj eas idx hid as+instance MetaliseOKH t => MetaliseOKH (Abs t) where+ metaliseOKH (Abs id b) = Abs id <$> metaliseOKH b +instance MetaliseOKH (Exp o) where+ metaliseOKH e = case e of+ App uid okh elr args ->+ (\ m -> App uid m elr) <$> (Meta <$> initMeta) <*> metaliseOKH args+ Lam hid b -> Lam hid <$> metaliseOKH b+ Pi uid hid dep it ot ->+ Pi uid hid dep <$> metaliseOKH it <*> metaliseOKH ot+ Sort{} -> return e+ AbsurdLambda{} -> return e - fs (ALConPar as) = do- as <- fms as- return $ ALConPar as+instance MetaliseOKH (ArgList o) where+ metaliseOKH e = case e of+ ALNil -> return ALNil+ ALCons hid a as -> ALCons hid <$> metaliseOKH a <*> metaliseOKH as+ ALProj eas idx hid as ->+ (\ eas -> ALProj eas idx hid) <$> metaliseOKH eas <*> metaliseOKH as+ ALConPar as -> ALConPar <$> metaliseOKH as +metaliseokh :: MExp o -> IO (MExp o)+metaliseokh = metaliseOKH -- ------------------------------------------- -expandExp :: MExp o -> IO (MExp o)-expandExp = fm- where- fm (Meta m) = do- mb <- readIORef $ mbind m- case mb of- Nothing -> return $ Meta m- Just e -> fm (NotM e)- fm (NotM e) = do- e <- f e- return $ NotM e- f (App uid okh elr args) = do- args <- fms args- return $ App uid okh elr args- f (Lam hid (Abs id b)) = do- b <- fm b- return $ Lam hid (Abs id b)- f (Pi uid hid posdep it (Abs id ot)) = do- it <- fm it- ot <- fm ot- return $ Pi uid hid posdep it (Abs id ot)- f e@(Sort{}) = return e-- f e@(AbsurdLambda{}) = return e--- fms (Meta m) = do- mb <- readIORef $ mbind m- case mb of- Nothing -> return $ Meta m- Just es -> fms (NotM es)- fms (NotM es) = do- es <- fs es- return $ NotM es- fs ALNil = return ALNil- fs (ALCons hid a as) = do- a <- fm a- as <- fms as- return $ ALCons hid a as+class ExpandMetas t where+ expandMetas :: t -> IO t - fs (ALProj eas idx hid as) = do- idx <- expandbind idx- eas <- fms eas- as <- fms as- return $ ALProj eas idx hid as+instance ExpandMetas t => ExpandMetas (MM t a) where+ expandMetas t = case t of+ NotM e -> NotM <$> expandMetas e+ Meta m -> do+ mb <- readIORef (mbind m)+ case mb of+ Nothing -> return $ Meta m+ Just e -> NotM <$> expandMetas e +instance ExpandMetas t => ExpandMetas (Abs t) where+ expandMetas (Abs id b) = Abs id <$> expandMetas b - fs (ALConPar as) = do- as <- fms as- return $ ALConPar as+instance ExpandMetas (Exp o) where+ expandMetas t = case t of+ App uid okh elr args -> App uid okh elr <$> expandMetas args+ Lam hid b -> Lam hid <$> expandMetas b+ Pi uid hid dep it ot ->+ Pi uid hid dep <$> expandMetas it <*> expandMetas ot+ Sort{} -> return t+ AbsurdLambda{} -> return t +instance ExpandMetas (ArgList o) where+ expandMetas e = case e of+ ALNil -> return ALNil+ ALCons hid a as -> ALCons hid <$> expandMetas a <*> expandMetas as+ ALProj eas idx hid as ->+ (\ a b -> ALProj a b hid) <$> expandMetas eas+ <*> expandbind idx <*> expandMetas as+ ALConPar as -> ALConPar <$> expandMetas as -- --------------------------------- @@ -370,23 +361,27 @@ subi e (Clos (Skip : as) x) = Clos (Sub (Clos [] e) : as) x subi _ _ = __IMPOSSIBLE__ -weak :: Nat -> CExp o -> CExp o-weak n (TrBr trs e) = TrBr trs (weaki n e)+weak :: Weakening t => Nat -> t -> t+weak 0 = id+weak n = weak' n -weaki :: Nat -> Clos a o -> Clos a o-weaki 0 x = x-weaki n (Clos as x) = Clos (Weak n : as) x+class Weakening t where+ weak' :: Nat -> t -> t -weakarglist :: Nat -> ICArgList o -> ICArgList o-weakarglist 0 = id-weakarglist n = f- where f CALNil = CALNil- f (CALConcat (Clos cl as) as2) = CALConcat (Clos (Weak n : cl) as) (f as2)-weakelr :: Nat -> Elr o -> Elr o-weakelr 0 elr = elr-weakelr n (Var v) = Var (v + n)-weakelr _ elr@(Const _) = elr+instance Weakening a => Weakening (TrBr a o) where+ weak' n (TrBr trs e) = TrBr trs (weak' n e) +instance Weakening (Clos a o) where+ weak' n (Clos as x) = Clos (Weak n : as) x++instance Weakening (ICArgList o) where+ weak' n e = case e of+ CALNil -> CALNil+ CALConcat a as -> CALConcat (weak' n a) (weak' n as)++instance Weakening (Elr o) where+ weak' n = rename (n+)+ -- | Substituting for a variable. doclos :: [CAction o] -> Nat -> Either Nat (ICExp o) doclos = f 0@@ -394,7 +389,82 @@ -- ns is the number of weakenings f ns [] i = Left (ns + i) f ns (Weak n : xs) i = f (ns + n) xs i- f ns (Sub s : _ ) 0 = Right (weaki ns s)+ f ns (Sub s : _ ) 0 = Right (weak ns s) f ns (Skip : _ ) 0 = Left ns f ns (Skip : xs) i = f (ns + 1) xs (i - 1) f ns (Sub _ : xs) i = f ns xs (i - 1)+++-- | FreeVars class and instances++freeVars :: FreeVars t => t -> Set.Set Nat+freeVars = freeVarsOffset 0++class FreeVars t where+ freeVarsOffset :: Nat -> t -> Set.Set Nat++instance (FreeVars a, FreeVars b) => FreeVars (a, b) where+ freeVarsOffset n (a, b) = Set.union (freeVarsOffset n a) (freeVarsOffset n b)++instance FreeVars t => FreeVars (MM t a) where+ freeVarsOffset n e = freeVarsOffset n (rm __IMPOSSIBLE__ e)++instance FreeVars t => FreeVars (Abs t) where+ freeVarsOffset n (Abs id e) = freeVarsOffset (n + 1) e++instance FreeVars (Elr o) where+ freeVarsOffset n e = case e of+ Var v -> Set.singleton (v - n)+ Const{} -> Set.empty++instance FreeVars (Exp o) where+ freeVarsOffset n e = case e of+ App _ _ elr args -> freeVarsOffset n (elr, args)+ Lam _ b -> freeVarsOffset n b+ Pi _ _ _ it ot -> freeVarsOffset n (it, ot)+ Sort{} -> Set.empty+ AbsurdLambda{} -> Set.empty++instance FreeVars (ArgList o) where+ freeVarsOffset n es = case es of+ ALNil -> Set.empty+ ALCons _ e es -> freeVarsOffset n (e, es)+ ALConPar es -> freeVarsOffset n es+ ALProj{} -> __IMPOSSIBLE__+++-- | Renaming Typeclass and instances+rename :: Renaming t => (Nat -> Nat) -> t -> t+rename = renameOffset 0++class Renaming t where+ renameOffset :: Nat -> (Nat -> Nat) -> t -> t++instance (Renaming a, Renaming b) => Renaming (a, b) where+ renameOffset j ren (a, b) = (renameOffset j ren a, renameOffset j ren b)++instance Renaming t => Renaming (MM t a) where+ renameOffset j ren e = NotM $ renameOffset j ren (rm __IMPOSSIBLE__ e)++instance Renaming t => Renaming (Abs t) where+ renameOffset j ren (Abs id e) = Abs id $ renameOffset (j + 1) ren e++instance Renaming (Elr o) where+ renameOffset j ren e = case e of+ Var v | v >= j -> Var (ren (v - j) + j)+ _ -> e++instance Renaming (Exp o) where+ renameOffset j ren e = case e of+ App uid ok elr args -> uncurry (App uid ok) $ renameOffset j ren (elr, args)+ Lam hid e -> Lam hid (renameOffset j ren e)+ Pi a b c it ot -> uncurry (Pi a b c) $ renameOffset j ren (it, ot)+ Sort{} -> e+ AbsurdLambda{} -> e++instance Renaming (ArgList o) where+ renameOffset j ren e = case e of+ ALNil -> ALNil+ ALCons hid a as -> uncurry (ALCons hid) $ renameOffset j ren (a, as)+ ALConPar as -> ALConPar (renameOffset j ren as)+ ALProj{} -> __IMPOSSIBLE__
src/full/Agda/Auto/Typecheck.hs view
@@ -1,11 +1,11 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} module Agda.Auto.Typecheck where import Data.IORef import Control.Monad (liftM) +import Agda.Syntax.Common (Hiding (..)) import Agda.Auto.NarrowingSearch import Agda.Auto.Syntax import Agda.Auto.SearchControl@@ -16,12 +16,11 @@ -- --------------------------------- -- | Typechecker drives the solution of metas.- tcExp :: Bool -> Ctx o -> CExp o -> MExp o -> EE (MyPB o) tcExp isdep ctx typ@(TrBr typtrs ityp@(Clos _ itypexp)) trm = mbpcase prioTypeUnknown Nothing (hnn_checkstep ityp) $ \(hntyp, iotastepdone) -> mmpcase (True, prioTypecheck isdep, Just (RIMainInfo (length ctx) hntyp iotastepdone)) trm $ \trm -> case trm of- App _ okh elr args -> case hntyp of+ App _ okh elr args -> case rawValue hntyp of HNPi{} | isdep -> mpret $ Error "tcExp, dep terms should be eta-long" _ -> do (ityp, sc) <- case elr of@@ -43,17 +42,17 @@ return $ case cdcont cdef of {Constructor{} -> True; _ -> False} sc $ tcargs ndfv isdep ctx ityp args (NotM $ App Nothing (NotM OKVal) elr (NotM ALNil)) isconstructor $ \ityp _ -> mpret $ ConnectHandle okh (comp' True typ ityp)- Lam hid (Abs id1 b) -> case hntyp of- HNPi _ hid2 _ it (Abs id2 ot) | hid == hid2 ->+ Lam hid (Abs id1 b) -> case rawValue hntyp of+ HNPi hid2 _ it (Abs id2 ot) | hid == hid2 -> tcExp isdep ((pickid id1 id2, t it) : ctx) (t ot) b _ -> mpret $ Error "tcExp, type of lam should be fun or pi (and same hid)"- Pi _ _ _ it (Abs id ot) -> case hntyp of+ Pi _ _ _ it (Abs id ot) -> case rawValue hntyp of HNSort s -> mpret $ And (Just [Term ctx, Term it]) (tcExp True ctx (closify (NotM $ Sort s)) it) (tcExp isdep ((id, closify it) : ctx) (closify (NotM $ Sort s)) ot) _ -> mpret $ Error "tcExp, type of pi should be set"- Sort (Set i) -> case hntyp of+ Sort (Set i) -> case rawValue hntyp of HNSort s2 -> case s2 of Set j -> mpret $ if i < j then OK else Error "tcExp, type of set should be larger set" @@ -66,8 +65,8 @@ Sort Type -> __IMPOSSIBLE__ - AbsurdLambda hid -> case hntyp of- HNPi _ hid2 _ it _ | hid == hid2 ->+ AbsurdLambda hid -> case rawValue hntyp of+ HNPi hid2 _ it _ | hid == hid2 -> mbpcase prioAbsurdLambda Nothing (getDatatype it) $ \res -> case res of Just (indeces, cons) -> foldl (\p con -> mpret $ And Nothing p (@@ -83,8 +82,8 @@ getDatatype :: ICExp o -> EE (MyMB (Maybe (ICArgList o, [ConstRef o])) o) getDatatype t =- mbcase (hnn t) $ \hnt -> case hnt of- HNApp _ (Const c) args -> do+ mbcase (hnn t) $ \hnt -> case rawValue hnt of+ HNApp (Const c) args -> do cd <- readIORef c case cdcont cd of Datatype cons _ -> mbret $ Just (args, cons) -- ?? check that lenth args corresponds to type of datatype@@ -95,8 +94,8 @@ constructorImpossible args c = do cd <- readIORef c mbpcase prioAbsurdLambda Nothing (traversePi (-1) (Clos [] $ cdtype cd)) $ \hnot ->- case hnot of- HNApp _ _ args2 -> unequals args args2 (\_ -> mpret $ Error "not unequal") []+ case rawValue hnot of+ HNApp _ args2 -> unequals args args2 (\_ -> mpret $ Error "not unequal") [] _ -> mpret $ Error "constructorImpossible 1" unequals :: ICArgList o -> ICArgList o -> ([(Nat, HNExp o)] -> EE (MyPB o)) -> [(Nat, HNExp o)] -> EE (MyPB o)@@ -114,8 +113,8 @@ unequal e1 e2 cont unifier2 = mbpcase prioAbsurdLambda Nothing (hnn e1) $ \hne1 -> mbpcase prioAbsurdLambda Nothing (hnn e2) $ \hne2 ->- case hne2 of- HNApp _ (Var v2) es2 | v2 < 0 ->+ case rawValue hne2 of+ HNApp (Var v2) es2 | v2 < 0 -> mbpcase prioAbsurdLambda Nothing (hnarglist es2) $ \hnes2 -> case hnes2 of HNALNil -> case lookup v2 unifier2 of@@ -127,8 +126,8 @@ _ -> cc hne1 hne2 where- cc hne1 hne2 = case (hne1, hne2) of- (HNApp _ (Const c1) es1, HNApp _ (Const c2) es2) -> do+ cc hne1 hne2 = case (rawValue hne1, rawValue hne2) of+ (HNApp (Const c1) es1, HNApp (Const c2) es2) -> do cd1 <- readIORef c1 cd2 <- readIORef c2 case (cdcont cd1, cdcont cd2) of@@ -143,8 +142,8 @@ traversePi :: Int -> ICExp o -> EE (MyMB (HNExp o) o) traversePi v t = mbcase (hnn t) $ \hnt ->- case hnt of- HNPi _ _ _ _ (Abs _ ot) -> traversePi (v - 1) (subi (NotM $ App Nothing (NotM OKVal) (Var v) (NotM ALNil)) ot)+ case rawValue hnt of+ HNPi _ _ _ (Abs _ ot) -> traversePi (v - 1) $ subi (NotM $ App Nothing (NotM OKVal) (Var v) (NotM ALNil)) ot _ -> mbret hnt tcargs :: Nat -> Bool -> Ctx o -> CExp o -> MArgList o -> MExp o -> Bool ->@@ -152,8 +151,9 @@ tcargs ndfv isdep ctx ityp@(TrBr ityptrs iityp) args elimtrm isconstructor cont = mmpcase (True, prioTypecheckArgList, (Just $ RICheckElim $ isdep || isconstructor)) args $ \args' -> case args' of ALNil -> cont ityp elimtrm ALCons hid a as ->- mbpcase prioInferredTypeUnknown (Just RIInferredTypeUnknown) (hnn iityp) $ \hnityp -> case hnityp of- HNPi _ hid2 possdep it (Abs _ ot) | ndfv > 0 || copyarg a || hid == hid2 -> mpret $+ mbpcase prioInferredTypeUnknown (Just RIInferredTypeUnknown) (hnn iityp) $ \hnityp -> case rawValue hnityp of+ HNPi hid2 possdep it (Abs _ ot)+ | ndfv > 0 || copyarg a || hid == hid2 -> mpret $ And (Just ((if possdep then [Term a] else []) ++ [Term ctx, Term ityptrs])) (if ndfv > 0 then mpret OK else (tcExp (isdep || possdep) ctx (t it) a)) (tcargs (ndfv - 1) isdep ctx (sub a (t ot)) as (addend hid a elimtrm) isconstructor cont)@@ -163,8 +163,8 @@ ALProj{} | ndfv > 0 -> __IMPOSSIBLE__ ALProj preas projidx hid as ->- mbpcase prioInferredTypeUnknown (Just RIInferredTypeUnknown) (hnn iityp) $ \hnityp -> case hnityp of- HNApp _ (Const dd) _ -> do+ mbpcase prioInferredTypeUnknown (Just RIInferredTypeUnknown) (hnn iityp) $ \hnityp -> case rawValue hnityp of+ HNApp (Const dd) _ -> do dddef <- readIORef dd case cdcont dddef of Datatype _ projs ->@@ -175,8 +175,8 @@ \ityp2@(TrBr ityp2trs iityp2) elimtrm2 -> case iityp2 of Clos _ (NotM (Pi _ _ _ (NotM (App _ _ (Const dd2) _)) _)) | dd2 == dd ->- mbpcase prioInferredTypeUnknown (Just RIInferredTypeUnknown) (hnn iityp2) $ \hnityp2 -> case hnityp2 of- HNPi _ hid2 possdep it (Abs _ ot) | hid == hid2 -> mpret $+ mbpcase prioInferredTypeUnknown (Just RIInferredTypeUnknown) (hnn iityp2) $ \hnityp2 -> case rawValue hnityp2 of+ HNPi hid2 possdep it (Abs _ ot) | hid == hid2 -> mpret $ And Nothing (comp' True (TrBr ityp2trs it) ityp) (tcargs 0 isdep ctx (sub elimtrm (t ot)) as (addend hid elimtrm elimtrm2) isconstructor cont)@@ -191,7 +191,7 @@ where t = TrBr ityptrs -addend :: FMode -> MExp o -> MM (Exp o) blk -> MM (Exp o) blk+addend :: Hiding -> MExp o -> MM (Exp o) blk -> MM (Exp o) blk addend hid a (NotM (App uid okh elr as)) = NotM $ App uid okh elr (f as) where f (NotM ALNil) = NotM $ ALCons hid a (NotM $ ALNil)@@ -252,18 +252,28 @@ let ncargs = CALConcat (Clos cl args) cargs in case elr of Var v -> case doclos cl v of- Left v' -> mbret $ HNDone expmeta (HNApp (uid : seenuids) (Var v') ncargs)+ Left v' -> mbret $ HNDone expmeta+ $ WithSeenUIds (uid : seenuids)+ $ HNApp (Var v') ncargs Right f -> loop f ncargs (uid : seenuids)- Const _ -> mbret $ HNDone expmeta (HNApp (uid : seenuids) elr ncargs)+ Const _ -> mbret $ HNDone expmeta+ $ WithSeenUIds (uid : seenuids)+ $ HNApp elr ncargs Lam hid (Abs id b) -> mbcase (hnarglist cargs) $ \hncargs -> case hncargs of- HNALNil -> mbret $ HNDone expmeta (HNLam seenuids hid (Abs id (Clos (Skip : cl) b)))+ HNALNil -> mbret $ HNDone expmeta+ $ WithSeenUIds seenuids+ $ HNLam hid (Abs id (Clos (Skip : cl) b)) HNALCons _ arg cargs' -> loop (Clos (Sub arg : cl) b) cargs' seenuids HNALConPar{} -> __IMPOSSIBLE__ - Pi uid hid possdep it (Abs id ot) -> checkNoArgs cargs $ mbret $ HNDone expmeta (HNPi (uid : seenuids) hid possdep (Clos cl it) (Abs id (Clos (Skip : cl) ot)))- Sort s -> checkNoArgs cargs $ mbret $ HNDone expmeta (HNSort s)+ Pi uid hid possdep it (Abs id ot) ->+ checkNoArgs cargs $ mbret $ HNDone expmeta+ $ WithSeenUIds (uid : seenuids)+ $ HNPi hid possdep (Clos cl it) (Abs id (Clos (Skip : cl) ot))+ Sort s -> checkNoArgs cargs $ mbret+ $ HNDone expmeta $ WithSeenUIds [] $ HNSort s AbsurdLambda{} -> mbfailed "hnc: encountered absurdlambda" @@ -321,8 +331,8 @@ | PEConApp (ICExp o) (ConstRef o) [PEval o] iotastep :: Bool -> HNExp o -> EE (MyMB (Either (ICExp o, ICArgList o) (HNNBlks o)) o)-iotastep smartcheck e = case e of- HNApp _ (Const c) args -> do+iotastep smartcheck e = case rawValue e of+ HNApp (Const c) args -> do cd <- readIORef c case cdcont cd of Def narg cls _ _ ->@@ -372,8 +382,8 @@ qq where qq =- mbcase (hnn_blks a) $ \(hna, blks) -> case hna of- HNApp _ (Const c') as ->+ mbcase (hnn_blks a) $ \(hna, blks) -> case rawValue hna of+ HNApp (Const c') as -> if c == c' then mbcase (getAllArgs as) $ \as' -> if length as' == length pas then@@ -414,19 +424,13 @@ Right _ -> mpret OK noiotastep_term :: ConstRef o -> MArgList o -> EE (MyPB o)-noiotastep_term c args = f (HNApp [] (Const c) (CALConcat (Clos [] args) CALNil))- where- f hne@(HNApp _ (Const c) _) = do- cd <- readIORef c- let isshorthand =- case cdcont cd of- Def _ [(pats, _)] _ _ -> True -- all (\pat -> case pat of {PatConApp{} -> False; _ -> True}) pats- _ -> False- if isshorthand then- mpret OK- else- noiotastep hne- f _ = __IMPOSSIBLE__+noiotastep_term c args = do+ cd <- readIORef c+ case cdcont cd of+ Def _ [(pats, _)] _ _ -> mpret OK+ -- all (\pat -> case pat of {PatConApp{} -> False; _ -> True}) pats+ _ -> noiotastep $ WithSeenUIds []+ $ HNApp (Const c) $ CALConcat (Clos [] args) CALNil data CMode o = CMRigid (Maybe (Metavar (Exp o) (RefInfo o))) (HNExp o) | forall b . Refinable b (RefInfo o) => CMFlex (MM b (RefInfo o)) (CMFlex o)@@ -528,30 +532,35 @@ CMFBlocked{} -> __IMPOSSIBLE__ comphn :: Bool -> Maybe (Metavar (Exp o) (RefInfo o)) -> HNExp o -> Maybe (Metavar (Exp o) (RefInfo o)) -> HNExp o -> EE (MyPB o) comphn ineq mexpmeta1 hne1 mexpmeta2 hne2 =- case (hne1, hne2) of- (HNApp _ elr1 args1, HNApp _ elr2 args2) ->+ case (rawValue hne1, rawValue hne2) of+ (HNApp elr1 args1, HNApp elr2 args2) -> let ce = case (elr1, elr2) of- (Var v1, Var v2) -> if v1 == v2 then Nothing else Just "comphn, elr, vars not equal"- (Const c1, Const c2) -> if c1 == c2 then Nothing else Just "comphn, elr, consts not equal"+ (Var v1, Var v2) ->+ if v1 == v2 then Nothing+ else Just "comphn, elr, vars not equal"+ (Const c1, Const c2) ->+ if c1 == c2 then Nothing+ else Just "comphn, elr, consts not equal" (_, _) -> Just "comphn, elrs not equal" in case ce of Nothing -> compargs args1 args2 Just msg -> mpret $ Error msg- (HNLam _ hid1 (Abs id1 b1), HNLam _ hid2 (Abs id2 b2)) -> comp False b1 b2- (HNLam seenuids _ (Abs _ b1), HNApp uid2 elr2 args2) ->- f True b1 CALNil seenuids $ \res1 -> fhn True mexpmeta2 (HNApp uid2 (weakelr 1 elr2) (addtrailingargs (Clos [] $ NotM $ ALCons NotHidden{- arbitrary -} (NotM $ App Nothing (NotM OKVal) (Var 0) (NotM ALNil)) (NotM ALNil)) (weakarglist 1 args2))) $ \res2 -> g res1 res2- (HNApp uid1 elr1 args1, HNLam seenuids _ (Abs _ b2)) ->- fhn True mexpmeta1 (HNApp uid1 (weakelr 1 elr1) (addtrailingargs (Clos [] $ NotM $ ALCons NotHidden{- arbitrary -} (NotM $ App Nothing (NotM OKVal) (Var 0) (NotM ALNil)) (NotM ALNil)) (weakarglist 1 args1))) $ \res1 -> f True b2 CALNil seenuids $ \res2 -> g res1 res2+ (HNLam hid1 (Abs id1 b1), HNLam hid2 (Abs id2 b2)) -> comp False b1 b2+ (HNLam _ (Abs _ b1), HNApp elr2 args2) ->+ f True b1 CALNil (seenUIds hne1) $ \res1 ->+ fhn True mexpmeta2 (WithSeenUIds (seenUIds hne2) $ HNApp (weak 1 elr2) (addtrailingargs (Clos [] $ NotM $ ALCons NotHidden{- arbitrary -} (NotM $ App Nothing (NotM OKVal) (Var 0) (NotM ALNil)) (NotM ALNil)) (weak 1 args2))) $ \res2 -> g res1 res2+ (HNApp elr1 args1, HNLam _ (Abs _ b2)) ->+ fhn True mexpmeta1 (WithSeenUIds (seenUIds hne1) $ HNApp (weak 1 elr1) (addtrailingargs (Clos [] $ NotM $ ALCons NotHidden{- arbitrary -} (NotM $ App Nothing (NotM OKVal) (Var 0) (NotM ALNil)) (NotM ALNil)) (weak 1 args1))) $ \res1 -> f True b2 CALNil (seenUIds hne2) $ \res2 -> g res1 res2 {- (HNLam _ (Abs _ b1), HNApp uid2 elr2 args2) -> f True b1 CALNil $ \res1 -> g res1- (CMRigid mexpmeta2 (HNApp uid2 (weakelr 1 elr2) (addtrailingargs (Clos [] $ NotM $ ALCons NotHidden{- arbitrary -} (NotM $ App Nothing (NotM OKVal) (Var 0) (NotM ALNil)) (NotM ALNil)) (weakarglist 1 args2))))+ (CMRigid mexpmeta2 (HNApp uid2 (weak 1 elr2) (addtrailingargs (Clos [] $ NotM $ ALCons NotHidden{- arbitrary -} (NotM $ App Nothing (NotM OKVal) (Var 0) (NotM ALNil)) (NotM ALNil)) (weak 1 args2)))) (HNApp uid1 elr1 args1, HNLam _ (Abs _ b2)) -> f True b2 CALNil $ \res2 -> g- (CMRigid mexpmeta1 (HNApp uid1 (weakelr 1 elr1) (addtrailingargs (Clos [] $ NotM $ ALCons NotHidden{- arbitrary -} (NotM $ App Nothing (NotM OKVal) (Var 0) (NotM ALNil)) (NotM ALNil)) (weakarglist 1 args1))))+ (CMRigid mexpmeta1 (HNApp uid1 (weak 1 elr1) (addtrailingargs (Clos [] $ NotM $ ALCons NotHidden{- arbitrary -} (NotM $ App Nothing (NotM OKVal) (Var 0) (NotM ALNil)) (NotM ALNil)) (weak 1 args1)))) res2 -}- (HNPi _ hid1 _ it1 (Abs id1 ot1), HNPi _ hid2 _ it2 (Abs id2 ot2)) -> mpret $+ (HNPi hid1 _ it1 (Abs id1 ot1), HNPi hid2 _ it2 (Abs id2 ot2)) -> mpret $ And (Just [Term trs1, Term trs2]) (comp False it1 it2) (comp ineq ot1 ot2) (HNSort s1, HNSort s2) -> mpret $ case (s1, s2) of@@ -562,12 +571,14 @@ (Type, Set _) | ineq -> OK (Type, UnknownSort) | ineq -> OK _ -> __IMPOSSIBLE__- (HNApp uid1 (Const c1) _, _) -> case mexpmeta2 of+ (HNApp (Const c1) _, _) -> case mexpmeta2 of Nothing -> mpret $ Error "comphn, not equal (2)"- Just m2 -> mpret $ AddExtraRef "comphn: not equal, adding extra ref" m2 (extraref m2 uid1 c1)- (_, HNApp uid2 (Const c2) _) -> case mexpmeta1 of+ Just m2 -> mpret $ AddExtraRef "comphn: not equal, adding extra ref"+ m2 (extraref m2 (seenUIds hne1) c1)+ (_, HNApp (Const c2) _) -> case mexpmeta1 of Nothing -> mpret $ Error "comphn, not equal (3)"- Just m1 -> mpret $ AddExtraRef "comphn: not equal, adding extra ref" m1 (extraref m1 uid2 c2)+ Just m1 -> mpret $ AddExtraRef "comphn: not equal, adding extra ref"+ m1 (extraref m1 (seenUIds hne2) c2) (_, _) -> mpret $ Error "comphn, not equal" compargs :: ICArgList o -> ICArgList o -> EE (MyPB o)@@ -685,7 +696,7 @@ -- --------------------------------- -maybeor :: Bool -> Int -> IO (PB (RefInfo o)) -> IO (PB (RefInfo o)) ->+maybeor :: Bool -> Prio -> IO (PB (RefInfo o)) -> IO (PB (RefInfo o)) -> IO (PB (RefInfo o)) maybeor _ _ mainalt _ = mainalt @@ -738,8 +749,8 @@ HNDone{} -> do res <- hnn ce case res of- NotB hne -> case hne of- HNApp _ (Const c) _ -> do+ NotB hne -> case rawValue hne of+ HNApp (Const c) _ -> do cd <- readIORef c case cdcont cd of Constructor{} -> return False@@ -793,7 +804,6 @@ (_ : ss, ALConPar args) -> fs ss args ([], ALConPar args) -> fs [] args- -- ---------------------------------
src/full/Agda/Benchmarking.hs view
@@ -18,6 +18,9 @@ import System.IO.Unsafe +import Agda.Syntax.Concrete.Name (TopLevelModuleName)+import Agda.Syntax.Concrete.Pretty+import Agda.Syntax.Abstract.Name import Agda.Utils.Benchmark (MonadBench(..)) import qualified Agda.Utils.Benchmark as B import Agda.Utils.Null@@ -73,8 +76,10 @@ -- ^ Subphase for 'Serialization'. | Compress -- ^ Subphase for 'Serialization'.- | Operators+ | OperatorsExpr -- ^ Subphase for 'Parsing'.+ | OperatorsPattern+ -- ^ Subphase for 'Parsing'. | Free -- ^ Subphase for 'Typing': free variable computation. | OccursCheck@@ -89,13 +94,32 @@ -- ^ Subphase for 'CheckLHS': unification of the indices | InverseScopeLookup -- ^ Pretty printing names.- deriving (Eq, Ord, Show, Enum, Bounded)+ | TopModule TopLevelModuleName+ | Definition QName+ deriving (Eq, Ord, Show) instance Pretty Phase where- pretty = text . show+ pretty (TopModule m) = pretty m+ pretty (Definition q) = pretty q+ pretty a = text (show a) type Benchmark = B.Benchmark Phase type Account = B.Account Phase++isModuleAccount :: Account -> Bool+isModuleAccount [] = True+isModuleAccount (TopModule{} : _) = True+isModuleAccount _ = False++isDefAccount :: Account -> Bool+isDefAccount [] = True+isDefAccount (Definition{} : _) = True+isDefAccount _ = False++isInternalAccount :: Account -> Bool+isInternalAccount (TopModule{} : _) = False+isInternalAccount (Definition{} : _) = False+isInternalAccount _ = True -- * Benchmarking in the IO monad.
+ src/full/Agda/Compiler/Backend.hs view
@@ -0,0 +1,195 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE TypeOperators #-}++-- | Interface for compiler backend writers.+module Agda.Compiler.Backend+ ( Backend(..), Backend'(..), Recompile(..), IsMain(..)+ , Flag+ , toTreeless+ , module Agda.Syntax.Treeless+ , module Agda.TypeChecking.Monad+ -- For Agda.Main+ , backendInteraction+ , parseBackendOptions+ -- For InteractionTop+ , callBackend+ ) where++import Control.Monad.State++import qualified Data.List as List+import Data.Functor+import Data.Map (Map)+import qualified Data.Map as Map++import System.Environment+import System.Exit+import System.Console.GetOpt++import Agda.Syntax.Treeless+import Agda.TypeChecking.Monad+import Agda.TypeChecking.Reduce+import Agda.TypeChecking.Pretty as P++import Agda.Interaction.Options+import Agda.Interaction.FindFile+import Agda.Interaction.Highlighting.HTML+import Agda.Interaction.Imports (getAllWarnings')+import Agda.TypeChecking.Warnings++import Agda.Utils.FileName+import Agda.Utils.Functor+import Agda.Utils.IndexedList+import Agda.Utils.Lens+import Agda.Utils.Monad+import Agda.Utils.Pretty++import Agda.Compiler.ToTreeless+import Agda.Compiler.Common++#include "undefined.h"+import Agda.Utils.Impossible++-- Public interface -------------------------------------------------------++data Backend where+ Backend :: Backend' opts env menv mod def -> Backend++data Backend' opts env menv mod def = Backend'+ { backendName :: String+ , backendVersion :: Maybe String+ -- ^ Optional version information to be printed with @--version@.+ , options :: opts+ -- ^ Default options+ , commandLineFlags :: [OptDescr (Flag opts)]+ -- ^ Backend-specific command-line flags. Should at minimum contain a+ -- flag to enable the backend.+ , isEnabled :: opts -> Bool+ -- ^ Unless the backend has been enabled, @runAgda@ will fall back to+ -- vanilla Agda behaviour.+ , preCompile :: opts -> TCM env+ -- ^ Called after type checking completes, but before compilation starts.+ , postCompile :: env -> IsMain -> Map ModuleName mod -> TCM ()+ -- ^ Called after module compilation has completed. The @IsMain@ argument+ -- is @NotMain@ if the @--no-main@ flag is present.+ , preModule :: env -> ModuleName -> FilePath -> TCM (Recompile menv mod)+ -- ^ Called before compilation of each module. Gets the path to the+ -- @.agdai@ file to allow up-to-date checking of previously written+ -- compilation results. Should return @Skip m@ if compilation is not+ -- required.+ , postModule :: env -> menv -> IsMain -> ModuleName -> [def] -> TCM mod+ -- ^ Called after all definitions of a module has been compiled.+ , compileDef :: env -> menv -> Definition -> TCM def+ -- ^ Compile a single definition.+ , scopeCheckingSuffices :: Bool+ -- ^ True if the backend works if @--only-scope-checking@ is used.+ }++data Recompile menv mod = Recompile menv | Skip mod++callBackend :: String -> IsMain -> Interface -> TCM ()+callBackend name iMain i = do+ backends <- use stBackends+ case [ b | b@(Backend b') <- backends, backendName b' == name ] of+ Backend b : _ -> compilerMain b iMain i+ [] -> genericError $ "No backend called '" ++ name ++ "' " +++ "(installed backends: " +++ List.intercalate ", " [ backendName b | Backend b <- backends ] ++ ")"++-- Internals --------------------------------------------------------------++data BackendWithOpts opts where+ BackendWithOpts :: Backend' opts env menv mod def -> BackendWithOpts opts++backendWithOpts :: Backend -> Some BackendWithOpts+backendWithOpts (Backend backend) = Some (BackendWithOpts backend)++forgetOpts :: BackendWithOpts opts -> Backend+forgetOpts (BackendWithOpts backend) = Backend backend++bOptions :: Lens' opts (BackendWithOpts opts)+bOptions f (BackendWithOpts b) = f (options b) <&> \ opts -> BackendWithOpts b{ options = opts }++embedFlag :: Lens' a b -> Flag a -> Flag b+embedFlag l flag = l flag++embedOpt :: Lens' a b -> OptDescr (Flag a) -> OptDescr (Flag b)+embedOpt l = fmap (embedFlag l)++parseBackendOptions :: [Backend] -> [String] -> OptM ([Backend], CommandLineOptions)+parseBackendOptions backends argv =+ case makeAll backendWithOpts backends of+ Some bs -> do+ let agdaFlags = map (embedOpt lSnd) standardOptions+ backendFlags = do+ Some i <- forgetAll Some $ allIndices bs+ BackendWithOpts b <- [lookupIndex bs i]+ opt <- commandLineFlags b+ return $ embedOpt (lFst . lIndex i . bOptions) opt+ (backends, opts) <- getOptSimple argv (agdaFlags ++ backendFlags) (embedFlag lSnd . inputFlag)+ (bs, defaultOptions)+ opts <- checkOpts opts+ return (forgetAll forgetOpts backends, opts)++backendInteraction :: [Backend] -> (TCM (Maybe Interface) -> TCM ()) -> TCM (Maybe Interface) -> TCM ()+backendInteraction [] fallback check = fallback check+backendInteraction backends _ check = do+ opts <- commandLineOptions+ let backendNames = [ backendName b | Backend b <- backends ]+ err flag = genericError $ "Cannot mix --" ++ flag ++ " and backends (" ++ List.intercalate ", " backendNames ++ ")"+ when (optInteractive opts) $ err "interactive"+ when (optGHCiInteraction opts) $ err "interaction"+ mi <- check++ -- reset warnings+ stTCWarnings .= []++ noMain <- optCompileNoMain <$> pragmaOptions+ let isMain | noMain = NotMain+ | otherwise = IsMain+ case mi of+ Nothing -> genericError $ "You can only compile modules without unsolved metavariables."+ Just i -> sequence_ [ compilerMain backend isMain i | Backend backend <- backends ]++ -- print warnings that might have accumulated during compilation+ ws <- filter (not . isUnsolvedWarning . tcWarning) <$> getAllWarnings' AllWarnings RespectFlags+ unless (null ws) $ reportSDoc "warning" 1 $ P.vcat $ P.prettyTCM <$> ws+++compilerMain :: Backend' opts env menv mod def -> IsMain -> Interface -> TCM ()+compilerMain backend isMain0 i =+ inCompilerEnv i $ do+ onlyScoping <- optOnlyScopeChecking <$> commandLineOptions+ when (not (scopeCheckingSuffices backend) && onlyScoping) $+ genericError $+ "The --only-scope-checking flag cannot be combined with " +++ backendName backend ++ "."++ -- Andreas, 2017-08-23, issue #2714+ -- If the backend is invoked from Emacs, we can only get the --no-main+ -- pragma option now, coming from the interface file.+ isMain <- ifM (optCompileNoMain <$> pragmaOptions)+ {-then-} (return NotMain)+ {-else-} (return isMain0)++ env <- preCompile backend (options backend)+ mods <- doCompile isMain i $ \ isMain i -> Map.singleton (iModuleName i) <$> compileModule backend env isMain i+ setInterface i+ postCompile backend env isMain mods++compileModule :: Backend' opts env menv mod def -> env -> IsMain -> Interface -> TCM mod+compileModule backend env isMain i = do+ ifile <- maybe __IMPOSSIBLE__ filePath <$>+ (findInterfaceFile . toTopLevelModuleName =<< curMName)+ r <- preModule backend env (iModuleName i) ifile+ case r of+ Skip m -> return m+ Recompile menv -> do+ defs <- map snd . sortDefs <$> curDefs+ res <- mapM (compileDef' backend env menv <=< instantiateFull) defs+ postModule backend env menv isMain (iModuleName i) res++compileDef' :: Backend' opts env menv mod def -> env -> menv -> Definition -> TCM def+compileDef' backend env menv def = setCurrentRange (defName def) $ compileDef backend env menv def
+ src/full/Agda/Compiler/Backend.hs-boot view
@@ -0,0 +1,4 @@++module Agda.Compiler.Backend where++data Backend
src/full/Agda/Compiler/CallCompiler.hs view
@@ -8,7 +8,9 @@ import qualified Control.Exception as E import Control.Monad.Trans-import Data.List as L++import Data.List ( intercalate )+import qualified Data.List as List import System.Exit import System.IO import System.Process
src/full/Agda/Compiler/Common.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE ScopedTypeVariables #-} module Agda.Compiler.Common where @@ -14,6 +15,8 @@ import qualified Data.Set as Set import Data.Char import Data.Function+import Data.Semigroup+import Data.Monoid hiding ((<>)) import Control.Monad import Control.Monad.State hiding (mapM_, forM_, mapM, forM, sequence)@@ -28,7 +31,7 @@ import Agda.Interaction.Options import Agda.TypeChecking.Monad-import Agda.TypeChecking.Pretty+import Agda.TypeChecking.Pretty hiding ((<>)) import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope@@ -38,7 +41,7 @@ import Agda.Utils.Lens import Agda.Utils.Maybe import Agda.Utils.Monad-import Agda.Utils.Pretty+import Agda.Utils.Pretty hiding ((<>)) #include "undefined.h" import Agda.Utils.Impossible@@ -46,7 +49,16 @@ data IsMain = IsMain | NotMain deriving (Eq, Show) -doCompile :: IsMain -> Interface -> (IsMain -> Interface -> TCM ()) -> TCM ()+instance Semigroup IsMain where+ NotMain <> _ = NotMain+ _ <> NotMain = NotMain+ IsMain <> IsMain = IsMain++instance Monoid IsMain where+ mempty = IsMain+ mappend = (<>)++doCompile :: forall r. Monoid r => IsMain -> Interface -> (IsMain -> Interface -> TCM r) -> TCM r doCompile isMain i f = do -- The Agda.Primitive module is implicitly assumed to be always imported, -- even though it not necesseraly occurs in iImportedModules.@@ -54,26 +66,27 @@ [agdaPrimInter] <- filter (("Agda.Primitive"==) . prettyShow . iModuleName) . map miInterface . Map.elems <$> getVisitedModules- flip evalStateT Set.empty $ comp NotMain agdaPrimInter >> comp isMain i+ flip evalStateT Set.empty $ mappend <$> comp NotMain agdaPrimInter <*> comp isMain i where- comp :: IsMain -> Interface -> StateT (Set ModuleName) TCM ()+ comp :: IsMain -> Interface -> StateT (Set ModuleName) TCM r comp isMain i = do alreadyDone <- Set.member (iModuleName i) <$> get- when (not alreadyDone) $ do+ if alreadyDone then return mempty else do imps <- lift $ map miInterface . catMaybes <$> mapM (getVisitedModule . toTopLevelModuleName . fst) (iImportedModules i)- mapM_ (comp NotMain) imps+ ri <- mconcat <$> mapM (comp NotMain) imps lift $ setInterface i- lift $ f isMain i+ r <- lift $ f isMain i modify (Set.insert $ iModuleName i)+ return $ mappend ri r setInterface :: Interface -> TCM () setInterface i = do opts <- gets (stPersistentOptions . stPersistentState) setCommandLineOptions opts mapM_ setOptionsFromPragma (iPragmaOptions i)- stImportedModules .= Set.empty+ stImportedModules .= Set.fromList (map fst $ iImportedModules i) stCurrentModule .= Just (iModuleName i) curIF :: TCM Interface@@ -132,18 +145,19 @@ conArityAndPars :: QName -> TCM (Nat, Nat) conArityAndPars q = do def <- getConstInfo q- TelV tel _ <- telView $ defType def+ n <- typeArity (defType def) let Constructor{ conPars = np } = theDef def- n = length (telToList tel) return (n - np, np) -- | Sets up the compilation environment. inCompilerEnv :: Interface -> TCM a -> TCM a-inCompilerEnv mainI cont =+inCompilerEnv mainI cont = do -- Preserve the state (the compiler modifies the state). -- Andreas, 2014-03-23 But we might want to collect Benchmark info, -- so use localTCState.- localTCState $ do+ -- FNF, 2017-02-22 we also want to keep the warnings we have encountered,+ -- so use localTCStateSaving and pick them out.+ (a , s) <- localTCStateSaving $ do -- Compute the output directory. Note: using commandLineOptions would make -- the current pragma options persistent when we setCommandLineOptions@@ -159,8 +173,20 @@ setCommandLineOptions $ opts { optCompileDir = Just compileDir } + -- Andreas, 2017-08-23, issue #2714 recover pragma option --no-main+ -- Unfortunately, a pragma option is stored in the interface file as+ -- just a list of strings, thus, the solution is a bit of hack:+ -- We match on whether @["--no-main"]@ is one of the stored options.+ when (["--no-main"] `elem` iPragmaOptions mainI) $+ stPragmaOptions %= \ o -> o { optCompileNoMain = True }++ setScope (iInsideScope mainI) -- so that compiler errors don't use overly qualified names ignoreAbstractMode $ do cont+ -- keep generated warnings+ let newWarnings = stPostTCWarnings $ stPostScopeState $ s+ stTCWarnings .= newWarnings+ return a topLevelModuleName :: ModuleName -> TCM ModuleName topLevelModuleName m = do
− src/full/Agda/Compiler/Epic/AuxAST.hs
@@ -1,168 +0,0 @@-{-# LANGUAGE CPP #-}---- | Intermediate abstract syntax tree used in the compiler. Pretty close to--- Epic syntax.-module Agda.Compiler.Epic.AuxAST where--import Data.Set (Set)-import qualified Data.Set as Set--import Agda.Syntax.Abstract.Name--import Agda.Compiler.Epic.Interface--#include "undefined.h"-import Agda.Utils.Impossible--type Comment = String-type Inline = Bool--data Fun- = Fun- { funInline :: Inline- , funName :: Var- , funQName :: Maybe QName- , funComment :: Comment- , funArgs :: [Var]- , funExpr :: Expr- }- | EpicFun- { funName :: Var- , funQName :: Maybe QName- , funComment :: Comment- , funEpicCode :: String --EpicCode- }- deriving (Eq, Ord, Show)--data Lit- = LInt Integer- | LChar Char- | LString String- | LFloat Double- deriving (Show, Ord, Eq)---data Expr- = Var Var- | Lit Lit- | Lam Var Expr- | Con Tag QName [Expr]- | App Var [Expr]- | Case Expr [Branch]- | If Expr Expr Expr- | Let Var Expr Expr- | Lazy Expr- | UNIT- | IMPOSSIBLE- deriving (Show, Ord, Eq)--data Branch- = Branch {brTag :: Tag, brName :: QName, brVars :: [Var], brExpr :: Expr}- | BrInt {brInt :: Int, brExpr :: Expr}- | Default {brExpr :: Expr}- deriving (Show, Ord, Eq)--getBrVars :: Branch -> [Var]-getBrVars (Branch {brVars = vs}) = vs-getBrVars _ = []------------------------------------------------------------------------------------- * Some smart constructors---- | Smart constructor for let expressions to avoid unneceessary lets-lett :: Var -> Expr -> Expr -> Expr-lett v (Var v') e' = subst v v' e'-lett v e e' = if v `elem` fv e' then Let v e e' else e'---- | Some things are pointless to make lazy-lazy :: Expr -> Expr-lazy (Lazy e) = Lazy e-lazy (Lit l) = Lit l-lazy UNIT = UNIT-lazy x = Lazy x---- | If casing on the same expression in a sub-expression, we know what branch to--- pick-casee :: Expr -> [Branch] -> Expr-casee x brs = Case x [br{brExpr = casingE br (brExpr br)} | br <- brs]- where- casingE br expr = let rec = casingE br in case expr of- Var v -> Var v- Lit l -> Lit l- Lam v e -> Lam v (rec e)- Con t n es -> Con t n (map rec es)- App v es -> App v (map rec es)- Case e brs | expr == e -> case filter (sameCon br) brs of- [] -> Case (rec e) [b {brExpr = rec (brExpr b)} | b <- brs]- [b] -> substs (getBrVars br `zip` getBrVars b) (brExpr b)- _ -> __IMPOSSIBLE__- | otherwise -> Case (rec e) [b {brExpr = rec (brExpr b)} | b <- brs]- If e1 e2 e3 -> If (rec e1) (rec e2) (rec e3)- Let v e1 e2 -> Let v (rec e1) (rec e2)- Lazy e -> Lazy (rec e)- UNIT -> UNIT- IMPOSSIBLE -> IMPOSSIBLE- sameCon (Branch {brTag = t1}) (Branch {brTag = t2}) = t1 == t2- sameCon (BrInt {brInt = i1}) (BrInt {brInt = i2}) = i1 == i2- sameCon _ _ = False---- | Smart constructor for applications to avoid empty applications-apps :: Var -> [Expr] -> Expr-apps v [] = Var v-apps v as = App v as------------------------------------------------------------------------------------- * Substitution---- | Substitution-subst :: Var -- ^ Substitute this ...- -> Var -- ^ with this ...- -> Expr -- ^ in this.- -> Expr-subst var var' expr = case expr of- Var v | var == v -> Var var'- | otherwise -> Var v- Lit l -> Lit l- Lam v e | var == v -> Lam v e- | otherwise -> Lam v (subst var var' e)- Con t q es -> Con t q (map (subst var var') es)- App v es | var == v -> App var' (map (subst var var') es)- | otherwise -> App v (map (subst var var') es)- Case e brs -> Case (subst var var' e) (map (substBranch var var') brs)- If a b c -> let s = subst var var'- in If (s a) (s b) (s c)- Let v e e' | var == v -> Let v (subst var var' e) e'- | otherwise -> Let v (subst var var' e) (subst var var' e')- Lazy e -> Lazy (subst var var' e)- UNIT -> UNIT- IMPOSSIBLE -> IMPOSSIBLE--substs :: [(Var, Var)] -> Expr -> Expr-substs ss e = foldr (uncurry subst) e ss--substBranch :: Var -> Var -> Branch -> Branch-substBranch x e br = br { brExpr = subst x e (brExpr br) }---- | Get the free variables in an expression-fv :: Expr -> [Var]-fv = Set.toList . fv'- where- fv' :: Expr -> Set Var- fv' expr = case expr of- Var v -> Set.singleton v- Lit _ -> Set.empty- Lam v e1 -> Set.delete v (fv' e1)- Con _ _ es -> Set.unions (map fv' es)- App v es -> Set.insert v $ Set.unions (map fv' es)- Case e brs -> fv' e `Set.union` Set.unions (map fvBr brs)- If a b c -> Set.unions (map fv' [a,b,c])- Let v e e' -> fv' e `Set.union` (Set.delete v $ fv' e')- Lazy e -> fv' e- UNIT -> Set.empty- IMPOSSIBLE -> Set.empty-- fvBr :: Branch -> Set Var- fvBr b = case b of- Branch _ _ vs e -> fv' e Set.\\ Set.fromList vs- BrInt _ e -> fv' e- Default e -> fv' e
− src/full/Agda/Compiler/Epic/CaseOpts.hs
@@ -1,40 +0,0 @@--- | Perform simple optimisations based on case-laws-module Agda.Compiler.Epic.CaseOpts where--import Control.Applicative--import Agda.TypeChecking.Monad--import Agda.Compiler.Epic.AuxAST-import Agda.Compiler.Epic.CompileState--caseOpts :: [Fun] -> Compile TCM [Fun]-caseOpts = mapM $ \ def -> case def of- Fun{} -> do- e' <- caseOptsExpr (funExpr def)- return def { funExpr = e' }- _ -> return def---- | Run the case-opts on an expression-caseOptsExpr :: Expr -> Compile TCM Expr-caseOptsExpr expr = case expr of- Var v -> return $ Var v- Lit l -> return $ Lit l- Lam v e -> Lam v <$> caseOptsExpr e- Con c n es -> Con c n <$> mapM caseOptsExpr es- App v es -> apps v <$> mapM caseOptsExpr es- -- If there is only one constructor branch, perform a projection to get the result- Case e [Branch {brVars = vs, brExpr = eorg}] -> do- e' <- caseOptsExpr eorg- bindExpr e $ \var ->- return $ foldr (\(v, n) -> lett v $ App "proj" [Lit (LInt n), Var var]) e'- $ zip vs [0..]- -- If there is only a default branch, the case is not necessary- Case e [Default{brExpr = e'}] -> caseOptsExpr e'- Case e brs -> Case <$> caseOptsExpr e <*> (mapM (\br -> do e' <- caseOptsExpr (brExpr br)- return br {brExpr = e'}) brs)- If a b c -> If <$> caseOptsExpr a <*> caseOptsExpr b <*> caseOptsExpr c- Let v e1 e2 -> Let v <$> caseOptsExpr e1 <*> caseOptsExpr e2- Lazy e -> Lazy <$> caseOptsExpr e- UNIT -> return UNIT- IMPOSSIBLE -> return IMPOSSIBLE
− src/full/Agda/Compiler/Epic/CompileState.hs
@@ -1,215 +0,0 @@-{-# LANGUAGE CPP #-}---- | Contains the state monad that the compiler works in and some functions--- for tampering with the state.-module Agda.Compiler.Epic.CompileState where--import Control.Applicative-import Control.Monad.State-import Data.List-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Maybe-import Data.Monoid-import Data.Set (Set)-import qualified Data.Set as Set--import Agda.Compiler.Epic.AuxAST as AuxAST-import Agda.Compiler.Epic.Interface-import Agda.Interaction.Options-import Agda.Syntax.Internal-import Agda.Syntax.Concrete(TopLevelModuleName)-import Agda.Syntax.Common-import Agda.TypeChecking.Monad (TCM, internalError, defType, theDef, getConstInfo, sigDefinitions, stImports, stPersistentOptions, stPersistentState)-import qualified Agda.TypeChecking.Monad as TM-import Agda.TypeChecking.Reduce--import qualified Agda.Utils.HashMap as HM-import Agda.Utils.Lens--#include "undefined.h"-import Agda.Utils.Impossible---- | Stuff we need in our compiler-data CompileState = CompileState- { nameSupply :: [Var]- , compiledModules :: Map TopLevelModuleName (EInterface, Set FilePath)- , curModule :: EInterface- , importedModules :: EInterface- , curFun :: String- } deriving Show---- | The initial (empty) state-initCompileState :: CompileState-initCompileState = CompileState- { nameSupply = map (('h':) . show) [0 :: Integer ..]- , compiledModules = Map.empty- , curModule = mempty- , importedModules = mempty- , curFun = undefined- }---- | Compiler monad-type Compile = StateT CompileState---- | When normal errors are not enough-epicError :: String -> Compile TCM a-epicError = lift . internalError---- | Modify the state of the current module's Epic Interface-modifyEI :: (EInterface -> EInterface) -> Compile TCM ()-modifyEI f = modify $ \s -> s {curModule = f (curModule s)}---- | Get the state of the current module's Epic Interface-getsEI :: (EInterface -> a) -> Compile TCM a-getsEI f = gets (f . curModule)---- | Returns the type of a definition given its name-getType :: QName -> Compile TCM Type-getType q = do- map <- lift $ use $ stImports . sigDefinitions- return $ maybe __IMPOSSIBLE__ defType (HM.lookup q map)---- | Create a name which can be used in Epic code from a QName.-unqname :: QName -> Var-unqname qn = case nameId $ qnameName qn of- NameId name modul -> 'd' : show modul- ++ "_" ++ show name---- * State modifiers--resetNameSupply :: Compile TCM ()-resetNameSupply = modify $ \s -> s {nameSupply = nameSupply initCompileState}--getDelayed :: QName -> Compile TCM Bool-getDelayed q = lookInterface (Map.lookup q . defDelayed) (return False)--putDelayed :: QName -> Bool -> Compile TCM ()-putDelayed q d = modifyEI $ \s -> s {defDelayed = Map.insert q d (defDelayed s)}--newName :: Compile TCM Var-newName = do- n:ns <- gets nameSupply- modify $ \s -> s { nameSupply = ns}- return n--putConstrTag :: QName -> Tag -> Compile TCM ()-putConstrTag q t = modifyEI $ \s -> s { constrTags = Map.insert q t $ constrTags s }--assignConstrTag :: QName -> Compile TCM Tag-assignConstrTag constr = assignConstrTag' constr []--assignConstrTag' :: QName -> [QName] -> Compile TCM Tag-assignConstrTag' constr constrs = do- constrs <- concat <$> mapM ((getDataCon =<<) . getConData) (constr : constrs)- tags <- catMaybes <$> mapM getConstrTag' constrs- let tag = head $ map Tag [0..] \\ tags- putConstrTag constr tag- return tag--getConData :: QName -> Compile TCM QName-getConData con = do- lmap <- lift $ use $ TM.stImports . TM.sigDefinitions- case HM.lookup con lmap of- Just def -> case theDef def of- c@(TM.Constructor{}) -> return $ TM.conData c- _ -> __IMPOSSIBLE__- Nothing -> __IMPOSSIBLE__--getDataCon :: QName -> Compile TCM [QName]-getDataCon con = do- lmap <- lift $ use $ TM.stImports . TM.sigDefinitions- case HM.lookup con lmap of- Just def -> case theDef def of- d@(TM.Datatype{}) -> return $ TM.dataCons d- r@(TM.Record{}) -> return [ TM.recCon r]- _ -> __IMPOSSIBLE__- Nothing -> __IMPOSSIBLE__--getConstrTag :: QName -> Compile TCM Tag-getConstrTag con = lookInterface (Map.lookup con . constrTags)- (assignConstrTag con)--getConstrTag' :: QName -> Compile TCM (Maybe Tag)-getConstrTag' con = do- cur <- gets curModule- case Map.lookup con (constrTags cur) of- Just x -> return (Just x)- Nothing -> do- imps <- gets importedModules- return $ Map.lookup con (constrTags imps)--addDefName :: QName -> Compile TCM ()-addDefName q = do- modifyEI $ \s -> s {definitions = Set.insert (unqname q) $ definitions s }--topBindings :: Compile TCM (Set Var)-topBindings = Set.union <$> gets (definitions . importedModules) <*> gets (definitions . curModule)--getConArity :: QName -> Compile TCM Int-getConArity n = lookInterface (Map.lookup n . conArity) __IMPOSSIBLE__--putConArity :: QName -> Int -> Compile TCM ()-putConArity n p = modifyEI $ \s -> s { conArity = Map.insert n p (conArity s) }--putMain :: QName -> Compile TCM ()-putMain m = modifyEI $ \s -> s { mainName = Just m }--getMain :: Compile TCM Var-getMain = maybe (epicError "Where is main? :(") (return . unqname) =<< getsEI mainName--lookInterface :: (EInterface -> Maybe a) -> Compile TCM a -> Compile TCM a-lookInterface f def = do- cur <- gets curModule- case f cur of- Just x -> return x- Nothing -> do- imps <- gets importedModules- case f imps of- Nothing -> def- Just x -> return x--constrInScope :: QName -> Compile TCM Bool-constrInScope name = do- cur <- gets curModule- case Map.lookup name (constrTags cur) of- Just x -> return True- Nothing -> do- imps <- gets importedModules- case Map.lookup name (constrTags imps) of- Nothing -> return False- Just x -> return True--getForcedArgs :: QName -> Compile TCM ForcedArgs-getForcedArgs q = lookInterface (Map.lookup q . forcedArgs) __IMPOSSIBLE__--putForcedArgs :: QName -> ForcedArgs -> Compile TCM ()-putForcedArgs n f = do- b <- lift $ gets (optForcing . stPersistentOptions . stPersistentState)- let f' | b = f- | otherwise = replicate (length f) NotForced- modifyEI $ \s -> s {forcedArgs = Map.insert n f' $ forcedArgs s}--replaceAt :: Int -- ^ replace at- -> [a] -- ^ to replace- -> [a] -- ^ replace with- -> [a] -- ^ result?-replaceAt n xs inserts = let (as, _:bs) = splitAt n xs in as ++ inserts ++ bs---- | Copy pasted from MAlonzo, HAHA!!!--- Move somewhere else!-constructorArity :: Num a => QName -> TCM a-constructorArity q = do- def <- getConstInfo q- a <- normalise $ defType def- case theDef def of- TM.Constructor{ TM.conPars = np } -> return . fromIntegral $ arity a - np- _ -> internalError $ "constructorArity: non constructor: " ++ show q---- | Bind an expression to a fresh variable name-bindExpr :: Expr -> (Var -> Compile TCM Expr) -> Compile TCM Expr-bindExpr expr f = case expr of- AuxAST.Var v -> f v- _ -> do- v <- newName- lett v expr <$> f v
− src/full/Agda/Compiler/Epic/Compiler.hs
@@ -1,278 +0,0 @@-{-# LANGUAGE CPP #-}---- | Epic compiler backend.-module Agda.Compiler.Epic.Compiler(compilerMain) where--import Control.Applicative-import Control.Monad-import Control.Monad.Reader-import Control.Monad.State--import qualified Data.ByteString.Lazy as BS-import qualified Data.Map as Map-import Data.Maybe-import Data.Monoid-import Data.Set (Set)-import qualified Data.Set as Set--import System.Directory ( canonicalizePath, createDirectoryIfMissing- , getCurrentDirectory, setCurrentDirectory- )-import System.Exit-import System.FilePath hiding (normalise)-import System.Process hiding (env)--import Paths_Agda--import Agda.Interaction.FindFile-import Agda.Interaction.Options-import Agda.Interaction.Imports--import Agda.Syntax.Common (Delayed(..))-import qualified Agda.Syntax.Concrete.Name as CN-import Agda.Syntax.Internal hiding (Term(..))--import Agda.TypeChecking.Monad-import Agda.TypeChecking.Monad.Builtin-import Agda.TypeChecking.Serialise--import Agda.Compiler.CallCompiler--import Agda.Compiler.Epic.CompileState-import qualified Agda.Compiler.Epic.CaseOpts as COpts-import qualified Agda.Compiler.Epic.ForceConstrs as ForceC-import Agda.Compiler.Epic.Epic-import Agda.Compiler.Epic.Interface-import qualified Agda.Compiler.Epic.Erasure as Eras-import qualified Agda.Compiler.Epic.FromAgda as FAgda-import qualified Agda.Compiler.Epic.Forcing as Forcing-import qualified Agda.Compiler.Epic.Injection as ID-import qualified Agda.Compiler.Epic.NatDetection as ND-import qualified Agda.Compiler.Epic.Primitive as Prim-import qualified Agda.Compiler.Epic.Smashing as Smash--import Agda.Utils.FileName-import qualified Agda.Utils.HashMap as HMap-import Agda.Utils.Lens-import Agda.Utils.List-import Agda.Utils.Pretty ( prettyShow )--#include "undefined.h"-import Agda.Utils.Impossible--compilePrelude :: Compile TCM ()-compilePrelude = do- dataDir <- (</> "EpicInclude") <$> liftIO getDataDir- pwd <- liftIO $ getCurrentDirectory- liftIO $ setCurrentDirectory dataDir- let prelude = "AgdaPrelude"- uptodate <- liftIO $ (prelude <.> "ei") `isNewerThan` (prelude <.> "e")- when (not uptodate) $ callEpic False [ "-c" , prelude <.> "e" ]- liftIO $ setCurrentDirectory pwd---- | Compile an interface into an executable using Epic-compilerMain :: Interface -> TCM ()-compilerMain inter = do- (epic_exist, _, _) <-- liftIO $ readProcessWithExitCode- "ghc-pkg"- ["-v0", "field", "epic", "id"]- ""- case epic_exist of- ExitSuccess -> flip evalStateT initCompileState $ do- compilePrelude- setEpicDir inter- (_, imports) <- compileModule inter- main <- getMain- runEpicMain main (Set.toList imports) (iModuleName inter)-- ExitFailure _ -> internalError $ unlines- [ "Agda cannot find the Epic compiler."- , "This can perhaps be fixed by running `cabal install epic'."- , "See the README for more information."- ]--outFile :: CN.TopLevelModuleName -> Compile TCM FilePath-outFile mod = do- let (dir, fn) = splitFileName . foldl1 (</>) $ CN.moduleNameParts mod- fp | dir == "./" = "src" </> fn- | otherwise = "src" </> dir </> fn- liftIO $ createDirectoryIfMissing True ("src" </> dir)- return $ fp- where- repldot c = map (\c' -> if c' == '.' then c else c')--readEInterface :: FilePath -> Compile TCM EInterface-readEInterface file = fromMaybe __IMPOSSIBLE__- <$> lift (decode =<< liftTCM (liftIO (BS.readFile file)))--compileModule :: Interface -> Compile TCM (EInterface, Set FilePath)-compileModule i = do- cm <- gets compiledModules- let moduleName = toTopLevelModuleName $ iModuleName i- file <- outFile moduleName- case Map.lookup moduleName cm of- Just eifs -> return eifs- Nothing -> do- imports <- map miInterface . catMaybes- <$> mapM (lift . getVisitedModule . toTopLevelModuleName . fst)- (iImportedModules i)- (ifaces, limps) <- mapAndUnzipM compileModule imports- let imps = Set.unions limps- modify $ \s -> s { importedModules = importedModules s `mappend` mconcat ifaces }- ifile <- maybe __IMPOSSIBLE__ filePath <$> lift (findInterfaceFile moduleName)- let eifFile = file <.> "aei"- uptodate <- liftIO $ isNewerThan eifFile ifile- (eif, imps') <- case uptodate of- True -> do- lift $ reportSLn "compile.epic" 2 $- (prettyShow . iModuleName) i ++ " : no compilation is needed."- eif <- readEInterface eifFile- modify $ \s -> s { curModule = eif }- return (eif, Set.insert file imps)- False -> do- lift $ reportSLn "compile.epic" 1 $- "Compiling: " ++ (prettyShow . iModuleName) i- resetNameSupply- initialAnalysis i- let defns = HMap.toList $ iSignature i ^. sigDefinitions- -- Epic cannot parse files with no definitions- if (not $ null defns) then do- code <- compileDefns defns- runEpic file (Set.toList imps) code- eif <- gets curModule- lift $ do- bif <- encode eif- liftIO $ BS.writeFile eifFile bif- return (eif, Set.insert file imps)- else- flip (,) imps <$> gets curModule- modify $ \s -> s { compiledModules = (Map.insert moduleName (eif, imps') (compiledModules s))}- return (eif, imps')---- | Before running the compiler, we need to store some things in the state,--- namely constructor tags, constructor irrelevancies and the delayed field--- in functions (for coinduction).-initialAnalysis :: Interface -> Compile TCM ()-initialAnalysis inter = do- Prim.initialPrims- modify $ \s -> s {curModule = mempty}- let defs = HMap.toList $ iSignature inter ^. sigDefinitions- forM_ defs $ \(q, def) -> do- addDefName q- case theDef def of- d@(Datatype {}) -> do- saker <- ND.isNatish q d- case saker of- Just (_, [zer, suc]) -> do- putConstrTag zer (PrimTag "primZero")- putConstrTag suc (PrimTag "primSuc")- _ -> return ()- Constructor {conPars = np} -> do- putForcedArgs q . drop np . ForceC.makeForcedArgs $ defType def- putConArity q =<< lift (constructorArity q)- f@(Function{}) -> do- when ("main" == (prettyShow . qnameName) q) $ do- -- lift $ liftTCM $ checkTypeOfMain q (defType def)- putMain q- putDelayed q $ case funDelayed f of- Delayed -> True- NotDelayed -> False- a@(Axiom {}) -> do- case defEpicDef def of- Nothing -> putDelayed q True- _ -> return ()- AbstractDefn -> __IMPOSSIBLE__- _ -> return ()--idPrint :: String -> (a -> Compile TCM b) -> a -> Compile TCM b-idPrint s m x = do- lift $ reportSLn "epic.phases" 10 s- m x---- | Perform the chain of compilation stages, from definitions to epic code-compileDefns :: [(QName, Definition)] -> Compile TCM EpicCode-compileDefns defs = do- -- We need to handle sharp (coinduction) differently, so we get it here.- msharp <- lift $ getBuiltin' builtinSharp- emits <- return defs- >>= idPrint "findInjection" ID.findInjection- >>= idPrint "fromAgda" (FAgda.fromAgda msharp)- >>= idPrint "forcing" Forcing.remForced- >>= idPrint "irr" ForceC.forceConstrs- >>= idPrint "primitivise" Prim.primitivise- >>= idPrint "smash" Smash.smash'em- >>= idPrint "erasure" Eras.erasure- >>= idPrint "caseOpts" COpts.caseOpts- >>= idPrint "done" return- unlines <$> mapM prettyEpicFun emits---- | Change the current directory to Epic folder, create it if it doesn't already--- exist.-setEpicDir :: Interface -> Compile (TCMT IO) ()-setEpicDir mainI = do- let tm = toTopLevelModuleName $ iModuleName mainI- f <- lift $ findFile tm- compileDir' <- lift $ gets (fromMaybe (filePath $ CN.projectRoot f tm) .- optCompileDir . stPersistentOptions . stPersistentState)- compileDir <- liftIO $ canonicalizePath compileDir'- liftIO $ setCurrentDirectory compileDir- liftIO $ createDirectoryIfMissing False "Epic"- liftIO $ setCurrentDirectory $ compileDir </> "Epic"---- | Make a program from the given Epic code.------ The program is written to the file @../m@, where m is the last--- component of the given module name.-runEpic :: FilePath -> [FilePath] -> EpicCode -> Compile TCM ()-runEpic fp imports code = do- dataDir <- (</> "EpicInclude") <$> liftIO getDataDir- let imports' = unlines ["include \"" ++ imp ++ "\""- | imp <- (dataDir </> "AgdaPrelude.ei")- : map (<.> "ei") imports]- code' = imports' ++ code- liftIO $ writeFile (fp <.> "e") code'- callEpic True $- [ "-c", fp <.> "e" ]---- | Create the Epic main file, which calls the Agda main function-runEpicMain :: Var -> [FilePath] -> ModuleName -> Compile TCM ()-runEpicMain mainName imports m = do- dataDir <- (</> "EpicInclude") <$> liftIO getDataDir- let imports' = (dataDir </> "AgdaPrelude") : imports- let code = unlines ["include \"" ++ imp <.> "ei" ++ "\""- | imp <- imports'- ] ++ "main() -> Unit = init() ; " ++ mainName ++ "(unit)"- liftIO $ writeFile ("main" <.> "e") code-- let outputName :: CN.Name- outputName = maybe __IMPOSSIBLE__ nameConcrete $ lastMaybe $ mnameToList m-- callEpic' $ \epic ->- [ "main" <.> "e"- , "-o", ".." </> prettyShow outputName- ]- ++ epic ++ map (<.> "o") imports'---- | Call epic, with a given set of flags, if the |Bool| is True then include--- the command line flags at the end-callEpic :: Bool -> [String] -> Compile TCM ()-callEpic incEFlags flags = callEpic' $ \epicFlags ->- flags ++ if incEFlags then epicFlags else []---- | Call epic with a given set of flags, the argument function receives the flags given--- at the command line-callEpic' :: ([String] -> [String]) -> Compile TCM ()-callEpic' flags = do- epicFlags <- optEpicFlags <$> lift commandLineOptions- dataDir <- (</> "EpicInclude") <$> liftIO getDataDir- let epic = "epic"- epicCommand =- [ "-keepc"- -- , "-g"- -- , "-checking", "0"- -- , "-trace"- , "-i", dataDir </> "stdagda" <.> "c"- ] ++ flags epicFlags-- lift $ callCompiler True epic epicCommand
− src/full/Agda/Compiler/Epic/Epic.hs
@@ -1,102 +0,0 @@-{-# LANGUAGE CPP #-}---- | Pretty-print the AuxAST to valid Epic code.-module Agda.Compiler.Epic.Epic- ( prettyEpicFun- , prettyEpic- ) where--import Data.Char-import Data.List--import Agda.TypeChecking.Monad--import Agda.Compiler.Epic.AuxAST-import Agda.Compiler.Epic.CompileState-import Agda.Compiler.Epic.Interface--#include "undefined.h"-import Agda.Utils.Impossible---- * Some auxilliary pretty-printer functions-(<+>) :: String -> String -> String-x <+> y = x ++ " " ++ y-infixr 6 <+>--($$) :: String -> String -> String-x $$ y = x ++ "\n" ++ y-infixr 5 $$--many :: [String] -> String-many vs = paren $ intercalate ", " vs--many' :: [String] -> String-many' [] = ""-many' vs = paren $ intercalate ", " vs--paren :: String -> String-paren s = "(" <+> s <+> ")"--curly :: String -> String-curly s = "{-" <+> s <+> "-}"---- * Pretty-printer--- | Print a function to an Epic string-prettyEpicFun :: MonadTCM m => Fun -> Compile m String-prettyEpicFun (Fun inline name mqname comment vars e) = do- {-- defs <- lift (gets (sigDefinitions . stImports))- typ <- case mqname >>= flip M.lookup defs of- Nothing -> return "-"- Just def -> do- doc <- lift $ prettyTCM =<< normalise (defType def)- return $ show doc- -}- return $- "--" <+> comment $$- -- unlines (map ("-- " <+>) (lines typ)) $$- (if inline then "%inline " else "") ++ name- <+> many (map typVar vars) <+> "-> Any" <+> "=" <+> prettyEpic e--prettyEpicFun (EpicFun name _mqname comment def) = return $- "--" <+> comment $$- {-"%inline" <+> -} name <+> def---- | Print expression to Epic expression-prettyEpic :: Expr -> String-prettyEpic expr = case expr of- Var v -> v- Lit l -> prettyEpicLit l- Lam x e -> paren $ "\\" <+> typVar x <+> "." <+> paren (prettyEpic e)-- __IMPOSSIBLE__ -- We have lambda lifted away all λs- Con (Tag t) q args -> curly (show q) <+> paren ("Con" <+> show t <+> many (map prettyEpic args))- If a b c -> "if" <+> prettyEpic a <+> "then" <+> prettyEpic b <+> "else" <+> prettyEpic c- Let v e e' -> "let" <+> typVar v <+> "=" <+> prettyEpic (id e) <+> "in" <+> prettyEpic e'- App "proj" (Lit (LInt n) : e : es) -> paren (prettyEpic e <+> "!" <+> show n) <+> many' (map prettyEpic es)- App v es -> v <+> many' (map (prettyEpic . id) es)- Case e brs -> "case" <+> prettyEpic e <+> "of {"- <+> intercalate "\n | " (map prettyEpicBr brs) <+> "}"- Lazy e -> "lazy" <+> paren (prettyEpic e)- UNIT -> "unit"- IMPOSSIBLE -> "impossible"- _ -> __IMPOSSIBLE__--prettyEpicBr :: Branch -> String-prettyEpicBr br = case br of- Branch (Tag c) q vs e ->- curly (show q) <+>- "Con" <+> show c- <+> many (map typVar vs)- <+> "->" <+> prettyEpic e- BrInt n e -> show n <+> "->" <+> prettyEpic e- Default e -> "Default ->" <+> prettyEpic e- _ -> __IMPOSSIBLE__--prettyEpicLit :: Lit -> String-prettyEpicLit l = case l of- LInt n -> show n ++ "L"- LChar c -> show (ord c)- LString s -> show s- LFloat f -> show f--typVar :: Var -> String-typVar v = v <+> ":" <+> "Any"
− src/full/Agda/Compiler/Epic/Erasure.hs
@@ -1,227 +0,0 @@-{-# LANGUAGE CPP #-}---- | Some arguments to functions (types in particular) will not be used in the--- body. Wouldn't it be useful if these wasn't passed around at all?--- Fear not, we here perform some analysis and try to remove as many of these--- occurences as possible.------ We employ the worker/wrapper transform, so if f x1 .. xn = e--- and we notice that some is not needed we create: f' xj .. xk = e [xi := unit]--- and f x1 .. xn = f' xj .. xk.--- i.e we erase them in f' and replace by unit, and the original f function--- calls the new f'. The idea is that f should be inlined and then peace on earth.-module Agda.Compiler.Epic.Erasure where--import Control.Applicative-import Control.Monad.State-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Maybe--import Agda.Compiler.Epic.AuxAST-import Agda.Compiler.Epic.CompileState-import Agda.Compiler.Epic.Interface--import Agda.TypeChecking.Monad.Base (TCM)-import qualified Agda.Syntax.Internal as SI-import qualified Agda.Syntax.Common as Common-import Agda.TypeChecking.Monad (reportSDoc)-import Agda.TypeChecking.Pretty as P--#include "undefined.h"-import Agda.Utils.Impossible--isIrr :: Relevance -> Bool-isIrr Irr = True-isIrr Rel = False--isRel :: Relevance -> Bool-isRel = not . isIrr---- | Relevance "or"-(||-) :: Relevance -> Relevance -> Relevance-Irr ||- b = b-_ ||- _ = Rel-infixr 2 ||----- | Relevance "and"-(&&-) :: Relevance -> Relevance -> Relevance-Rel &&- b = b-_ &&- _ = Irr-infixr 3 &&---data ErasureState = ErasureState- { relevancies :: Map Var [Relevance]- , funs :: Map Var Fun- }--type Erasure = StateT ErasureState---- | Try to find as many unused variables as possible-erasure :: [Fun] -> Compile TCM [Fun]-erasure fs = do- orgRel <- gets (relevantArgs . importedModules)- (rels, erasureState) <- flip runStateT (ErasureState orgRel Map.empty) $ do- mapM_ initiate fs- fu <- gets funs- Map.mapKeys (fromMaybe __IMPOSSIBLE__ . flip Map.lookup fu) <$> step 1- modifyEI $ \s -> s { relevantArgs = Map.mapKeys funName rels }- concat <$> mapM (\f -> map (rem (relevancies erasureState)) <$> check f (Map.lookup f rels)) fs- where-- rem rels f@Fun{} = f { funExpr = removeUnused rels (funExpr f) }- rem _ f = f- -- | Perform the worker//wrapper transform- check :: Fun -> Maybe [Relevance] -> Compile TCM [Fun]- -- If the function is already marked as to inline we don't need to create a- -- new function. Also If all arguments are relevant there is nothing to do.- check f@Fun{} (Just rs) | any isIrr rs && not (funInline f) = do- f' <- (funName f ++) <$> newName- let args' = pairwiseFilter (map isRel rs) (funArgs f)- subs = pairwiseFilter (map isIrr rs) (funArgs f)- e' = foldr (\v e -> subst v "primUnit" e) (funExpr f) subs- return [ Fun { funInline = True- , funName = funName f- , funQName = funQName f- , funComment = funComment f- , funArgs = funArgs f- , funExpr = App f' $ map Var args'- }- , Fun { funInline = False- , funName = f'- , funQName = Nothing- , funComment = funComment f ++ " [ERASED]"- , funArgs = args'- , funExpr = e'- }- ]- check f _ = return [f]--removeUnused :: Map Var [Relevance] -> Expr -> Expr-removeUnused rels t = let rem = removeUnused rels- in case t of- Var _ -> t- Lit _ -> t- Lam v e -> Lam v (rem e)- Con tag qn es -> Con tag qn (map rem es)- App v es -> case Map.lookup v rels of- Just re -> App v $ zipWith (\r x -> if isIrr r then UNIT else rem x)- (re ++ repeat Rel) es- Nothing -> App v $ map rem es- Case e brs -> Case (rem e) (map (\br -> br {brExpr = rem $ brExpr br}) brs)- If a b c -> If (rem a) (rem b) (rem c)- Let v e1 e2 -> lett v (rem e1) (rem e2)- Lazy e -> lazy (rem e)- UNIT -> t- IMPOSSIBLE -> t---- | Initiate a function's relevancies-initiate :: Fun -> Erasure (Compile TCM) ()-initiate f@(Fun _ name mqname _ args _) = do- let rels = replicate (length args) Irr- modify $ \s -> s { relevancies = Map.insert name rels (relevancies s)- , funs = Map.insert name f (funs s)- }-initiate f@(EpicFun {funName = name, funQName = mqname}) = case mqname of- Just qn -> do- ty <- lift $ getType qn- let rels = initialRels ty Rel- return ()- modify $ \s -> s { relevancies = Map.insert name rels (relevancies s)- , funs = Map.insert name f (funs s)- }- Nothing -> return ()--initialRels :: SI.Type -> Relevance -> [Relevance]-initialRels ty rel = case SI.ignoreSharing $ SI.unEl ty of- SI.Pi a b -> mkRel a : initialRels (SI.unAbs b) rel- _ -> []- where- mkRel :: Common.Dom SI.Type -> Relevance- mkRel a | ignoreForced (Common.getRelevance a) = Irr- mkRel a = case SI.ignoreSharing $ SI.unEl (Common.unDom a) of- SI.Sort _ -> Irr- _ -> rel--ignoreForced :: Common.Relevance -> Bool-ignoreForced Common.Relevant = False-ignoreForced _ = True---- | Calculate if a variable is relevant in an expression-relevant-#if __GLASGOW_HASKELL__ <= 708- :: (Functor m, Monad m)-#else- :: Monad m-#endif- => Var -> Expr -> Erasure m Relevance-relevant var expr = case expr of- Var v | v == var -> return Rel- | otherwise -> return Irr- Lit _l -> return Irr- Lam _ e -> relevant var e- Con _ _ es -> relevants var es- App v es | v == var -> return Rel- | otherwise -> do- -- The variable is relevant if it is used in a relevant position- mvrs <- gets (Map.lookup v . relevancies)- case mvrs of- Nothing -> relevants var es- Just vrs ->- relevants var- $ map snd- $ filter ((==) Rel . fst)- $ zip (vrs ++ repeat Rel) es- -- foldr (||-) Irr <$> zipWith (&&-) (vrs ++ repeat Rel) <$> mapM (relevant var) es- -- {-- Case e [br@Branch{}] -> do- cvars <- foldr (||-) Irr <$> mapM (flip relevant $ brExpr br) (brVars br)- vare <- relevant var e- varbr <- relevant var (brExpr br)- return ((vare &&- cvars) ||- varbr)- -- -}- Case e brs -> (||-) <$> relevant var e <*> relevants var (map brExpr brs)- If a b c -> relevants var [a,b,c]- Let x e1 e2 -> (||-) <$> ((&&-) <$> relevant var e1 <*> relevant x e2) <*> relevant var e2- Lazy e -> relevant var e- UNIT -> return Irr- IMPOSSIBLE -> return Irr- where- relevants-#if __GLASGOW_HASKELL__ <= 708- :: (Functor m, Monad m)-#else- :: Monad m-#endif- => Var -> [Expr] -> Erasure m Relevance- relevants v [] = return Irr- relevants v (e : es) = do- r <- relevant v e- case r of- Rel -> return r- _ -> relevants v es- -- relevants v es = return . foldr (\x y -> x ||- y) Irr =<< mapM (relevant v) es---- | Try to find a fixpoint for all the functions relevance.-step :: Integer -> Erasure (Compile TCM) (Map Var [Relevance])-step nrOfLoops = do- s <- get- newRels <- (Map.fromList <$>) $ forM (Map.toList (funs s)) $ \(v, f) -> ((,) v <$>) $ do- let funRels = fromMaybe __IMPOSSIBLE__ $ Map.lookup v (relevancies s)- case f of- EpicFun{} -> return funRels- Fun{} -> do- forM (zip (funArgs f) (funRels ++ repeat Rel)) $ \ (x, rel) -> case rel of- Rel -> return Rel- Irr -> do- lift $ lift $ reportSDoc "epic.erasure" 10 $ P.text "running erasure:" P.<+> (P.text . show) (funQName f)- relevant x (funExpr f)- let relsm = newRels `Map.union` relevancies s- if relevancies s == relsm- then return newRels- else do- put s {relevancies = relsm}- step (nrOfLoops + 1)--diff :: Eq a => Map k a -> Map k a -> [(k,(a,a))]-diff m1 m2 = catMaybes $ zipWith (\(k, x) (_, y) -> if x == y then Nothing else Just (k, (x, y))) (Map.toList m1) (Map.toList m2)
− src/full/Agda/Compiler/Epic/ForceConstrs.hs
@@ -1,75 +0,0 @@-{-# LANGUAGE CPP #-}---- | Remove forced arguments from constructors.-module Agda.Compiler.Epic.ForceConstrs where--import Control.Applicative--import Agda.Compiler.Epic.AuxAST-import Agda.Compiler.Epic.CompileState-import Agda.Compiler.Epic.Interface--import qualified Agda.Syntax.Common as Common-import qualified Agda.Syntax.Internal as T-import Agda.TypeChecking.Monad (TCM)--#include "undefined.h"-import Agda.Utils.Impossible---- | Check which arguments are forced-makeForcedArgs :: T.Type -> ForcedArgs-makeForcedArgs (T.El _ term) = case T.ignoreSharing term of- T.Pi arg ab -> isRel arg : makeForcedArgs (T.unAbs ab)- _ -> []- where- isRel :: Common.Dom T.Type -> Forced- isRel arg = case Common.getRelevance arg of- Common.Relevant -> NotForced- Common.Irrelevant -> Forced- Common.UnusedArg -> Forced- Common.NonStrict -> Forced -- can never be executed- Common.Forced{} -> Forced -- It can be inferred---- | Remove forced arguments from constructors and branches-forceConstrs :: [Fun] -> Compile TCM [Fun]-forceConstrs fs = mapM forceFun fs--forceFun :: Fun -> Compile TCM Fun-forceFun e@(EpicFun{}) = return e-forceFun (Fun inline name qname comment args expr) =- Fun inline name qname comment args <$> forceExpr expr- where- -- | Remove all arguments to constructors that we don't need to store in an- -- expression.- forceExpr :: Expr -> Compile TCM Expr- forceExpr expr = case expr of- Var v -> return $ Var v- Lit l -> return $ Lit l- Lam v e -> Lam v <$> forceExpr e- Con tag q es -> do- -- We only need to apply the non-forced arguments- forcArgs <- getForcedArgs q- return $ Con tag q $ notForced forcArgs es- App v es -> App v <$> mapM forceExpr es- Case e bs -> Case <$> forceExpr e <*> mapM forceBranch bs- Let v e e' -> lett v <$> forceExpr e <*> forceExpr e'- If a b c -> If <$> forceExpr a <*> forceExpr b <*> forceExpr c- Lazy e -> Lazy <$> forceExpr e- UNIT -> return expr- IMPOSSIBLE -> return expr-- -- | Remove all the arguments that don't need to be stored in the constructor- -- For the branch- forceBranch :: Branch -> Compile TCM Branch- forceBranch br = case br of- Branch tag name vars e -> do- ir <- getForcedArgs name- let vs = notForced ir vars- subs = forced ir vars-- e'' <- if all (`notElem` fv e) subs- then return e- else __IMPOSSIBLE__ -- If so, the removal of forced args has gone wrong- Branch tag name vs <$> forceExpr e''- BrInt i e -> BrInt i <$> forceExpr e- Default e -> Default <$> forceExpr e
− src/full/Agda/Compiler/Epic/Forcing.hs
@@ -1,313 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}--module Agda.Compiler.Epic.Forcing where--import Control.Applicative-import Control.Monad-import Control.Monad.State--import Data.Char-import Data.List hiding (sort)-import Data.Maybe--import Agda.Syntax.Common-import qualified Agda.Syntax.Internal as I-import Agda.Syntax.Literal-import Agda.Syntax.Position(noRange)-import Agda.Syntax.Internal(Tele(..), Telescope, Term, Abs(..), unAbs, absName, Type, Args, QName, unEl)-import Agda.TypeChecking.Monad-import Agda.TypeChecking.Rules.LHS.Problem (FlexibleVars, defaultFlexibleVar)-import Agda.TypeChecking.Rules.LHS.Unify-import Agda.TypeChecking.Substitute- (applySubst, apply, piApply, wkS, raiseS, dropS, (++#), TelV(..))-import qualified Agda.TypeChecking.Substitute as S-import Agda.TypeChecking.Pretty as P-import Agda.TypeChecking.Reduce-import Agda.TypeChecking.Telescope-import Agda.Utils.List-import Agda.Utils.Monad-import Agda.Utils.Size-import qualified Agda.Utils.HashMap as HM--import Agda.Compiler.Epic.AuxAST-import Agda.Compiler.Epic.CompileState-import Agda.Compiler.Epic.Epic-import Agda.Compiler.Epic.Interface-import qualified Agda.Compiler.Epic.FromAgda as FA--#include "undefined.h"-import Agda.Utils.Impossible-import Agda.Utils.Lens---- | Returns how many parameters a datatype has-dataParameters :: QName -> Compile TCM Nat-dataParameters = lift . dataParametersTCM---- | Returns how many parameters a datatype has-dataParametersTCM :: QName -> TCM Nat-dataParametersTCM name = do- m <- use $ stImports . sigDefinitions- return $ maybe __IMPOSSIBLE__ (defnPars . theDef) (HM.lookup name m)- where- defnPars :: Defn -> Nat- defnPars (Datatype {dataPars = p}) = p- defnPars (Record {recPars = p}) = p- defnPars d = 0 -- error (show d) -- __IMPOSSIBLE__ -- Not so sure about this.--report :: Int -> TCM P.Doc -> Compile TCM ()-report n s = lift $ reportSDoc "epic.forcing" n s--piApplyM' :: Type -> Args -> TCM Type-piApplyM' t as = do- {- reportSDoc "" 10 $ vcat- [ text "piApplyM'"- , text "type: " <+> prettyTCM t- , text "args: " <+> prettyTCM as- ]-}- piApplyM t as--{- |-insertTele i xs t tele- tpos- tele := Gamma ; (i : T as) ; Delta- n := parameters T- xs' := xs `apply` (take n as)-becomes- tpos- ( Gamma ; xs' ; Delta[i := t] --note that Delta still reference Gamma correctly- , T as ^ (size xs')- )--we raise the type since we have added xs' new bindings before Gamma, and as can-only bind to Gamma.--}-insertTele ::(QName, Args) -> Int -- ^ ABS `pos` in tele- -> Maybe Type -- ^ If Just, it is the type to insert patterns from- -- is nothing if we only want to delete a binding.- -> Term -- ^ Term to replace at pos- -> Telescope -- ^ The telescope `tele` where everything is at- -> Compile TCM ( Telescope -- Resulting telescope- , ( Telescope- , Type -- The type at pos in tele- , Type -- The return Type of the inserted type- )- )-insertTele x 0 ins term (ExtendTel t to) = do- t' <- lift $ normalise t- report 12 $ vcat- [ text "t' :" <+> prettyTCM t'- , text "term:" <+> prettyTCM term- , text "to:" <+> prettyTCM (unAbs to)- ]- (st, arg) <- case I.ignoreSharing . I.unEl . unDom $ t' of- I.Def st es -> return (st, fromMaybe __IMPOSSIBLE__ $ I.allApplyElims es)- s -> do- report 10 $ vcat- [ text "ERROR!!!"- , text "found: " <+> (text . show) s- , text "ins" <+> (prettyTCM . fromMaybe __IMPOSSIBLE__) ins- ]- return x- -- Apply the parameters of the type of t- -- Because: parameters occurs in the type of constructors but are not bound by it.- pars <- dataParameters st- report 10 $ text "apply in insertTele"- TelV ctele ctyp <- lift $ telView =<< maybe (return $ unDom t')- (`piApplyM'` genericTake pars arg) ins--- (`piApplyM'` take (fromIntegral pars) arg) ins-{- OLD CODE:- () <- if length (take (fromIntegral pars) arg) == fromIntegral pars- then return ()- else __IMPOSSIBLE__--}- when (genericLength arg < pars) __IMPOSSIBLE__- -- we deal with absBody to directly since we remove t- return ( ctele +:+ (S.subst 0 term $ S.raiseFrom 1 (size ctele) (unAbs to))- , (ctele, S.raise (size ctele) $ unDom t , ctyp)- )- where- -- Append the telescope, we raise since we add a new binding and all the previous- -- bindings need to be preserved- (+:+) :: Telescope -> Telescope -> Telescope- EmptyTel +:+ t2 = t2- ExtendTel t t1 +:+ t2 = ExtendTel t (Abs (absName t1) $ unAbs t1 +:+ {-raise 1-} t2 )--- This case is impossible since we are trying to split a variable outside the tele-insertTele x n ins term EmptyTel = __IMPOSSIBLE__-insertTele er n ins term (ExtendTel x xs) = do- (xs', typ) <- insertTele er (n - 1) ins term (unAbs xs)- return (ExtendTel x $ Abs (absName xs) xs' , typ)---- TODO: restore fields in ConHead-mkCon :: QName -> Int -> Term-mkCon c n = I.Con (I.ConHead c Inductive []) ConOSystem $ map (defaultArg . I.var) $ downFrom n--unifyI :: Telescope -> FlexibleVars -> Type -> Args -> Args -> Compile TCM [Maybe Term]-unifyI tele flex typ a1 a2 = lift $ typeError $ NotImplemented "using the new unification algorithm for forcing"--takeTele :: Int -> Telescope -> Telescope-takeTele 0 _ = EmptyTel-takeTele n (ExtendTel t ts) = ExtendTel t $ Abs (absName ts) $ takeTele (n-1) (unAbs ts)-takeTele _ _ = __IMPOSSIBLE__---- | Main function for removing pattern matching on forced variables-remForced :: [Fun] -> Compile TCM [Fun]-remForced fs = do- defs <- lift $ use $ stImports . sigDefinitions- forM fs $ \f -> case f of- Fun{} -> case funQName f >>= flip HM.lookup defs of- Nothing -> __IMPOSSIBLE__- Just def -> do- TelV tele _ <- lift $ telView (defType def)- report 10 $ vcat- [ text "compiling fun" <+> (text . show) (funQName f)- ]- e <- forcedExpr (funArgs f) tele (funExpr f)- report 10 $ vcat- [ text "compilied fun" <+> (text . show) (funQName f)- , text "before:" <+> (text . prettyEpic) (funExpr f)- , text "after:" <+> (text . prettyEpic) e- ]- return $ f { funExpr = e}- EpicFun{} -> return f---- | For a given expression, in a certain telescope (the list of Var) is a mapping--- of variable name to the telescope.-forcedExpr :: [Var] -> Telescope -> Expr -> Compile TCM Expr-forcedExpr vars tele expr = case expr of- Var _ -> return expr- Lit _ -> return expr- Lam x e -> Lam x <$> rec e -- necessary?- Con t q es -> Con t q <$> mapM rec es- App v es -> App v <$> mapM rec es- If a b c -> If <$> rec a <*> rec b <*> rec c- Let v e1 e2 -> Let v <$> rec e1 <*> rec e2- Lazy e -> Lazy <$> rec e- UNIT -> return expr- IMPOSSIBLE -> return expr- Case v@(Var x) brs -> do- let n = fromMaybe __IMPOSSIBLE__ $ elemIndex x vars- (Case v <$>) . forM brs $ \ br -> case br of- BrInt i e -> do- (tele'', _) <- insertTele __IMPOSSIBLE__ n Nothing (I.Lit (LitChar noRange (chr i))) tele- BrInt i <$> forcedExpr (replaceAt n vars []) tele'' e-- Default e -> Default <$> rec e- Branch t constr as e -> do- typ <- getType constr- forc <- getForcedArgs constr- (tele'', (_, ntyp, ctyp)) <- insertTele __IMPOSSIBLE__ n (Just typ)- (mkCon constr (length as)) tele- ntyp <- lift $ reduce ntyp- ctyp <- lift $ reduce ctyp-- if null (forced forc as)- then Branch t constr as <$> forcedExpr (replaceAt n vars as) tele'' e- else do- -- unify the telescope type with the return type of the constructor- unif <- case (I.ignoreSharing $ unEl ntyp, I.ignoreSharing $ unEl ctyp) of- (I.Def st es1, I.Def st' es2) | st == st' -> do- let a1 = fromMaybe __IMPOSSIBLE__ $ I.allApplyElims es1- let a2 = fromMaybe __IMPOSSIBLE__ $ I.allApplyElims es2- typPars <- dataParameters st- setType <- getType st- report 10 $ vcat- [ text "ntyp:" <+> prettyTCM ntyp- , text "ctyp:" <+> prettyTCM ctyp- ]- unifyI (takeTele (n + length as) tele'')- (map defaultFlexibleVar [0 .. n + length as])- (setType `piApply` take typPars a1)- (drop typPars a1)- (drop typPars a2)- _ -> __IMPOSSIBLE__- let- lower = wkS (-1) . dropS 1- subT 0 tel = let ss = [fromMaybe (I.Var n []) t- | (n , t) <- zip [0..] unif] ++#- raiseS (length unif)- in (applySubst ss tel, lower ss)- subT n (ExtendTel a t) = let- (tb' , ss) = subT (n - 1) (unAbs t)- in (ExtendTel a $ Abs (absName t) tb', lower ss)- subT _ _ = __IMPOSSIBLE__- (tele'''', _) = subT (n + length as) tele''- report 10 $ nest 2 $ vcat- [ text "remforced"- , text "tele=" <+> prettyTCM tele''- , text "tele'=" <+> prettyTCM tele''''- , text "unif=" <+> (text . show) unif- , text "forced=" <+> (text . show) (forced forc as)- , text "constr" <+> prettyTCM constr- ]- -- replace all forced variables found using the unification- Branch t constr as <$>- replaceForced (replaceAt n vars as, reverse $ take n vars ++ as)- (tele'''') (forced forc as) unif e- _ -> __IMPOSSIBLE__- where- rec = forcedExpr vars tele---- | replace the forcedVar with pattern matching from the outside.-replaceForced :: ([Var],[Var]) -> Telescope -> [Var] -> [Maybe I.Term] -> Expr -> Compile TCM Expr-replaceForced (vars,_) tele [] _ e = forcedExpr vars tele e-replaceForced (vars,uvars) tele (fvar : fvars) unif e = do- let n = fromMaybe __IMPOSSIBLE__ $ elemIndex fvar uvars- mpos <- findPosition n unif- case mpos of- Nothing -> case fromMaybe __IMPOSSIBLE__ $ unif !!! n of- Nothing | fvar `notElem` fv e ->- replaceForced (vars, uvars) tele fvars unif e- Nothing -> do- report 10 $ vcat- [ text "failure comming!"- , text "unif" <+> (text . show) unif- , text "n" <+> (text . show) n- , text "fvar" <+> (text fvar)- , text "fv" <+> (text . show) (fv e)- ]- __IMPOSSIBLE__- Just t -> do- v <- newName- te <- FA.substTerm uvars t- subst fvar v <$> replaceForced (vars, uvars)- tele fvars unif (Let v te e)- Just (pos , term) -> do- (build, v) <- buildTerm (fromMaybe __IMPOSSIBLE__ $ uvars !!! pos) n term- build . subst fvar v <$> replaceForced (vars, uvars) tele fvars unif- e- where- sub fvar v = map $ \x -> if x == fvar then v else x---- | Given a term containg the forced var, dig out the variable by inserting--- the proper case-expressions.-buildTerm :: Var -> Nat -> Term -> Compile TCM (Expr -> Expr, Var)-buildTerm var idx (I.Shared p) = buildTerm var idx $ I.derefPtr p-buildTerm var idx (I.Var i _) | idx == i = return (id, var)-buildTerm var idx (I.Con con _ args) = do- let c = I.conName con- vs <- replicateM (length args) newName- (pos , arg) <- fromMaybe __IMPOSSIBLE__ <$> findPosition idx (map (Just . unArg) args)- (fun2 , v) <- buildTerm (fromMaybe __IMPOSSIBLE__ $ vs !!! pos) idx arg- tag <- getConstrTag c- let fun1 e = casee (Var var) [Branch tag c vs e]- return (fun1 . fun2 , v)-buildTerm _ _ _ = __IMPOSSIBLE__----- | Find the location where a certain Variable index is by searching the constructors--- aswell. i.e find a term that can be transformed into a pattern that contains the--- same value the index. This fails if no such term is present.-findPosition :: Nat -> [Maybe I.Term] -> Compile TCM (Maybe (Nat, I.Term))-findPosition var ts = (listToMaybe . catMaybes <$>) . forM (zip [0..] ts) $ \ (n, mt) -> do- ifM (maybe (return False) pred mt)- (return (Just (n, fromMaybe __IMPOSSIBLE__ mt)))- (return Nothing)- where- pred :: Term -> Compile TCM Bool- pred t = case I.ignoreSharing t of- I.Var i _ | var == i -> return True- I.Con c _ args -> do- forc <- getForcedArgs $ I.conName c- or <$> mapM (pred . unArg) (notForced forc args)- _ -> return False
− src/full/Agda/Compiler/Epic/FromAgda.hs
@@ -1,265 +0,0 @@-{-# LANGUAGE CPP #-}---- | Convert from Agda's internal representation to our auxiliary AST.-module Agda.Compiler.Epic.FromAgda where--import Control.Applicative-import Control.Monad-import Control.Monad.State-import Data.Char-import qualified Data.Map as Map-import Data.Maybe--import Agda.Syntax.Common-import Agda.Syntax.Internal hiding (Term(..))-import qualified Agda.Syntax.Internal as T-import qualified Agda.Syntax.Literal as TL-import qualified Agda.TypeChecking.CompiledClause as CC-import Agda.TypeChecking.Monad-import Agda.TypeChecking.Level (reallyUnLevelView)-import qualified Agda.TypeChecking.Substitute as S-import Agda.TypeChecking.Pretty-import Agda.Utils.List--import Agda.Compiler.Epic.AuxAST-import Agda.Compiler.Epic.CompileState-import Agda.Compiler.Epic.Interface-import Agda.Compiler.Epic.Static--import Agda.Compiler.Epic.Epic--#include "undefined.h"-import Agda.Utils.Impossible---- | Convert from Agda's internal representation to our auxiliary AST.-fromAgda :: Maybe T.Term -> [(QName, Definition)] -> Compile TCM [Fun]-fromAgda msharp defs = catMaybes <$> mapM (translateDefn msharp) defs---- | Translate an Agda definition to an Epic function where applicable-translateDefn :: Maybe T.Term -> (QName, Definition) -> Compile TCM (Maybe Fun)-translateDefn msharp (n, defini) =- let n' = unqname n- epDef = compiledEpic $ defCompiledRep defini- in case theDef defini of- d@(Datatype {}) -> do -- become functions returning unit- vars <- replicateM (dataPars d + dataIxs d) newName- return . return $ Fun True n' (Just n) ("datatype: " ++ show n) vars UNIT- f@(Function{}) -> do- let projArgs = projectionArgs f- cc = fromMaybe __IMPOSSIBLE__ $ funCompiled f- ccs <- reverseCCBody projArgs <$> normaliseStatic cc- let len = (+ projArgs) . length . namedClausePats . head . funClauses $ f- toEta = arity (defType defini) - len- -- forcing <- lift $ gets (optForcing . stPersistentOptions)- lift $ reportSDoc "epic.fromagda" 5 $ text "compiling fun:" <+> prettyTCM n- lift $ reportSDoc "epic.fromagda" 5 $ text "len:" <+> (text . show) len- lift $ reportSDoc "epic.fromagda" 5 $ text "pats:" <+> (text . show) (clausePats- $ head $ funClauses f)- modify $ \s -> s {curFun = show n}- lift $ reportSDoc "epic.fromagda" 5 $ text "ccs: " <+> (text . show) ccs- res <- return <$> (etaExpand toEta =<< compileClauses n len ccs)- pres <- case res of- Nothing -> return Nothing- Just c -> return <$> prettyEpicFun c- lift $ reportSDoc "" 5 $ text $ show pres -- (fmap prettyEpicFun res)- return res- Constructor{} -> do -- become functions returning a constructor with their tag- arit <- lift $ constructorArity n- tag <- getConstrTag n- -- Sharp has to use the primSharp function from AgdaPrelude.e- case msharp of- Just (T.Def sharp []) | sharp == n -> return <$> mkFun n n' "primSharp" 3- _ -> return <$> mkCon n tag arit- r@(Record{}) -> do- vars <- replicateM (recPars r) newName- return . return $ Fun True n' (Just n) ("record: " ++ show n) vars UNIT- a@(Axiom{}) -> do -- Axioms get their code from COMPILED_EPIC pragmas- case epDef of- Nothing -> return . return $ EpicFun n' (Just n) ("AXIOM_UNDEFINED: " ++ show n)- $ "() -> Any = lazy(error \"Axiom " ++ show n ++ " used but has no computation\")"- Just x -> return . return $ EpicFun n' (Just n) ("COMPILED_EPIC: " ++ show n) x- p@(Primitive{}) -> do -- Primitives use primitive functions from AgdaPrelude.e of the same name.- -- Hopefully they are defined!- let ar = arity $ defType defini- return <$> mkFun n n' (primName p) ar- AbstractDefn -> __IMPOSSIBLE__- where- mkFun q = mkFunGen q apps ("primitive: " ++)- mkCon q tag ari = do- let name = unqname q- mkFunGen q (flip Con q) (const $ "constructor: " ++ show q) name tag ari- mkFunGen :: QName -- ^ Original name- -> (name -> [Expr] -> Expr) -- ^ combinator- -> (name -> String) -- ^ make comment- -> Var -- ^ Name of the function- -> name -- ^ Primitive function name- -> Int -- ^ Arity ofthe function- -> Compile TCM Fun -- ^ Result?- mkFunGen qn comb sh name primname arit = do- vars <- replicateM arit newName- return $ Fun True name (Just qn) (sh primname) vars (comb primname (map Var vars))-- etaExpand :: Int -> Fun -> Compile TCM Fun- etaExpand num fun = return fun -- do-{- names <- replicateM num newName- return $ fun- { funExpr = funExpr fun @@ names- , funArgs = funArgs fun ++ names- }--}- (@@) :: Expr -> [Var] -> Expr- e @@ [] = e- e @@ vs = let ts = map Var vs in case e of- Var var -> apps var ts- Lam var expr -> case vs of- v:vs' -> subst var v expr @@ vs'- [] -> __IMPOSSIBLE__- Con tag qName es -> Con tag qName (es ++ ts)- App var es -> App var (es ++ ts)- Case expr bs -> Case expr (map (flip appBranch vs) bs)- If ea eb ec -> If ea (eb @@ vs) (ec @@ vs)- Let var el e' -> lett var el (e' @@ vs)- Lazy e' -> Lazy (e' @@ vs)- Lit _lit -> IMPOSSIBLE -- Right?- UNIT -> IMPOSSIBLE- IMPOSSIBLE -> IMPOSSIBLE-- appBranch :: Branch -> [Var] -> Branch- appBranch b vs = b {brExpr = brExpr b @@ vs}--reverseCCBody :: Int -> CC.CompiledClauses -> CC.CompiledClauses-reverseCCBody c cc = case cc of- CC.Case n (CC.Branches cop cbr lbr cabr) -> CC.Case (fmap (c+) n)- $ CC.Branches cop (Map.map (fmap $ reverseCCBody c) cbr)- (Map.map (reverseCCBody c) lbr)- (fmap (reverseCCBody c) cabr)- CC.Done i t -> CC.Done i (S.applySubst- (S.parallelS $ map (flip T.Var []) $- reverse $ take (length i) [c..])- t)- CC.Fail -> CC.Fail---- | Translate from Agda's desugared pattern matching (CompiledClauses) to our AuxAST.--- This is all done by magic. It uses 'substTerm' to translate the actual--- terms when the cases have been gone through.--- The case expressions that we get use de Bruijn indices that change after--- each case in the following way.--- Say we have this pattern:------ > f (X x y) (Y z) = term------ Initially, the variables have these indexes:------ > f 0@(X x y) 1@(Y z) = term------ The first case will be on @0@, and the variables bound inside the @X@--- pattern will replace the outer index, so we get something like this:------ > f 0 2@(Y z) = case 0 of X 0 1 -> term------ Notice how @(Y z)@ now has index @2@.--- Then the second pattern is desugared in the same way:------ > f 0 2 = case 0 of X 0 1 -> case 2 of Y 2 -> term------ This replacement is what is done using the replaceAt function.------ CompiledClauses also have default branches for when all branches fail (even--- inner branches), the catchAllBranch. Epic does not support this, so--- we have to add the catchAllBranch to each inner case (here we are calling--- it omniDefault). To avoid code duplication it is first bound by a let--- expression.-compileClauses :: QName- -> Int -- ^ Number of arguments in the definition- -> CC.CompiledClauses -> Compile TCM Fun-compileClauses name nargs c = do- let n' = unqname name- vars <- replicateM nargs newName- e <- compileClauses' vars Nothing c- return $ Fun False n' (Just name) ("function: " ++ show name) vars e- where- compileClauses' :: [Var] -> Maybe Var -> CC.CompiledClauses -> Compile TCM Expr- compileClauses' env omniDefault cc = case cc of- CC.Case (Arg _ n) nc -> case length env <= n of- True -> __IMPOSSIBLE__- False -> case CC.catchAllBranch nc of- Nothing -> Case (Var (fromMaybe __IMPOSSIBLE__ $ env !!! n)) <$>- compileCase env omniDefault n nc- Just de -> do- def <- compileClauses' env omniDefault de- bindExpr (lazy def) $ \ var ->- Case (Var (fromMaybe __IMPOSSIBLE__ $ env !!! n)) <$>- compileCase env (Just var) n nc- CC.Done _ t -> substTerm ({- reverse -} env) t- CC.Fail -> return IMPOSSIBLE-- compileCase :: [Var] -> Maybe Var -> Int -> CC.Case CC.CompiledClauses- -> Compile TCM [Branch]- compileCase env omniDefault casedvar nc = do- cb <- if Map.null (CC.conBranches nc)- -- Lit branch- then forM (Map.toList (CC.litBranches nc)) $ \(l, cc) -> do- cc' <- compileClauses' (replaceAt casedvar env []) omniDefault cc- case l of- TL.LitChar _ cha -> return $ BrInt (ord cha) cc'- -- TODO: Handle other literals- _ -> epicError $ "case on literal not supported: " ++ show l- -- Con branch- else forM (Map.toList (CC.conBranches nc)) $ \(b, CC.WithArity ar cc) -> do- arit <- getConArity b -- Andreas, 2012-10-12: is the constructor arity @ar@ from Agda the same as the one from the Epic backen?- tag <- getConstrTag b- vars <- replicateM arit newName- cc' <- compileClauses' (replaceAt casedvar env vars) omniDefault cc- return $ Branch tag b vars cc'-- case omniDefault of- Nothing -> return cb- Just cc -> do- return $ cb ++ [Default (Var cc)]---- | Translate the actual Agda terms, with an environment of all the bound variables--- from patternmatching. Agda terms are in de Bruijn so we just check the new--- names in the position.-substTerm :: [Var] -> T.Term -> Compile TCM Expr-substTerm env term = case T.ignoreSharing $ T.unSpine term of- T.Var ind es -> do- let args = fromMaybe __IMPOSSIBLE__ $ allApplyElims es- case length env <= ind of- True -> __IMPOSSIBLE__- False -> apps (fromMaybe __IMPOSSIBLE__ $ env !!! ind) <$>- mapM (substTerm env . unArg) args- T.Lam _ (Abs _ te) -> do- name <- newName- Lam name <$> substTerm (name : env) te- T.Lam _ (NoAbs _ te) -> do- name <- newName- Lam name <$> substTerm env te- T.Lit l -> Lit <$> substLit l- T.Level l -> substTerm env =<< lift (reallyUnLevelView l)- T.Def q es -> do- let args = fromMaybe __IMPOSSIBLE__ $ allApplyElims es- let name = unqname q- del <- getDelayed q- def <- theDef <$> lift (getConstInfo q)- let nr = projectionArgs def- f <- apps name . (replicate nr UNIT ++) <$> mapM (substTerm env . unArg) args- return $ case del of- True -> Lazy f- False -> f- T.Con c ci args -> do- let con = unqname $ conName c- apps con <$> mapM (substTerm env . unArg) args- T.Shared p -> substTerm env $ derefPtr p- T.Pi _ _ -> return UNIT- T.Sort _ -> return UNIT- T.MetaV _ _ -> return UNIT- T.DontCare _ -> return UNIT---- | Translate Agda literals to our AUX definition-substLit :: TL.Literal -> Compile TCM Lit-substLit lit = case lit of- TL.LitNat _ i -> return $ LInt i- TL.LitString _ s -> return $ LString s- TL.LitChar _ c -> return $ LChar c- TL.LitFloat _ f -> return $ LFloat f- _ -> epicError $ "literal not supported: " ++ show lit
− src/full/Agda/Compiler/Epic/Injection.hs
@@ -1,383 +0,0 @@-{-# LANGUAGE CPP #-}--module Agda.Compiler.Epic.Injection where--import Control.Monad.State-import Control.Monad.Reader--import Data.IntMap (IntMap)-import qualified Data.IntMap as IntMap-import Data.List-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Maybe-import Data.Set (Set)-import qualified Data.Set as Set--import Agda.Syntax.Common-import Agda.Syntax.Internal as I-import Agda.Syntax.Internal.Pattern (FunArity(..), unnumberPatVars)-import Agda.Syntax.Literal-import Agda.TypeChecking.CompiledClause-import Agda.TypeChecking.Monad-import Agda.TypeChecking.Monad.Builtin-import Agda.TypeChecking.Pretty-import Agda.TypeChecking.Reduce-import Agda.TypeChecking.Substitute-import Agda.Utils.List-import Agda.Utils.Monad-import Agda.Utils.Null--import Agda.Compiler.Epic.CompileState-import Agda.Compiler.Epic.Interface as Interface--#include "undefined.h"-import Agda.Utils.Impossible-import Agda.Utils.Lens---- | Find potentially injective functions, solve constraints to fix some constructor--- tags and make functions whose constraints are fulfilled injections-findInjection :: [(QName, Definition)] -> Compile TCM [(QName, Definition)]-findInjection defs = do- funs <- forM defs $ \(name, def) -> case theDef def of- f@(Function{}) -> isInjective name (funClauses f)- _ -> return Nothing- newNames <- Map.keys <$> gets (Interface.conArity . curModule)- injFuns <- solve newNames (catMaybes funs)- defs' <- forM defs $ \(q, def) -> case q `isIn` injFuns of- Nothing -> return (q, def)- Just inj@(InjectiveFun nvar arity) -> case theDef def of- f@(Function{}) -> do- modifyEI $ \s -> s { injectiveFuns = Map.insert q inj (injectiveFuns s) }- let ns = replicate arity (defaultArg empty)- return $ (,) q $ def { theDef = f { funCompiled = Just $ Done ns $- var $ arity - nvar - 1 } }- _ -> __IMPOSSIBLE__-- lift $ reportSLn "epic.injection" 10 $ "injfuns: " ++ show injFuns- return defs'- where- q `isIn` funs = case filter (\(nam, _) -> q == nam) funs of- [] -> Nothing- (_,x):_ -> Just x--replaceFunCC :: QName -> CompiledClauses -> Compile TCM ()-replaceFunCC name cc = lift $ do- stSignature %= updateDefinition name replaceDef- stImports %= updateDefinition name replaceDef- where- replaceDef :: Definition -> Definition- replaceDef def = case theDef def of- f@(Function{}) -> def {theDef = f { funCompiled = Just $ cc } }- x -> __IMPOSSIBLE__---- | If the pairs of constructor names have the same tags, the function is--- injective. If Nothing, the function is not injective.-type InjConstraints = Maybe [(QName,QName)]---isInjective :: QName -- ^ Name of the function being tested- -> [Clause] -- ^ The function's clauses- -> Compile TCM (Maybe ((QName, InjectiveFun)- , [(QName, QName)] -- These construtors should have the same name- ))-isInjective nam [] = return Nothing-isInjective nam cls@(cl : _) = do- lift $ reportSLn "epic.injection" 20 $ "checking isInjective " ++ show nam- let total = funArity cls- (listToMaybe . catMaybes <$>) . forM [0 .. total - 1] $ \i -> do- cli <- forM cls $ \ cl -> isInjectiveHere nam i cl- let cli' = catMaybes cli- return $ if length cli == length cli'- then Just ((nam, InjectiveFun i total), concat cli')- else Nothing--patternToTerm :: Nat -> Pattern -> Term-patternToTerm n p = case p of- VarP v -> var n- DotP t -> t- ConP c typ args -> Con c ci $ zipWith (\ arg t -> arg {unArg = t}) args- $ snd- $ foldr (\ arg (n, ts) -> (n + nrBinds arg, patternToTerm n arg : ts))- (n , [])- $ map namedArg args- where ci = fromConPatternInfo typ- LitP l -> Lit l- ProjP _ d -> Def d [] -- Andreas, 2012-10-31 that might not be enought to get a term from list of patterns (TODO)--nrBinds :: Num i => Pattern -> i-nrBinds p = case p of- VarP v -> 1- DotP t -> 0- ConP c typ args -> sum $ map (nrBinds . namedArg) args- LitP l -> 0- ProjP{} -> 0--substForDot :: [NamedArg (Pattern' a)] -> Substitution-substForDot = makeSubst 0 0 . reverse . calcDots- where- makeSubst i accum [] = raiseS (i + accum)- makeSubst i accum (True : ps) = makeSubst i (accum +1) ps- makeSubst i accum (False : ps) = consS (var $ i + accum) $ makeSubst (i+1) accum ps-- calcDots = concatMap calcDots' . map namedArg- calcDots' p = case p of- VarP v -> [False]- DotP t -> [True]- ConP c typ args -> calcDots args- LitP l -> [False]- ProjP{} -> [False]--isInjectiveHere :: QName -- ^ Name of the function being tested- -> Int -- ^ The current argument- -> Clause- -> Compile TCM InjConstraints-isInjectiveHere nam idx clause = do- lift $ reportSDoc "epic.injection" 40 $ sep- [ text "isInjectiveHere"- , prettyTCM nam- , text ("argumentNo=" ++ show idx)- -- , prettyTCM (clausePats clause)- ]- case compiledClauseBody clause of- Nothing -> return emptyC- Just body -> do- let vars = unnumberPatVars $ namedClausePats clause- let t = patternToTerm idxR $ namedArg $ fromMaybe __IMPOSSIBLE__ $- vars !!! idx- t' = applySubst (substForDot $ namedClausePats clause) t- idxR = sum . map (nrBinds . namedArg) . drop (idx + 1) $ vars- body' <- lift $ reduce body- lift $ reportSLn "epic.injection" 40 "reduced body"- injFs <- gets (injectiveFuns . importedModules)- lift $ reportSLn "epic.injection" 40 "calculated injFs"- res <- (t' <: body') `runReaderT` (Map.insert nam (InjectiveFun idx- (length (namedClausePats clause))) injFs)- lift $ reportSDoc "epic.injection" 20 $ vcat- [ text "isInjective:" <+> text (show nam)- , text "at Index :" <+> text (show idx)- , nest 2 $ vcat- [ text "clause :" <+> text (show clause)- , text "t :" <+> prettyTCM t- , text "idxR :" <+> (text . show) idxR- , text "body' :" <+> (text . show) body'- ]- , text "res :" <+> text (show res)- ]- return res---- | Turn NATURAL literal n into suc^n zero.-litToCon :: Literal -> TCM Term-litToCon l = case l of- LitNat r n | n > 0 -> apply1 <$> primSuc <*> litToCon (LitNat r (n - 1))- | otherwise -> primZero--- LitLevel _ n -> -- Does not really matter- lit -> return $ Lit lit--litInt :: Literal -> Bool-litInt LitNat{} = True-litInt _ = False--insertAt :: (Nat,Term) -> Term -> Term-insertAt (index, ins) = applySubst $- [var i | i <- [0 .. index - 1]] ++# consS ins (raiseS $ index + 1)--solve :: [QName] -> [((QName, InjectiveFun), [(QName,QName)])] -> Compile TCM [(QName, InjectiveFun)]-solve newNames xs = do- lift $ reportSDoc "epic.injection" 30 $- sep $ text "Epic.Injection.solve" : map prettyTCM newNames- -- Only primitive lists should be in the current module at this point,- -- but we still want them- conGraph <- Map.union <$> gets (constrTags . curModule) <*> gets (constrTags . importedModules)- (funs, mconstr) <- ($ xs) $ flip foldM ([] , Just $ initialTags conGraph newNames) $ \ (xs , prev) (fun , con) -> do- m <- foldM solvable prev con- return $ case m of- Nothing -> (xs, prev)- Just next -> (fun : xs, m)- case mconstr of- Nothing -> __IMPOSSIBLE__- Just constr -> updateTags constr- return funs- where- solvable :: Maybe Tags -> (QName, QName)- -> Compile TCM (Maybe Tags)- solvable Nothing _ = return Nothing- solvable (Just st) (c1, c2) = unify c1 c2 st-- updateTags :: Tags -> Compile TCM ()- updateTags tags = do- let (hasTags, eqs) = Map.partition isTag (constrGroup tags)- isTag (IsTag _) = True- isTag _ = False- forM_ (Map.toList hasTags) $ \ (c, tagged) -> case tagged of- IsTag tag -> putCon c tag- _ -> __IMPOSSIBLE__- case Map.toList eqs of- (c, Same n) : _ -> do- let grp = fromMaybe __IMPOSSIBLE__ $ IntMap.lookup n $ eqGroups tags- tag <- assignConstrTag' c (Set.toList grp)- updateTags . fromMaybe __IMPOSSIBLE__ =<< setTag n tag tags { constrGroup = eqs }- _ -> return ()- putCon :: QName -> Tag -> Compile TCM ()- putCon con tag = do- m <- gets (constrTags . importedModules)- case Map.lookup con m of- Nothing -> putConstrTag con tag- Just _ -> return () -- old--emptyC :: InjConstraints-emptyC = Just []--addConstraint :: QName -> QName -> InjConstraints -> InjConstraints-addConstraint q1 q2 Nothing = Nothing-addConstraint q1 q2 (Just xs) = Just (if q1 == q2 then xs else (q1,q2) : xs)--unionConstraints :: [InjConstraints] -> InjConstraints-unionConstraints [] = Just []-unionConstraints (Nothing : _) = Nothing-unionConstraints (Just c : cs) = do- cs' <- unionConstraints cs- return (c ++ cs')---- | Are two terms injectible?--- Tries to find a mapping between constructors that equates the terms.------ Precondition: t1 is normalised, t2 is in WHNF--- When reducing t2, it may become a literal, which makes this not work in some cases...-class Injectible a where- (<:) :: a -> a -> ReaderT (Map QName InjectiveFun) (Compile TCM) InjConstraints--instance Injectible a => Injectible (Arg a) where- a1 <: a2 = unArg a1 <: unArg a2--instance Injectible a => Injectible [a] where- l1 <: l2- | length l1 == length l2 = unionConstraints <$> zipWithM (<:) l1 l2- | otherwise = return Nothing--instance Injectible a => Injectible (Elim' a) where- e1 <: e2 =- case (e1, e2) of- (Proj _ f1, Proj _ f2) | f1==f2 -> return $ Just []- (Apply a1, Apply a2) -> a1 <: a2- _ -> return Nothing--instance Injectible Term where- t1 <: t2 = do- injs <- ask- -- Andreas, 2013-10-18: ignoring the precondition (NF, WHNF) since I am not maintaining it- -- in recursive calls.- -- The original code did not follow this invariant in the Var-Var and Def-Def case,- -- thus, I am not trusting it. Also the call site does not seem to ensure it.- -- It could be restored by only reducing the right argument in the Arg-instance.-- -- (t1, t2) <- lift . lift . reduce $ (t1, t2) -- NOTE: reduce *introduces* Lit! Loops!- case (ignoreSharing t1, ignoreSharing t2) of- (Lit l, Lit l') | l == l' -> return $ Just []- (Lit l, _) | litInt l -> do- l' <- lift . lift $ litToCon l- l' <: t2- (_, Lit l) | litInt l -> do- l' <- lift . lift $ litToCon l- t1 <: l'- (_, Def n2 es2) | Just (InjectiveFun argn arit) <- Map.lookup n2 injs -> do- if genericLength es2 /= arit- then return Nothing- else do- case es2 !!! argn of- Nothing -> __IMPOSSIBLE__- Just (Proj{}) -> __IMPOSSIBLE__- Just (Apply a) -> t1 <: unArg a- (Var i1 es1, Var i2 es2) | i1 == i2 -> es1 <: es2- (Def q1 es1, Def q2 es2) | q1 == q2 -> es1 <: es2- (Con con1 _ args1, Con con2 _ args2) -> do- let c1 = conName con1- c2 = conName con2- args1' <- flip notForced args1 <$> do lift . getForcedArgs $ c1- args2' <- flip notForced args2 <$> do lift . getForcedArgs $ c2- addConstraint c1 c2 <$> do- args1' <: args2'- _ -> return Nothing-{-- (_, Def n2 args2) | Just (InjectiveFun argn arit) <- Map.lookup n2 injs -> do- if genericLength args2 /= arit- then return Nothing- else do- arg <- lift . lift . reduce $ unArg $ args2 !! argn- t1 <: arg- (Var n1 args1, Var n2 args2) | n1 == n2 && length args1 == length args2 -> do- args1' <- map unArg <$> mapM (lift . lift . reduce) args1- args2' <- map unArg <$> mapM (lift . lift . reduce) args2- unionConstraints <$> zipWithM (\a b -> (a <: b)) args1' args2'- (Def q1 args1, Def q2 args2) | q1 == q2 && length args1 == length args2 -> do- args1' <- map unArg <$> mapM (lift . lift . reduce) args1- args2' <- map unArg <$> mapM (lift . lift . reduce) args2- unionConstraints <$> zipWithM (\a b -> (a <: b)) args1' args2'- (Con con1 _ args1, Con con2 _ args2) -> do- let c1 = conName con1- c2 = conName con2- args1' <- map unArg <$> flip notForced args1 <$> getForcedArgs c1- args2' <- map unArg <$> (mapM (lift . lift . reduce) =<< flip notForced args2 <$> getForcedArgs c2)- if length args1' == length args2'- then addConstraint c1 c2 <$> unionConstraints <$> zipWithM (\a b -> (a <: b)) args1' args2'- else return Nothing- _ -> return Nothing--}-data TagEq- = Same Int- | IsTag Tag- deriving Eq--data Tags = Tags- { eqGroups :: IntMap (Set QName)- , constrGroup :: Map QName TagEq- }--initialTags :: Map QName Tag -> [QName] -> Tags-initialTags setTags newNames = Tags- { eqGroups = IntMap.fromList $ zip [0..] (map Set.singleton newNames)- , constrGroup = Map.map IsTag setTags `Map.union` Map.fromList (zip newNames (map Same [0..]))- }--unify :: QName -> QName -> Tags -> Compile TCM (Maybe Tags)-unify c1 c2 ts = do- let g1 = constrGroup ts !!!! c1- g2 = constrGroup ts !!!! c2- case (g1, g2) of- (Same n1, Same n2) | n1 == n2 -> return $ Just ts- (IsTag t1, IsTag t2) | t1 == t2 -> return $ Just ts- (Same n1, Same n2) -> mergeGroups n1 n2 ts- (Same n1, IsTag t2) -> setTag n1 t2 ts- (IsTag t1 , Same n2) -> setTag n2 t1 ts- _ -> return $ Nothing--setTag :: Int -> Tag -> Tags -> Compile TCM (Maybe Tags)-setTag gid tag ts = return $ Just $ ts- { constrGroup = foldr (\ c -> Map.insert c (IsTag tag))- (constrGroup ts)- (Set.toList $ fromMaybe __IMPOSSIBLE__ $ IntMap.lookup gid $ eqGroups ts) }--mergeGroups :: Int -> Int -> Tags -> Compile TCM (Maybe Tags)-mergeGroups n1 n2 ts = do- let g1s = fromMaybe __IMPOSSIBLE__ $ IntMap.lookup n1 $ eqGroups ts- g2s = fromMaybe __IMPOSSIBLE__ $ IntMap.lookup n2 $ eqGroups ts- gs = Set.union g1s g2s- g1l = Set.toList g1s- g2l = Set.toList g2s- ifNotM (andM $ zipWith unifiable g1l g2l)- (return Nothing) $- return $ Just $ ts- { eqGroups = IntMap.delete n2 $ IntMap.insert n1 gs (eqGroups ts)- , constrGroup = Map.fromList [ (e2, Same n1) | e2 <- g2l ] `Map.union` constrGroup ts- }--unifiable :: QName -> QName -> Compile TCM Bool-unifiable c1 c2 = do- d1 <- getConData c1- d2 <- getConData c2- return $ d1 /= d2--(!!!!) :: Ord k => Map k v -> k -> v-m !!!! k = case Map.lookup k m of- Nothing -> __IMPOSSIBLE__- Just x -> x
− src/full/Agda/Compiler/Epic/Interface.hs
@@ -1,89 +0,0 @@-{-# LANGUAGE DeriveDataTypeable #-}---- | Epic interface data structure, which is serialisable and stored for each--- compiled file-module Agda.Compiler.Epic.Interface where--import Control.Monad--import Data.Function-import Data.Map(Map)-import Data.Semigroup (Semigroup, Monoid, (<>), mempty, mappend)-import Data.Set (Set)-import Data.Typeable ( Typeable )--import Agda.Syntax.Common (Nat)-import Agda.Syntax.Internal--type Var = String-data Tag = Tag Int- | PrimTag Var- deriving (Show, Eq, Ord, Typeable)--data Forced = NotForced | Forced- deriving (Show, Typeable, Eq)---- | Filter a list using a list of Bools specifying what to keep.-pairwiseFilter :: [Bool] -> [a] -> [a]-pairwiseFilter (True :bs) (a:as) = a : pairwiseFilter bs as-pairwiseFilter (False:bs) (_:as) = pairwiseFilter bs as-pairwiseFilter _ _ = []--notForced :: ForcedArgs -> [a] -> [a]-notForced = pairwiseFilter . map (== NotForced)--forced :: ForcedArgs -> [a] -> [a]-forced = pairwiseFilter . map (== Forced)--data Relevance- = Irr- | Rel- deriving (Eq, Ord, Show, Typeable)--type ForcedArgs = [Forced]-type RelevantArgs = [Relevance]--data InjectiveFun = InjectiveFun- { injArg :: Nat- , injArity :: Nat- }- deriving (Show, Typeable, Eq)--data EInterface = EInterface- { constrTags :: Map QName Tag- , definitions :: Set Var- , defDelayed :: Map QName Bool- , conArity :: Map QName Int- , mainName :: Maybe QName- , relevantArgs :: Map Var RelevantArgs- , forcedArgs :: Map QName ForcedArgs- , injectiveFuns :: Map QName InjectiveFun- } deriving (Typeable, Show)--instance Semigroup EInterface where- x <> y = EInterface- { constrTags = comb constrTags- , definitions = comb definitions- , defDelayed = comb defDelayed- , conArity = comb conArity- , mainName = mainName x `mplus` mainName y- , relevantArgs = comb relevantArgs- , forcedArgs = comb forcedArgs- , injectiveFuns = comb injectiveFuns- }- where- comb :: Semigroup a => (EInterface -> a) -> a- comb f = ((<>) `on` f) x y--instance Monoid EInterface where- mempty = EInterface- { constrTags = mempty- , definitions = mempty- , defDelayed = mempty- , conArity = mempty- , mainName = Nothing- , relevantArgs = mempty- , forcedArgs = mempty- , injectiveFuns = mempty- }- mappend = (<>)
− src/full/Agda/Compiler/Epic/NatDetection.hs
@@ -1,80 +0,0 @@-{-# LANGUAGE CPP #-}---- | Detect if a datatype could be represented as a primitive integer.--- If it has one constructor with no arguments and one with a recursive--- argument this is true. This is done using IrrFilters which filter out--- forced arguments, so for example Fin becomes primitive.-module Agda.Compiler.Epic.NatDetection where--import Control.Applicative-import Control.Monad-import Control.Monad.State-import Data.Function-import Data.List-import Data.Maybe--import Agda.Syntax.Common-import Agda.Syntax.Internal-import Agda.TypeChecking.Monad-import Agda.Utils.Monad (andM)--import Agda.Compiler.Epic.CompileState-import Agda.Compiler.Epic.Interface--import qualified Agda.Utils.HashMap as HM--#include "undefined.h"-import Agda.Utils.Impossible-import Agda.Utils.Lens---- | Get a list of all the datatypes that look like nats. The [QName] is on the--- form [zeroConstr, sucConstr]-getNatish :: Compile TCM [(ForcedArgs, [QName])]-getNatish = do- sig <- lift $ use $ stImports . sigDefinitions- let defs = HM.toList sig- fmap catMaybes $ forM defs $ \(q, def) ->- case theDef def of- d@(Datatype {}) -> isNatish q d-- _ -> return Nothing--isNatish :: QName -> Defn -> Compile TCM (Maybe (ForcedArgs, [QName]))-isNatish q d = do -- A datatype ...- case dataCons d of- constrs | length constrs == 2 -> do -- with two constructors ...- b <- andM $ map constrInScope constrs- if b- then do- z <- zip constrs <$> mapM getForcedArgs constrs- case sortBy (compare `on` nrRel . snd) z of- [(cz,fz), (cs,fs)] -> do- sig <- lift $ use $ stImports . sigDefinitions- let ts = defType $ sig HM.! cs- nr = dataPars d- return $ do- guard (nrRel fz == 0) -- where one constructor has zero arguments ...- guard (nrRel fs == 1) -- and the other one one argument ...- guard (isRec ((fromMaybe __IMPOSSIBLE__ $ elemIndex NotForced fs) + nr) ts q) -- which is recursive.- return (fs, [cz, cs]) -- It's natish!- _ -> return Nothing- else return Nothing- _ -> return Nothing---- | Count the number of relevant arguments-nrRel :: ForcedArgs -> Integer-nrRel = sum . map (const 1) . filter (== NotForced)---- | Check if argument n is recursive-isRec :: Int -> Type -> QName -> Bool-isRec 0 (El _ t) dat = case ignoreSharing t of- Pi arg _ -> argIsDef (unDom arg) dat- _ -> False-isRec n (El _ t) dat = case t of- Pi _ ab -> isRec (n - 1) (unAbs ab) dat- _ -> False--argIsDef :: Type -> QName -> Bool-argIsDef (El _ t) dat = case ignoreSharing t of- Def q _ -> q == dat- _ -> False
− src/full/Agda/Compiler/Epic/Primitive.hs
@@ -1,213 +0,0 @@-{-# LANGUAGE CPP #-}---- | Change constructors and cases on builtins and natish datatypes to use--- primitive data-module Agda.Compiler.Epic.Primitive where--import Control.Applicative-import Control.Monad-import Control.Monad.Trans-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Maybe--import Agda.Syntax.Internal(QName)-import qualified Agda.Syntax.Internal as T-import Agda.TypeChecking.Monad hiding (defName)-import Agda.TypeChecking.Monad.Builtin-import Agda.Utils.Monad (andM)--import Agda.Compiler.Epic.AuxAST-import Agda.Compiler.Epic.CompileState-import Agda.Compiler.Epic.Interface-import Agda.Compiler.Epic.NatDetection--import Agda.Utils.List-import Agda.Utils.Impossible--#include "undefined.h"--{- Stacken, Heapen -- Optimizern -}--data PrimTransform = PrimTF- { mapCon :: Map QName Var- , translateCase :: Expr -> [Branch] -> Expr- }--prZero, prSuc, prTrue, prFalse, prPred, prNatEquality :: Var-prZero = "primZero"-prSuc = "primSuc"-prTrue = "primTrue"-prFalse = "primFalse"-prPred = "primPred"-prNatEquality = "primNatEquality"---- | Change constructors and cases on builtins and natish datatypes to use--- primitive data-primitivise :: [Fun] -> Compile TCM [Fun]-primitivise funs = do- ptfs <- getBuiltins- natish <- getNatish- mapM (primFun $ ptfs ++ map (uncurry natPrimTF) natish) funs---- | Map primitive constructors to primitive tags-initialPrims :: Compile TCM () -- [Fun]-initialPrims = do- -- TODO: Natishness is calculated here and could be stored so it does not have- -- to be recalculated in primitivise- natish <- getNatish- -- This has to be done because injection detection may otherwise flag injections- -- between non-primitive and primitive datatypes in the wrong way- sequence_ [zipWithM_ putConstrTag [zc, sc] (prim [prZero, prSuc])- | (_, [zc, sc]) <- natish]- sequence_- [ [builtinNil, builtinCons] ~> tags [0, 1]- , [builtinZero, builtinSuc ] ~> prim [prZero, prSuc]- , [builtinLevelZero, builtinLevelSuc] ~> prim [prZero, prSuc]- , [builtinTrue, builtinFalse] ~> prim [prTrue, prFalse]- , [builtinRefl] ~> tags [0]- ]- where- prim = map PrimTag- tags = map Tag- constrs ~> tags = do- builtins <- lift $ mapM getBuiltin' constrs- if all isJust builtins- then do- let names = map (defName . fromMaybe __IMPOSSIBLE__) builtins- -- b <- and <$> mapM constrInScope names- -- if b then return $ Just (transf names) else return Nothing- zipWithM_ putConstrTag names tags- else return ()---- | Build transforms using the names of builtins-getBuiltins :: Compile TCM [PrimTransform]-getBuiltins =- catMaybes <$> sequence- [ [builtinZero, builtinSuc ] ~> natPrimTF [NotForced]- -- ? is this ok to have [NotForced]- , [builtinLevelZero, builtinLevelSuc] ~> natPrimTF [NotForced]- , [builtinTrue, builtinFalse] ~> boolPrimTF- ]- where- constrs ~> transf = do- builtins <- lift $ mapM getBuiltin' constrs- if all isJust builtins- then do- let names = map (defName . fromMaybe __IMPOSSIBLE__) builtins- b <- andM $ map constrInScope names- if b then return $ Just (transf names) else return Nothing- else return Nothing--defName :: T.Term -> QName-defName v = case T.ignoreSharing v of- T.Def q [] -> q- T.Con q ci [] -> T.conName q- _ -> __IMPOSSIBLE__---- | Translation to primitive integer functions-natPrimTF :: ForcedArgs -> [QName] -> PrimTransform-natPrimTF filt [zero, suc] = PrimTF- { mapCon = Map.fromList [(zero, prZero), (suc, prSuc)]- , translateCase = \ce brs -> case brs of- -- Assuming only the first two branches are relevant when casing on Nats- (Branch _ n vs e:Branch _ _n' vs'' e'':_) ->- if n == zero- then primNatCaseZS ce e (headWithDefault __IMPOSSIBLE__ vs'') e''- else primNatCaseZS ce e'' (headWithDefault __IMPOSSIBLE__ vs) e- (Branch _ n vs e:Default e'':_) ->- if n == zero- then primNatCaseZD ce e e'' -- zero- else primNatCaseZS ce e'' (headWithDefault __IMPOSSIBLE__ vs) e -- suc- [ Branch _ n vs e ] ->- if n == zero- then e- else lett (headWithDefault __IMPOSSIBLE__ vs) (App prPred [ce]) e- _ -> __IMPOSSIBLE__- }-natPrimTF _ _ = __IMPOSSIBLE__---- | Corresponds to a case for natural numbers-primNatCaseZS :: Expr -- ^ Expression that is cased on- -> Expr -- ^ Expression for the zero branch- -> Var -- ^ Variable that is bound in suc branch- -> Expr -- ^ Expression used for suc branch- -> Expr -- ^ Result?-primNatCaseZS n zeroBr v sucBr =- If (App prNatEquality [n, Var prZero]) zeroBr (lett v (App prPred [n]) sucBr)---- | Corresponds to a case with a zero and default branch-primNatCaseZD :: Expr -- ^ Expression that is cased on- -> Expr -- ^ Zero branch- -> Expr -- ^ Default branch- -> Expr -- ^ Result?-primNatCaseZD n zeroBr defBr = If (App prNatEquality [n, Var prZero]) zeroBr defBr---- | Translation to primitive bool functions-boolPrimTF :: [QName] -> PrimTransform-boolPrimTF [true, false] = PrimTF- { mapCon = Map.fromList [(true, prTrue), (false, prFalse)]- , translateCase = \ce brs ->- case brs of- (Branch _ n _vs e:b':_) ->- (if n == true- then If ce e (brExpr b')- else If ce (brExpr b') e)- _ -> __IMPOSSIBLE__- }-boolPrimTF _ = __IMPOSSIBLE__---- | Change all the primitives in the function using the PrimTransform-primFun :: [PrimTransform] -> Fun -> Compile TCM Fun-primFun ptfs (Fun i n qn c args e) =- Fun i n qn c args <$> primExpr ptfs e-primFun _ e@(EpicFun {}) = return e----- | Change all the primitives in an expression using PrimTransform-primExpr :: [PrimTransform] -> Expr -> Compile TCM Expr-primExpr prim ex = case ex of- Var{} -> return ex- Lit{} -> return ex- Lam v e1 -> Lam v <$> primExpr prim e1- Con c n es -> case testCon prim n of- Just pn -> do- filt <- getForcedArgs n- apps pn <$> mapM (primExpr prim) es- Nothing -> Con c n <$> mapM (primExpr prim) es- App v es -> App v <$> mapM (primExpr prim) es- Case e brs -> case testBranch prim brs of- Just p -> primExpr prim $ translateCase p e brs- Nothing -> Case <$> primExpr prim e <*> mapM primBranch brs- If a b c -> If <$> primExpr prim a <*> primExpr prim b <*> primExpr prim c- Let v e e' -> Let v <$> primExpr prim e <*> primExpr prim e'- Lazy e -> Lazy <$> primExpr prim e- UNIT -> return ex- IMPOSSIBLE -> return ex- where- -- | Test if any PrimTransform have any primitive function for- -- a constructor, gives the name of that primitive function in that- -- case, otherwise Nothing.- testCon :: [PrimTransform] -> QName -> Maybe Var- testCon [] _ = Nothing- testCon (p : ps) k = Map.lookup k (mapCon p) `mplus` testCon ps k-- -- | Test if we should transform the case, based on the branches. Returns- -- the (first) PrimTransform that is applicable.- testBranch :: [PrimTransform] -> [Branch] -> Maybe PrimTransform- testBranch [] _ = Nothing- testBranch (p:ps) brs = msum (map (check p) brs) `mplus` testBranch ps brs-- -- | Check if a particular PrimTransform can be used on a particular Branch- -- Returns the PrimTransform in that case.- check :: PrimTransform -> Branch -> Maybe PrimTransform- check p br = case br of- Branch _ n _ _ -> fmap (const p) $ Map.lookup n (mapCon p)- BrInt _ _ -> Nothing- Default _ -> Nothing-- -- | Change all primitives in a branch- primBranch :: Branch -> Compile TCM Branch- primBranch br = do- e' <- primExpr prim (brExpr br)- return br {brExpr = e'}
− src/full/Agda/Compiler/Epic/Smashing.hs
@@ -1,137 +0,0 @@-{-# LANGUAGE CPP #-}---- | Smash functions which return something that can be inferred--- (something of a type with only one element)--module Agda.Compiler.Epic.Smashing where--import Control.Monad.State--import Data.List-import Data.Maybe--import Data.Set (Set)-import qualified Data.Set as Set--import Agda.Syntax.Common-import Agda.Syntax.Internal as SI-import Agda.TypeChecking.Monad hiding (funInline)-import Agda.TypeChecking.Substitute-import Agda.TypeChecking.Telescope-import Agda.TypeChecking.Pretty-import Agda.TypeChecking.Reduce--import Agda.Compiler.Epic.AuxAST as AA-import Agda.Compiler.Epic.CompileState-import Agda.Compiler.Epic.Interface--import Agda.Utils.Lens-import Agda.Utils.Monad-import Agda.Utils.Size-import qualified Agda.Utils.HashMap as HM--#include "undefined.h"-import Agda.Utils.Impossible--defnPars :: Integral n => Defn -> n-defnPars (Record {recPars = p}) = fromIntegral p-defnPars (Constructor {conPars = p}) = fromIntegral p-defnPars d = 0---- | Main function, smash as much as possible-smash'em :: [Fun] -> Compile TCM [Fun]-smash'em funs = do- defs <- lift $ use $ stImports . sigDefinitions- funs' <- forM funs $ \f -> case f of- AA.Fun{} -> case funQName f >>= flip HM.lookup defs of- Nothing -> do- lift $ reportSDoc "epic.smashing" 10 $ vcat- [ (text . show) f <+> text " was not found"]- return f-- Just def -> do- lift $ reportSLn "epic.smashing" 10 $ "running on:" ++ (show (funQName f))- minfered <- smashable (length (funArgs f) + defnPars (theDef def)) (defType def)- case minfered of- Just infered -> do- lift $ reportSDoc "smashing" 5 $ vcat- [ prettyTCM (defName def) <+> text "is smashable"]- return f { funExpr = infered- , funInline = True- , funComment = funComment f ++ " [SMASHED]"- }- Nothing -> return f- _ -> do- lift $ reportSLn "epic.smashing" 10 $ "smashing!"- return f- return funs'--(+++) :: Telescope -> Telescope -> Telescope-xs +++ ys = unflattenTel names $ map (raise (size ys)) (flattenTel xs) ++ flattenTel ys- where names = teleNames xs ++ teleNames ys---- | Can a datatype be inferred? If so, return the only possible value.-inferable :: Set QName -> QName -> [Arg Term] -> Compile TCM (Maybe Expr)-inferable visited dat args | dat `Set.member` visited = return Nothing-inferable visited dat args = do- lift $ reportSLn "epic.smashing" 10 $ " inferring:" ++ (show dat)- defs <- lift $ use $ stImports . sigDefinitions- let def = fromMaybe __IMPOSSIBLE__ $ HM.lookup dat defs- case theDef def of- d@Datatype{} -> do- case dataCons d of- [c] -> inferableArgs c (dataPars d)- _ -> return Nothing- r@Record{} -> inferableArgs (recCon r) (recPars r)- f@Function{} -> do- term <- lift $ normalise $ Def dat $ map SI.Apply args- inferableTerm visited' term- d -> do- lift $ reportSLn "epic.smashing" 10 $ " failed (inferable): " ++ (show d)- return Nothing- where- inferableArgs c pars = do- defs <- lift $ use $ stImports . sigDefinitions- let def = fromMaybe __IMPOSSIBLE__ $ HM.lookup c defs- forc <- getForcedArgs c- TelV tel _ <- lift $ telView (defType def `piApply` genericTake pars args)- tag <- getConstrTag c- lift $ reportSDoc "epic.smashing" 10 $ nest 2 $ vcat- [ text "inferableArgs!"- , text "tele" <+> prettyTCM tel- , text "constr:" <+> prettyTCM c- ]- (AA.Con tag c <$>) <$> sequence <$> forM (notForced forc $ flattenTel tel) (inferableTerm visited' . unEl . unDom)- visited' = Set.insert dat visited--inferableTerm :: Set QName -> Term -> Compile TCM (Maybe Expr)-inferableTerm visited t = do- case ignoreSharing t of- Def q es ->- case allApplyElims es of- Just vs -> inferable visited q vs- Nothing -> return Nothing- Pi _ b -> (AA.Lam "_" <$>) <$> inferableTerm visited (unEl $ unAbs b)- Sort {} -> return . return $ AA.UNIT- t -> do- lift $ reportSLn "epic.smashing" 10 $ " failed to infer: " ++ show t- return Nothing---- | Find the only possible value for a certain type. If we fail return Nothing-smashable :: Int -> Type -> Compile TCM (Maybe Expr)-smashable origArity typ = do- defs <- lift $ use $ stImports . sigDefinitions- TelV tele retType <- lift $ telView typ- retType' <- return retType -- lift $ reduce retType-- inf <- inferableTerm Set.empty (unEl retType')- lift $ reportSDoc "epic.smashing" 10 $ nest 2 $ vcat- [ text "Result is"- , text "inf: " <+> (text . show) inf- , text "type: " <+> prettyTCM retType'- ]- return $ buildLambda (size tele - origArity) <$> inf--buildLambda :: (Ord n, Num n) => n -> Expr -> Expr-buildLambda n e | n <= 0 = e-buildLambda n e | otherwise = AA.Lam "_" (buildLambda (n - 1) e)
− src/full/Agda/Compiler/Epic/Static.hs
@@ -1,119 +0,0 @@-{-# LANGUAGE CPP #-}---- | Find the places where the builtin static is used and do some normalisation--- there.-module Agda.Compiler.Epic.Static where--import Control.Applicative-import Control.Monad-import Control.Monad.State--import qualified Data.Map as Map-import Data.Traversable (traverse)--import Agda.Syntax.Common-import Agda.Syntax.Internal as I--import Agda.TypeChecking.CompiledClause-import Agda.TypeChecking.Monad.Base-import Agda.TypeChecking.Monad.Options-import Agda.TypeChecking.Monad.Sharing-import Agda.TypeChecking.Reduce-import Agda.TypeChecking.Substitute-import Agda.TypeChecking.Pretty--import Agda.Utils.List (downFrom)-import Agda.Utils.Monad-import qualified Agda.Utils.HashMap as HM--import Agda.Compiler.Epic.CompileState--#include "undefined.h"-import Agda.Utils.Impossible-import Agda.Utils.Lens--normaliseStatic :: CompiledClauses -> Compile TCM CompiledClauses-normaliseStatic = evaluateCC--evaluateCC :: CompiledClauses -> Compile TCM CompiledClauses-evaluateCC ccs = case ccs of- Case n brs -> do- cbrs <- forM (Map.toList $ conBranches brs) $ \(c, WithArity n cc) -> (,) c <$> (WithArity n <$> evaluateCC cc)- lbrs <- forM (Map.toList $ litBranches brs) $ \(l, cc) -> (,) l <$> evaluateCC cc- cab <- case catchAllBranch brs of- Nothing -> return Nothing- Just cc -> Just <$> evaluateCC cc- return $ Case n Branches- { projPatterns = projPatterns brs- , conBranches = Map.fromList cbrs- , litBranches = Map.fromList lbrs- , catchAllBranch = cab- }- Done n t -> Done n <$> evaluate t- Fail -> return Fail--etaExpand :: Term -> Compile TCM Term-etaExpand def@(Def n ts) = do- defs <- lift $ use $ stImports . sigDefinitions- let f = maybe __IMPOSSIBLE__ theDef (HM.lookup n defs)- len = length . namedClausePats . head . funClauses $ f- toEta :: Num a => a- toEta = fromIntegral $ len - length ts- term = raise toEta def `applys` map var (downFrom toEta)- info = setOrigin Inserted defaultArgInfo- return $ foldr (\ v t -> Lam info (Abs v t)) term $ replicate toEta "staticVar"-etaExpand x = return x--class Evaluate a where- evaluate :: a -> Compile TCM a--instance Evaluate a => Evaluate [a] where- evaluate = traverse evaluate--instance Evaluate a => Evaluate (Arg a) where- evaluate = traverse evaluate--instance Evaluate a => Evaluate (Abs a) where- evaluate = traverse evaluate -- TODO: maintain context--instance Evaluate a => Evaluate (Elim' a) where- evaluate = traverse evaluate--instance Evaluate Term where- evaluate term = case term of- Var x es -> Var x <$> evaluate es- Lam h b -> Lam h <$> evaluate b-{-- ab' <- evaluateTerm (unAbs ab)- return $ Lam h $ Abs (absName ab) ab'--}- Lit l -> return $ Lit l- Def n es -> ifNotM (isStatic n) {- then -} (Def n <$> evaluate es) $ {- else -} do- feta <- return term -- etaExpand term- f <- lift $ normalise feta- lift $ reportSDoc "epic.static" 10 $ vcat- [ text "STATIC pragma fired"- , nest 2 $ vcat- [ text "before :" <+> prettyTCM term- , text "after :" <+> prettyTCM f- ]- ]- return f- Con c ci args -> Con c ci <$> evaluate args- Pi arg abs -> return term- Sort s -> return term- MetaV i args -> return term- Level l -> return term- DontCare i -> return term- Shared{} -> updateSharedTermT evaluate term- where-{-- evaluateTerms :: Args -> Compile TCM Args- evaluateTerms as = forM as $ \x -> do- y <- evaluateTerm (unArg x)- return x { unArg = y }--}- isStatic :: QName -> Compile TCM Bool- isStatic q = do- defs <- lift $ use $ stImports . sigDefinitions- return $ maybe False (^. theDefLens . funStatic) $ HM.lookup q defs
− src/full/Agda/Compiler/HaskellTypes.hs
@@ -1,115 +0,0 @@-{-# LANGUAGE CPP #-}---- | Translating Agda types to Haskell types. Used to ensure that imported--- Haskell functions have the right type.--module Agda.Compiler.HaskellTypes where--import Control.Applicative-import Data.Maybe (fromMaybe)--import Agda.Syntax.Common-import Agda.Syntax.Internal-import Agda.TypeChecking.Monad-import Agda.TypeChecking.Monad.Builtin-import Agda.TypeChecking.Pretty-import Agda.TypeChecking.Reduce-import Agda.TypeChecking.Substitute-import Agda.TypeChecking.Free--import Agda.Utils.Except ( MonadError(catchError) )-import Agda.Utils.Impossible--#include "undefined.h"--type HaskellKind = String--hsStar :: HaskellKind-hsStar = "*"--hsKFun :: HaskellKind -> HaskellKind -> HaskellKind-hsKFun k l = "(" ++ k ++ " -> " ++ l ++ ")"--hsFun :: HaskellKind -> HaskellKind -> HaskellKind-hsFun a b = "(" ++ a ++ " -> " ++ b ++ ")"--hsUnit :: HaskellType-hsUnit = "()"--hsVar :: Name -> HaskellType-hsVar x = "x" ++ concatMap encode (show x)- where- okChars = ['a'..'z'] ++ ['A'..'Y'] ++ "_'"- encode 'Z' = "ZZ"- encode c- | c `elem` okChars = [c]- | otherwise = "Z" ++ show (fromEnum c)---hsApp :: String -> [HaskellType] -> HaskellType-hsApp d [] = d-hsApp d as = "(" ++ unwords (d : as) ++ ")"--hsForall :: String -> HaskellType -> HaskellType-hsForall x a = "(forall " ++ x ++ ". " ++ a ++ ")"--notAHaskellType :: Type -> TCM a-notAHaskellType a = do- err <- fsep $ pwords "The type" ++ [prettyTCM a] ++- pwords "cannot be translated to a Haskell type."- typeError $ GenericError $ show err--getHsType :: QName -> TCM HaskellType-getHsType x = do- d <- compiledHaskell . defCompiledRep <$> getConstInfo x- case d of- Just (HsType t) -> return t- Just (HsDefn t c) -> return hsUnit- _ -> notAHaskellType (El Prop $ Def x [])--getHsVar :: Nat -> TCM HaskellCode-getHsVar i = hsVar <$> nameOfBV i---- | Note that @Inf a b@, where @Inf@ is the INFINITY builtin, is--- translated to @<translation of b>@ (assuming that all coinductive--- builtins are defined).------ Note that if @haskellType@ supported universe polymorphism then the--- special treatment of INFINITY might not be needed.--haskellType :: Type -> TCM HaskellType-haskellType t = fromType t- where- err = notAHaskellType t- fromArgs = mapM (fromTerm . unArg)- fromType = fromTerm . unEl- fromTerm v = do- v <- unSpine <$> reduce v- reportSLn "compile.haskell.type" 50 $ "toHaskellType " ++ show v- kit <- liftTCM coinductionKit- case v of- Var x es -> do- let args = fromMaybe __IMPOSSIBLE__ $ allApplyElims es- hsApp <$> getHsVar x <*> fromArgs args- Def d es | Just d == (nameOfInf <$> kit) ->- case es of- [Apply a, Apply b] -> fromTerm (unArg b)- _ -> err- Def d es -> do- let args = fromMaybe __IMPOSSIBLE__ $ allApplyElims es- hsApp <$> getHsType d <*> fromArgs args- Pi a b ->- if isBinderUsed b -- Andreas, 2012-04-03. Q: could we rely on Abs/NoAbs instead of again checking freeness of variable?- then do- hsA <- fromType (unDom a)- underAbstraction a b $ \b ->- hsForall <$> getHsVar 0 <*> (hsFun hsA <$> fromType b)- else hsFun <$> fromType (unDom a) <*> fromType (noabsApp __IMPOSSIBLE__ b)- Con c ci args -> hsApp <$> getHsType (conName c) <*> fromArgs args- Lam{} -> err- Level{} -> return hsUnit- Lit{} -> return hsUnit- Sort{} -> return hsUnit- Shared p -> fromTerm $ derefPtr p- MetaV{} -> err- DontCare{} -> err
src/full/Agda/Compiler/JS/Compiler.hs view
@@ -6,6 +6,7 @@ import Control.Applicative import Control.Monad.Reader ( liftIO ) import Control.Monad.Trans+import Data.Char ( isSpace ) import Data.List ( intercalate, genericLength, partition ) import Data.Maybe ( isJust ) import Data.Set ( Set, null, insert, difference, delete )@@ -20,7 +21,7 @@ import Agda.Interaction.Imports ( isNewerThan ) import Agda.Interaction.Options ( optCompileDir ) import Agda.Syntax.Common ( Nat, unArg, namedArg, NameId(..) )-import Agda.Syntax.Concrete.Name ( projectRoot )+import Agda.Syntax.Concrete.Name ( projectRoot , isNoName ) import Agda.Syntax.Abstract.Name ( ModuleName(MName), QName, mnameToConcrete,@@ -29,6 +30,7 @@ ( Name, Args, Type, conName, toTopLevelModuleName, arity, unEl, unAbs, nameFixity )+import Agda.Syntax.Position import Agda.Syntax.Literal ( Literal(LitNat,LitFloat,LitString,LitChar,LitQName,LitMeta) ) import Agda.Syntax.Fixity import qualified Agda.Syntax.Treeless as T@@ -36,7 +38,8 @@ import Agda.TypeChecking.Level ( reallyUnLevelView ) import Agda.TypeChecking.Monad hiding (Global, Local) import Agda.TypeChecking.Monad.Builtin-import Agda.TypeChecking.Monad.Options ( setCommandLineOptions, commandLineOptions, reportSLn )+import Agda.TypeChecking.Monad.Debug ( reportSLn )+import Agda.TypeChecking.Monad.Options ( setCommandLineOptions ) import Agda.TypeChecking.Reduce ( instantiateFull, normalise ) import Agda.TypeChecking.Substitute (TelV(..)) import Agda.TypeChecking.Telescope@@ -53,9 +56,10 @@ import Agda.Compiler.Common import Agda.Compiler.ToTreeless-import Agda.Compiler.Treeless.DelayCoinduction+import Agda.Compiler.Treeless.EliminateDefaults import Agda.Compiler.Treeless.EliminateLiteralPatterns import Agda.Compiler.Treeless.GuardsToPrims+import Agda.Compiler.Backend (Backend(..), Backend'(..), Recompile(..)) import Agda.Compiler.JS.Syntax ( Exp(Self,Local,Global,Undefined,String,Char,Integer,Double,Lambda,Object,Apply,Lookup,If,BinOp,PlainJS),@@ -65,6 +69,8 @@ ( curriedLambda, curriedApply, emp, subst, apply ) import qualified Agda.Compiler.JS.Pretty as JSPretty +import Agda.Interaction.Options+ import Paths_Agda #include "undefined.h"@@ -74,25 +80,81 @@ -- Entry point into the compiler -------------------------------------------------- -compilerMain :: Interface -> TCM ()-compilerMain mainI = inCompilerEnv mainI $ do- doCompile IsMain mainI $ do- compile- copyRTEModules+jsBackend :: Backend+jsBackend = Backend jsBackend' -compile :: IsMain -> Interface -> TCM ()-compile isMain i = do- ifM uptodate noComp $ do- yesComp- writeModule =<< curModule isMain+jsBackend' :: Backend' JSOptions JSOptions JSModuleEnv () (Maybe Export)+jsBackend' = Backend'+ { backendName = jsBackendName+ , backendVersion = Nothing+ , options = defaultJSOptions+ , commandLineFlags = jsCommandLineFlags+ , isEnabled = optJSCompile+ , preCompile = jsPreCompile+ , postCompile = jsPostCompile+ , preModule = jsPreModule+ , postModule = jsPostModule+ , compileDef = jsCompileDef+ , scopeCheckingSuffices = False+ }++--- Options ---++data JSOptions = JSOptions+ { optJSCompile :: Bool }++defaultJSOptions :: JSOptions+defaultJSOptions = JSOptions+ { optJSCompile = False }++jsCommandLineFlags :: [OptDescr (Flag JSOptions)]+jsCommandLineFlags =+ [ Option [] ["js"] (NoArg enable) "compile program using the JS backend"+ ] where- uptodate = liftIO =<< (isNewerThan <$> outFile_ <*> ifile)- ifile = maybe __IMPOSSIBLE__ filePath <$>- (findInterfaceFile . toTopLevelModuleName =<< curMName)- noComp = reportSLn "compile.js" 2 . (++ " : no compilation is needed.") . prettyShow =<< curMName- yesComp = reportSLn "compile.js" 1 . (`repl` "Compiling <<0>> in <<1>> to <<2>>") =<<- sequence [prettyShow <$> curMName, ifile, outFile_] :: TCM ()+ enable o = pure o{ optJSCompile = True } +--- Top-level compilation ---++jsPreCompile :: JSOptions -> TCM JSOptions+jsPreCompile opts = return opts++jsPostCompile :: JSOptions -> IsMain -> a -> TCM ()+jsPostCompile _ _ _ = copyRTEModules++--- Module compilation ---++type JSModuleEnv = Maybe CoinductionKit++jsPreModule :: JSOptions -> ModuleName -> FilePath -> TCM (Recompile JSModuleEnv ())+jsPreModule _ m ifile = ifM uptodate noComp yesComp+ where+ uptodate = liftIO =<< isNewerThan <$> outFile_ <*> pure ifile++ noComp = do+ reportSLn "compile.js" 2 . (++ " : no compilation is needed.") . prettyShow =<< curMName+ return $ Skip ()++ yesComp = do+ m <- prettyShow <$> curMName+ out <- outFile_+ reportSLn "compile.js" 1 $ repl [m, ifile, out] "Compiling <<0>> in <<1>> to <<2>>"+ Recompile <$> coinductionKit++jsPostModule :: JSOptions -> JSModuleEnv -> IsMain -> ModuleName -> [Maybe Export] -> TCM ()+jsPostModule _ _ isMain _ defs = do+ m <- jsMod <$> curMName+ is <- map (jsMod . fst) . iImportedModules <$> curIF+ let es = catMaybes defs+ writeModule $ Module m (reorder es) main+ where+ main = case isMain of+ IsMain -> Just $ Apply (Lookup Self $ MemberId "main") [Lambda 1 emp]+ NotMain -> Nothing++jsCompileDef :: JSOptions -> JSModuleEnv -> Definition -> TCM (Maybe Export)+jsCompileDef _ kit def = definition kit (defName def, def)+ -------------------------------------------------- -- Naming --------------------------------------------------@@ -101,19 +163,18 @@ prefix = "jAgda" jsMod :: ModuleName -> GlobalId-jsMod m = GlobalId (prefix : map show (mnameToList m))+jsMod m = GlobalId (prefix : map prettyShow (mnameToList m)) jsFileName :: GlobalId -> String jsFileName (GlobalId ms) = intercalate "." ms ++ ".js" jsMember :: Name -> MemberId-jsMember n =+jsMember n -- Anonymous fields are used for where clauses, -- and they're all given the concrete name "_", -- so we disambiguate them using their name id.- case show n of- "_" -> MemberId ("_" ++ show (nameId n))- l -> MemberId l+ | isNoName n = MemberId ("_" ++ show (nameId n))+ | otherwise = MemberId $ prettyShow n -- Rather annoyingly, the anonymous construtor of a record R in module M -- is given the name M.recCon, but a named constructor C@@ -169,13 +230,13 @@ False -> reorder' defs (insertAfter us e es) isTopLevelValue :: Export -> Bool-isTopLevelValue (Export _ isCoind e) = case e of- _ | isCoind -> False+isTopLevelValue (Export _ e) = case e of+ Object m | flatName `Map.member` m -> False Lambda{} -> False _ -> True isEmptyObject :: Export -> Bool-isEmptyObject (Export _ _ e) = case e of+isEmptyObject (Export _ e) = case e of Object m -> Map.null m Lambda{} -> True _ -> False@@ -209,30 +270,49 @@ definition' kit q d (defType d) ls +-- | Ensure that there is at most one pragma for a name.+checkCompilerPragmas :: QName -> TCM ()+checkCompilerPragmas q =+ caseMaybeM (getUniqueCompilerPragma jsBackendName q) (return ()) $ \ (CompilerPragma r s) ->+ setCurrentRange r $ case words s of+ "=" : _ -> return ()+ _ -> genericDocError $ P.sep [ P.text "Badly formed COMPILE JS pragma. Expected",+ P.text "{-# COMPILE JS <name> = <js> #-}" ]++defJSDef :: Definition -> Maybe String+defJSDef def =+ case defCompilerPragmas jsBackendName def of+ [CompilerPragma _ s] -> Just (dropEquals s)+ [] -> Nothing+ _:_:_ -> __IMPOSSIBLE__+ where+ dropEquals = dropWhile $ \ c -> isSpace c || c == '='+ definition' :: Maybe CoinductionKit -> QName -> Definition -> Type -> [MemberId] -> TCM (Maybe Export)-definition' kit q d t ls =+definition' kit q d t ls = do+ checkCompilerPragmas q case theDef d of -- coinduction Constructor{} | Just q == (nameOfSharp <$> kit) -> do- ret $ Lambda 1 $ local 0+ return Nothing Function{} | Just q == (nameOfFlat <$> kit) -> do- ret $ Lambda 1 $ Apply (local 0) [Integer 0]+ ret $ Lambda 1 $ Apply (Lookup (local 0) flatName) [] Axiom | Just e <- defJSDef d -> plainJS e Axiom | otherwise -> ret Undefined Function{} | Just e <- defJSDef d -> plainJS e Function{} | otherwise -> do- isInfVal <- outputIsInf kit t reportSDoc "compile.js" 5 $ text "compiling fun:" <+> prettyTCM q caseMaybeM (toTreeless q) (pure Nothing) $ \ treeless -> do- funBody <- eliminateLiteralPatterns $ convertGuards $ treeless- funBody' <- delayCoinduction funBody t- reportSDoc "compile.js" 30 $ text " compiled treeless fun:" <+> pretty funBody'- funBody'' <- compileTerm funBody'- reportSDoc "compile.js" 30 $ text " compiled JS fun:" <+> (text . show) funBody''- return $ Just $ Export ls isInfVal funBody''+ funBody <- eliminateCaseDefaults =<<+ eliminateLiteralPatterns+ (convertGuards treeless)+ reportSDoc "compile.js" 30 $ text " compiled treeless fun:" <+> pretty funBody+ funBody' <- compileTerm funBody+ reportSDoc "compile.js" 30 $ text " compiled JS fun:" <+> (text . show) funBody'+ return $ Just $ Export ls funBody' Primitive{primName = p} | p `Set.member` primitives -> plainJS $ "agdaRTS." ++ p@@ -259,53 +339,72 @@ (Apply (Lookup (Local (LocalId 0)) (last ls)) [ Local (LocalId (np - i)) | i <- [0 .. np-1] ])) - AbstractDefn -> __IMPOSSIBLE__+ AbstractDefn{} -> __IMPOSSIBLE__ where- ret = return . Just . Export ls False- plainJS = return . Just . Export ls False . PlainJS-+ ret = return . Just . Export ls+ plainJS = return . Just . Export ls . PlainJS compileTerm :: T.TTerm -> TCM Exp-compileTerm term = do- case term of- T.TVar x -> return $ Local $ LocalId x- T.TDef q -> do- d <- getConstInfo q- case theDef d of- -- Datatypes and records are erased- Datatype {} -> return (String "*")- Record {} -> return (String "*")- _ -> qname q- T.TApp t xs -> curriedApply <$> compileTerm t <*> mapM compileTerm xs- T.TLam t -> Lambda 1 <$> compileTerm t- -- TODO This is not a lazy let, but it should be...- T.TLet t e -> apply <$> (Lambda 1 <$> compileTerm e) <*> traverse compileTerm [t]- T.TLit l -> return $ literal l- T.TCon q -> do- d <- getConstInfo q- qname q- T.TCase sc (T.CTData dt) def alts -> do- dt <- getConstInfo dt- alts' <- traverse compileAlt alts- let obj = Object $ Map.fromList alts'- case (theDef dt, defJSDef dt) of- (_, Just e) -> do- return $ apply (PlainJS e) [Local (LocalId sc), obj]- (Record{}, _) -> do- memId <- visitorName $ recCon $ theDef dt- return $ apply (Lookup (Local $ LocalId sc) memId) [obj]- (Datatype{}, _) -> do- return $ curriedApply (Local (LocalId sc)) [obj]- _ -> __IMPOSSIBLE__- T.TCase _ _ _ _ -> __IMPOSSIBLE__-- T.TPrim p -> return $ compilePrim p- T.TUnit -> unit- T.TSort -> unit- T.TErased -> unit- T.TError T.TUnreachable -> return Undefined+compileTerm t = do+ kit <- coinductionKit+ compileTerm' kit t +compileTerm' :: Maybe CoinductionKit -> T.TTerm -> TCM Exp+compileTerm' kit t = go t where+ go :: T.TTerm -> TCM Exp+ go t = case t of+ T.TVar x -> return $ Local $ LocalId x+ T.TDef q -> do+ d <- getConstInfo q+ case theDef d of+ -- Datatypes and records are erased+ Datatype {} -> return (String "*")+ Record {} -> return (String "*")+ _ -> qname q+ T.TApp (T.TCon q) [x] | Just q == (nameOfSharp <$> kit) -> do+ x <- go x+ let evalThunk = unlines+ [ "function() {"+ , " delete this.flat;"+ , " var result = this.__flat_helper();"+ , " delete this.__flat_helper;"+ , " this.flat = function() { return result; };"+ , " return result;"+ , "}"+ ]+ return $ Object $ Map.fromList+ [(flatName, PlainJS evalThunk)+ ,(MemberId "__flat_helper", Lambda 0 x)]+ T.TApp t xs -> curriedApply <$> go t <*> mapM go xs+ T.TLam t -> Lambda 1 <$> go t+ -- TODO This is not a lazy let, but it should be...+ T.TLet t e -> apply <$> (Lambda 1 <$> go e) <*> traverse go [t]+ T.TLit l -> return $ literal l+ T.TCon q -> do+ d <- getConstInfo q+ qname q+ T.TCase sc (T.CTData dt) def alts -> do+ dt <- getConstInfo dt+ alts' <- traverse compileAlt alts+ let obj = Object $ Map.fromList alts'+ case (theDef dt, defJSDef dt) of+ (_, Just e) -> do+ return $ apply (PlainJS e) [Local (LocalId sc), obj]+ (Record{}, _) -> do+ memId <- visitorName $ recCon $ theDef dt+ return $ apply (Lookup (Local $ LocalId sc) memId) [obj]+ (Datatype{}, _) -> do+ return $ curriedApply (Local (LocalId sc)) [obj]+ _ -> __IMPOSSIBLE__+ T.TCase _ _ _ _ -> __IMPOSSIBLE__++ T.TPrim p -> return $ compilePrim p+ T.TUnit -> unit+ T.TSort -> unit+ T.TErased -> unit+ T.TError T.TUnreachable -> return Undefined+ unit = return $ Integer 0 compilePrim :: T.TPrim -> Exp@@ -321,6 +420,8 @@ T.PAdd -> binOp "agdaRTS.uprimIntegerPlus" T.PSub -> binOp "agdaRTS.uprimIntegerMinus" T.PMul -> binOp "agdaRTS.uprimIntegerMultiply"+ T.PRem -> binOp "agdaRTS.uprimIntegerRem"+ T.PQuot -> binOp "agdaRTS.uprimIntegerQuot" T.PSeq -> binOp "agdaRTS.primSeq" _ -> __IMPOSSIBLE__ where binOp js = curriedLambda 2 $ apply (PlainJS js) [local 1, local 0]@@ -337,6 +438,9 @@ visitorName :: QName -> TCM MemberId visitorName q = do (m,ls) <- global q; return (last ls) +flatName :: MemberId+flatName = MemberId "flat"+ local :: Nat -> Exp local = Local . LocalId @@ -359,7 +463,7 @@ Object $ Map.fromList [ (mem "id", Integer $ fromIntegral n) , (mem "moduleId", Integer $ fromIntegral m)- , (mem "name", String $ show q)+ , (mem "name", String $ prettyShow q) , (mem "fixity", litfixity fx)] where mem = MemberId@@ -372,11 +476,11 @@ , (mem "prec", litPrec $ fixityLevel fx)] -- TODO this will probably not work well together with the necessary FFI bindings- litAssoc NonAssoc = String "NonAssoc"- litAssoc LeftAssoc = String "LeftAssoc"- litAssoc RightAssoc = String "RightAssoc"+ litAssoc NonAssoc = String "non-assoc"+ litAssoc LeftAssoc = String "left-assoc"+ litAssoc RightAssoc = String "right-assoc" - litPrec Unrelated = String "Unrelated"+ litPrec Unrelated = String "unrelated" litPrec (Related l) = Integer l --------------------------------------------------@@ -434,4 +538,6 @@ , "primATan2" , "primShowQName" , "primQNameEquality"+ , "primQNameLess"+ , "primQNameFixity" ]
src/full/Agda/Compiler/JS/Pretty.hs view
@@ -4,8 +4,10 @@ import Data.List ( intercalate ) import Data.Set ( Set, toList, singleton, insert, member ) import Data.Map ( Map, toAscList, empty, null )+import Text.Regex.TDFA (makeRegex, matchTest, Regex) import Agda.Syntax.Common ( Nat )+import Agda.Utils.Hash import Agda.Compiler.JS.Syntax hiding (exports) @@ -56,7 +58,7 @@ pretty n i (LocalId x) = "x" ++ show (n - x - 1) instance Pretty GlobalId where- pretty n i (GlobalId m) = intercalate "_" m+ pretty n i (GlobalId m) = variableName $ intercalate "_" m instance Pretty MemberId where pretty n i (MemberId s) = "\"" ++ unescapes s ++ "\""@@ -99,13 +101,14 @@ modname :: GlobalId -> String modname (GlobalId ms) = "\"" ++ intercalate "." ms ++ "\"" + exports :: Nat -> Int -> Set [MemberId] -> [Export] -> String exports n i lss [] = ""-exports n i lss (Export ls _ e : es) | member (init ls) lss =+exports n i lss (Export ls e : es) | member (init ls) lss = "exports[" ++ intercalate "][" (pretties n i ls) ++ "] = " ++ pretty n (i+1) e ++ ";" ++ br i ++ exports n i (insert ls lss) es-exports n i lss (Export ls isCoind e : es) | otherwise =- exports n i lss (Export (init ls) False (Object empty) : Export ls isCoind e : es)+exports n i lss (Export ls e : es) | otherwise =+ exports n i lss (Export (init ls) (Object empty) : Export ls e : es) instance Pretty Module where pretty n i (Module m es ex) =@@ -118,3 +121,15 @@ ["var agdaRTS = require(\"agda-rts\");"] ++ ["var " ++ pretty n (i+1) e ++ " = require(" ++ modname e ++ ");" | e <- js]++variableName :: String -> String+variableName s = if isValidJSIdent s then "z_" ++ s else "h_" ++ show (hashString s)++-- | Check if a string is a valid JS identifier. The check ignores keywords+-- as we prepend z_ to our identifiers. The check+-- is conservative and may not admit all valid JS identifiers.+isValidJSIdent :: String -> Bool+isValidJSIdent s = matchTest regex s+ where+ regex :: Regex+ regex = makeRegex "^[a-zA-Z_$][0-9a-zA-Z_$]*$"
src/full/Agda/Compiler/JS/Substitution.hs view
@@ -2,9 +2,9 @@ import Prelude hiding ( map, lookup ) import Data.Map ( empty, unionWith, singleton, findWithDefault )-import qualified Data.Map as M ( map )+import qualified Data.Map as Map import Data.List ( genericIndex )-import qualified Data.List as L ( map )+import qualified Data.List as List import Agda.Syntax.Common ( Nat ) import Agda.Compiler.JS.Syntax@@ -17,8 +17,8 @@ map :: Nat -> (Nat -> LocalId -> Exp) -> Exp -> Exp map m f (Local i) = f m i map m f (Lambda i e) = Lambda i (map (m + i) f e)-map m f (Object o) = Object (M.map (map m f) o)-map m f (Apply e es) = Apply (map m f e) (L.map (map m f) es)+map m f (Object o) = Object (Map.map (map m f) o)+map m f (Apply e es) = Apply (map m f e) (List.map (map m f) es) map m f (Lookup e l) = Lookup (map m f e) l map m f (If e e' e'') = If (map m f e) (map m f e') (map m f e'') map m f (PreOp op e) = PreOp op (map m f e)@@ -54,8 +54,8 @@ map' :: Nat -> (Nat -> LocalId -> Exp) -> Exp -> Exp map' m f (Local i) = f m i map' m f (Lambda i e) = Lambda i (map' (m + i) f e)-map' m f (Object o) = Object (M.map (map' m f) o)-map' m f (Apply e es) = apply (map' m f e) (L.map (map' m f) es)+map' m f (Object o) = Object (Map.map (map' m f) o)+map' m f (Apply e es) = apply (map' m f e) (List.map (map' m f) es) map' m f (Lookup e l) = lookup (map' m f e) l map' m f (If e e' e'') = If (map' m f e) (map' m f e') (map' m f e'') map' m f (PreOp op e) = PreOp op (map' m f e)@@ -84,10 +84,10 @@ self :: Exp -> Exp -> Exp self e (Self) = e-self e (Object o) = Object (M.map (self e) o)+self e (Object o) = Object (Map.map (self e) o) self e (Apply f es) = case (self e f) of (Lambda n g) -> self e (subst' n es g)- g -> Apply g (L.map (self e) es)+ g -> Apply g (List.map (self e) es) self e (Lookup f l) = lookup (self e f) l self e (If f g h) = If (self e f) (self e g) (self e h) self e (BinOp f op g) = BinOp (self e f) op (self e g)
src/full/Agda/Compiler/JS/Syntax.hs view
@@ -2,8 +2,10 @@ module Agda.Compiler.JS.Syntax where +import Data.Map ( Map )+import qualified Data.Map as Map+ import Data.Typeable ( Typeable )-import Data.Map ( Map, fold ) import Data.Set ( Set, empty, singleton, union ) import Agda.Syntax.Common ( Nat )@@ -47,7 +49,7 @@ -- The top-level compilation unit is a module, which names -- the GId of its exports, and a list of definitions -data Export = Export { expName :: [MemberId], isCoind :: Bool, defn :: Exp }+data Export = Export { expName :: [MemberId], defn :: Exp } deriving (Typeable, Show) data Module = Module { modName :: GlobalId, exports :: [Export], postscript :: Maybe Exp }@@ -65,10 +67,10 @@ uses = foldr (union . uses) empty instance Uses a => Uses (Map k a) where- uses = fold (union . uses) empty+ uses = Map.foldr (union . uses) empty instance Uses Exp where- uses (Object o) = fold (union . uses) empty o+ uses (Object o) = Map.foldr (union . uses) empty o uses (Apply e es) = foldr (union . uses) (uses e) es uses (Lookup e l) = uses' e [l] where uses' Self ls = singleton ls@@ -80,7 +82,7 @@ uses e = empty instance Uses Export where- uses (Export _ _ e) = uses e+ uses (Export _ e) = uses e -- All global ids @@ -91,7 +93,7 @@ globals = foldr (union . globals) empty instance Globals a => Globals (Map k a) where- globals = fold (union . globals) empty+ globals = Map.foldr (union . globals) empty instance Globals Exp where globals (Global i) = singleton i@@ -105,7 +107,7 @@ globals _ = empty instance Globals Export where- globals (Export _ _ e) = globals e+ globals (Export _ e) = globals e instance Globals Module where globals (Module m es _) = globals es
src/full/Agda/Compiler/MAlonzo/Compiler.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} module Agda.Compiler.MAlonzo.Compiler where @@ -21,6 +20,7 @@ import Data.Set (Set) import qualified Data.Set as Set import Data.Traversable hiding (for)+import Data.Monoid hiding ((<>)) import Numeric.IEEE @@ -34,9 +34,12 @@ import Agda.Compiler.MAlonzo.Misc import Agda.Compiler.MAlonzo.Pretty import Agda.Compiler.MAlonzo.Primitives+import Agda.Compiler.MAlonzo.HaskellTypes+import Agda.Compiler.MAlonzo.Pragmas import Agda.Compiler.ToTreeless import Agda.Compiler.Treeless.Unused import Agda.Compiler.Treeless.Erase+import Agda.Compiler.Backend import Agda.Interaction.FindFile import Agda.Interaction.Imports@@ -60,6 +63,7 @@ import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope import Agda.TypeChecking.Level (reallyUnLevelView)+import Agda.TypeChecking.Warnings import Agda.TypeChecking.CompiledClause @@ -74,6 +78,7 @@ import qualified Agda.Utils.IO.UTF8 as UTF8 import qualified Agda.Utils.HashMap as HMap import Agda.Utils.Singleton+import Agda.Utils.Size import Agda.Utils.Tuple import Paths_Agda@@ -81,28 +86,103 @@ #include "undefined.h" import Agda.Utils.Impossible -compilerMain :: IsMain -> Interface -> TCM ()-compilerMain isMain i =- inCompilerEnv i $ do- doCompile isMain i $- \_ -> compile- copyRTEModules- callGHC isMain i+-- The backend callbacks -------------------------------------------------- -compile :: Interface -> TCM ()-compile i = do- ifM uptodate noComp $ {- else -} do- yesComp- writeModule =<< decl <$> curHsMod <*> (definitions =<< curDefs) <*> imports+ghcBackend :: Backend+ghcBackend = Backend ghcBackend'++ghcBackend' :: Backend' GHCOptions GHCOptions GHCModuleEnv IsMain [HS.Decl]+ghcBackend' = Backend'+ { backendName = "GHC"+ , backendVersion = Nothing+ , options = defaultGHCOptions+ , commandLineFlags = ghcCommandLineFlags+ , isEnabled = optGhcCompile+ , preCompile = ghcPreCompile+ , postCompile = ghcPostCompile+ , preModule = ghcPreModule+ , postModule = ghcPostModule+ , compileDef = ghcCompileDef+ , scopeCheckingSuffices = False+ }++--- Options ---++data GHCOptions = GHCOptions+ { optGhcCompile :: Bool+ , optGhcCallGhc :: Bool+ , optGhcFlags :: [String]+ }++defaultGHCOptions :: GHCOptions+defaultGHCOptions = GHCOptions+ { optGhcCompile = False+ , optGhcCallGhc = True+ , optGhcFlags = []+ }++ghcCommandLineFlags :: [OptDescr (Flag GHCOptions)]+ghcCommandLineFlags =+ [ Option ['c'] ["compile", "ghc"] (NoArg enable)+ "compile program using the GHC backend"+ , Option [] ["ghc-dont-call-ghc"] (NoArg dontCallGHC)+ "don't call GHC, just write the GHC Haskell files."+ , Option [] ["ghc-flag"] (ReqArg ghcFlag "GHC-FLAG")+ "give the flag GHC-FLAG to GHC"+ ] where- decl mn ds imp = HS.Module mn [] imp (map fakeDecl (reverse $ iHaskellCode i) ++ ds)- uptodate = liftIO =<< (isNewerThan <$> outFile_ <*> ifile)- ifile = maybe __IMPOSSIBLE__ filePath <$>- (findInterfaceFile . toTopLevelModuleName =<< curMName)- noComp = reportSLn "compile.ghc" 2 . (++ " : no compilation is needed.") . show . A.mnameToConcrete =<< curMName- yesComp = reportSLn "compile.ghc" 1 . (`repl` "Compiling <<0>> in <<1>> to <<2>>") =<<- sequence [show . A.mnameToConcrete <$> curMName, ifile, outFile_] :: TCM ()+ enable o = pure o{ optGhcCompile = True }+ dontCallGHC o = pure o{ optGhcCallGhc = False }+ ghcFlag f o = pure o{ optGhcFlags = optGhcFlags o ++ [f] } +--- Top-level compilation ---++ghcPreCompile :: GHCOptions -> TCM GHCOptions+ghcPreCompile ghcOpts = do+ allowUnsolved <- optAllowUnsolved <$> pragmaOptions+ when allowUnsolved $ genericError $ "Unsolved meta variables are not allowed when compiling."+ return ghcOpts++ghcPostCompile :: GHCOptions -> IsMain -> Map ModuleName IsMain -> TCM ()+ghcPostCompile opts isMain mods = copyRTEModules >> callGHC opts isMain mods++--- Module compilation ---++type GHCModuleEnv = Maybe CoinductionKit++ghcPreModule :: GHCOptions -> ModuleName -> FilePath -> TCM (Recompile GHCModuleEnv IsMain)+ghcPreModule _ m ifile = ifM uptodate noComp yesComp+ where+ uptodate = liftIO =<< isNewerThan <$> outFile_ <*> pure ifile++ noComp = do+ reportSLn "compile.ghc" 2 . (++ " : no compilation is needed.") . show . A.mnameToConcrete =<< curMName+ Skip . hasMainFunction <$> curIF++ yesComp = do+ m <- show . A.mnameToConcrete <$> curMName+ out <- outFile_+ reportSLn "compile.ghc" 1 $ repl [m, ifile, out] "Compiling <<0>> in <<1>> to <<2>>"+ stImportedModules .= Set.empty -- we use stImportedModules to accumulate the required Haskell imports+ Recompile <$> coinductionKit++ghcPostModule :: GHCOptions -> GHCModuleEnv -> IsMain -> ModuleName -> [[HS.Decl]] -> TCM IsMain+ghcPostModule _ _ _ _ defs = do+ m <- curHsMod+ imps <- imports+ -- Get content of FOREIGN pragmas.+ (headerPragmas, hsImps, code) <- foreignHaskell+ writeModule $ HS.Module m+ (map HS.OtherPragma headerPragmas)+ imps+ (map fakeDecl (hsImps ++ code) ++ concat defs)+ hasMainFunction <$> curIF++ghcCompileDef :: GHCOptions -> GHCModuleEnv -> Definition -> TCM [HS.Decl]+ghcCompileDef _ = definition++-- Compilation ------------------------------------------------------------+ -------------------------------------------------- -- imported modules -- I use stImportedModules in a non-standard way,@@ -110,11 +190,9 @@ -------------------------------------------------- imports :: TCM [HS.ImportDecl]-imports = (++) <$> hsImps <*> imps where- hsImps :: TCM [HS.ImportDecl]- hsImps = ((unqualRTE :) . List.map decl . Set.toList .- Set.insert mazRTE . Set.map HS.ModuleName) <$>- getHaskellImports+imports = (hsImps ++) <$> imps where+ hsImps :: [HS.ImportDecl]+ hsImps = [unqualRTE, decl mazRTE] unqualRTE :: HS.ImportDecl unqualRTE = HS.ImportDecl mazRTE False $ Just $@@ -139,15 +217,6 @@ -- Main compiling clauses -------------------------------------------------- -definitions :: Definitions -> TCM [HS.Decl]-definitions defs = do- kit <- coinductionKit- concat <$>- (mapM (\(_, d) -> definition kit =<< instantiateFull d) $- -- sort defs to ensure consistent order (see Issue 1900)- sortDefs defs- )- -- | Note that the INFINITY, SHARP and FLAT builtins are translated as -- follows (if a 'CoinductionKit' is given): --@@ -172,18 +241,26 @@ reportSDoc "compile.ghc.definition" 10 $ text "Not compiling" <+> prettyTCM q <> text "." return []-definition kit Defn{defName = q, defType = ty, defCompiledRep = compiled, theDef = d} = do+definition kit Defn{defName = q, defType = ty, theDef = d} = do reportSDoc "compile.ghc.definition" 10 $ vcat [ text "Compiling" <+> prettyTCM q <> text ":" , nest 2 $ text (show d) ]+ pragma <- getHaskellPragma q checkTypeOfMain q ty $ do infodecl q <$> case d of - _ | Just (HsDefn hsty hs) <- compiledHaskell compiled -> do+ _ | Just (HsDefn r hs) <- pragma -> setCurrentRange r $ do -- Make sure we have imports for all names mentioned in the type.- ty <- normalise ty+ hsty <- haskellType q+ ty <- normalise ty sequence_ [ xqual x (HS.Ident "_") | x <- Set.toList (namesIn ty) ]++ -- Check that the function isn't INLINE (since that will make this+ -- definition pointless).+ inline <- (^. funInline) . theDef <$> getConstInfo q+ when inline $ warning $ UselessInline q+ return $ fbWithType hsty (fakeExp hs) -- Special treatment of coinductive builtins.@@ -224,47 +301,56 @@ emptyBinds] ] - Axiom{} -> return $ fb axiomErr+ Axiom{} -> do+ ar <- typeArity ty+ return $ [ compiledTypeSynonym q ty ar | Just (HsType r ty) <- [pragma] ] +++ fb axiomErr Primitive{ primName = s } -> fb <$> primBody s - Function{} -> function (exportHaskell compiled) $ functionViaTreeless q+ Function{} -> function pragma $ functionViaTreeless q Datatype{ dataPars = np, dataIxs = ni, dataClause = cl, dataCons = cs }- | Just (HsType ty) <- compiledHaskell compiled -> do- ccscov <- ifM (noCheckCover q) (return []) $ do- ccs <- List.concat <$> mapM checkConstructorType cs- cov <- checkCover q ty (np + ni) cs- return $ ccs ++ cov- return $ tvaldecl q (dataInduction d) 0 (np + ni) [] (Just __IMPOSSIBLE__) ++ ccscov+ | Just (HsData r ty hsCons) <- pragma -> setCurrentRange r $ do+ computeErasedConstructorArgs q+ ccscov <- constructorCoverageCode q (np + ni) cs ty hsCons+ cds <- mapM compiledcondecl cs+ return $ tvaldecl q (dataInduction d) 0 (np + ni) [] (Just __IMPOSSIBLE__) +++ [compiledTypeSynonym q ty np] ++ cds ++ ccscov Datatype{ dataPars = np, dataIxs = ni, dataClause = cl, dataCons = cs } -> do computeErasedConstructorArgs q (ars, cds) <- unzip <$> mapM condecl cs return $ tvaldecl q (dataInduction d) (List.maximum (np:ars) - np) (np + ni) cds cl Constructor{} -> return []+ Record{ recPars = np, recClause = cl, recConHead = con }+ | Just (HsData r ty hsCons) <- pragma -> setCurrentRange r $ do+ let cs = [conName con]+ computeErasedConstructorArgs q+ ccscov <- constructorCoverageCode q np cs ty hsCons+ cds <- mapM compiledcondecl cs+ return $ tvaldecl q Inductive 0 np [] (Just __IMPOSSIBLE__) +++ [compiledTypeSynonym q ty np] ++ cds ++ ccscov Record{ recClause = cl, recConHead = con, recFields = flds } -> do computeErasedConstructorArgs q let c = conName con let noFields = length flds let ar = I.arity ty cd <- snd <$> condecl c- -- cd <- case c of- -- Nothing -> return $ cdecl q noFields- -- Just c -> snd <$> condecl c return $ tvaldecl q Inductive noFields ar [cd] cl- AbstractDefn -> __IMPOSSIBLE__+ AbstractDefn{} -> __IMPOSSIBLE__ where- function :: Maybe HaskellExport -> TCM [HS.Decl] -> TCM [HS.Decl]+ function :: Maybe HaskellPragma -> TCM [HS.Decl] -> TCM [HS.Decl] function mhe fun = do ccls <- mkwhere <$> fun case mhe of- Nothing -> return ccls- Just (HsExport t name) -> do+ Just (HsExport r name) -> do+ t <- setCurrentRange r $ haskellType q let tsig :: HS.Decl tsig = HS.TypeSig [HS.Ident name] (fakeType t) def :: HS.Decl def = HS.FunBind [HS.Match (HS.Ident name) [] (HS.UnGuardedRhs (hsVarUQ $ dname q)) emptyBinds] return ([tsig,def] ++ ccls)+ _ -> return ccls functionViaTreeless :: QName -> TCM [HS.Decl] functionViaTreeless q = caseMaybeM (toTreeless q) (pure []) $ \ treeless -> do@@ -314,8 +400,16 @@ (HS.UnGuardedRhs $ e) emptyBinds]] axiomErr :: HS.Exp- axiomErr = rtmError $ "postulate evaluated: " ++ show (A.qnameToConcrete q)+ axiomErr = rtmError $ "postulate evaluated: " ++ prettyShow q +constructorCoverageCode :: QName -> Int -> [QName] -> HaskellType -> [HaskellCode] -> TCM [HS.Decl]+constructorCoverageCode q np cs hsTy hsCons = do+ checkConstructorCount q cs hsCons+ ifM (noCheckCover q) (return []) $ do+ ccs <- List.concat <$> zipWithM checkConstructorType cs hsCons+ cov <- checkCover q hsTy np cs hsCons+ return $ ccs ++ cov+ -- | Environment for naming of local variables. -- Invariant: @reverse ccCxt ++ ccNameSupply@ data CCEnv = CCEnv@@ -356,24 +450,23 @@ intros n cont = freshNames n $ \xs -> local (mapContext (reverse xs ++)) $ cont xs -checkConstructorType :: QName -> TCM [HS.Decl]-checkConstructorType q = do- Just (HsDefn ty hs) <- compiledHaskell . defCompiledRep <$> getConstInfo q+checkConstructorType :: QName -> HaskellCode -> TCM [HS.Decl]+checkConstructorType q hs = do+ ty <- haskellType q return [ HS.TypeSig [unqhname "check" q] $ fakeType ty , HS.FunBind [HS.Match (unqhname "check" q) [] (HS.UnGuardedRhs $ fakeExp hs) emptyBinds] ] -checkCover :: QName -> HaskellType -> Nat -> [QName] -> TCM [HS.Decl]-checkCover q ty n cs = do+checkCover :: QName -> HaskellType -> Nat -> [QName] -> [HaskellCode] -> TCM [HS.Decl]+checkCover q ty n cs hsCons = do let tvs = [ "a" ++ show i | i <- [1..n] ]- makeClause c = do+ makeClause c hsc = do a <- erasedArity c- Just (HsDefn _ hsc) <- compiledHaskell . defCompiledRep <$> getConstInfo c let pat = HS.PApp (HS.UnQual $ HS.Ident hsc) $ replicate a HS.PWildCard return $ HS.Alt pat (HS.UnGuardedRhs $ HS.unit_con) emptyBinds - cs <- mapM makeClause cs+ cs <- zipWithM makeClause cs hsCons let rhs = case cs of [] -> fakeExp "()" -- There is no empty case statement in Haskell _ -> HS.Case (HS.Var $ HS.UnQual $ HS.Ident "x") cs@@ -396,10 +489,11 @@ return $ hsVarUQ x T.TApp (T.TDef f) ts -> do used <- lift $ getCompiledArgUse f+ isCompiled <- lift $ isJust <$> getHaskellPragma f -- #2248: no unused argument pruning for COMPILE'd functions let given = length ts needed = length used missing = drop given used- if any not used+ if not isCompiled && any not used then if any not missing then term (etaExpand (needed - given) tm0) else do f <- lift $ HS.Var <$> xhqn "du" f -- used stripped function f `apps` [ t | (t, True) <- zip ts $ used ++ repeat True ]@@ -542,7 +636,7 @@ rteCon "QName" `apps` [ hsTypedInt n , hsTypedInt m- , HS.Lit $ HS.String $ show x+ , HS.Lit $ HS.String $ prettyShow x , rteCon "Fixity" `apps` [ litAssoc (fixityAssoc fx) , litPrec (fixityLevel fx) ] ]@@ -585,6 +679,20 @@ cdecl q n = HS.ConDecl (unqhname "C" q) [ HS.TyVar $ ihname "a" i | i <- [0 .. n - 1] ] +compiledcondecl :: QName -> TCM HS.Decl+compiledcondecl q = do+ (ar, np) <- conArityAndPars q+ hsCon <- fromMaybe __IMPOSSIBLE__ <$> getHaskellConstructor q+ let patVars = map (HS.PVar . ihname "a") [0 .. ar - 1]+ return $ HS.PatSyn (HS.PApp (HS.UnQual $ unqhname "C" q) patVars) (HS.PApp (hsName hsCon) patVars)++compiledTypeSynonym :: QName -> String -> Nat -> HS.Decl+compiledTypeSynonym q hsT arity =+ HS.TypeDecl (unqhname "T" q) (map HS.UnkindedVar vs)+ (foldl HS.TyApp (HS.FakeType hsT) $ map HS.TyVar vs)+ where+ vs = [ ihname "a" i | i <- [0 .. arity - 1]]+ tvaldecl :: QName -> Induction -- ^ Is the type inductive or coinductive?@@ -640,6 +748,7 @@ -- functions. hsCastApp :: HS.Exp -> HS.Exp hsCastApp (HS.Lambda ps b) = HS.Lambda ps (hsCastApp b)+hsCastApp (HS.Let bs e) = HS.Let bs $ hsCastApp e hsCastApp (HS.Case sc bs) = HS.Case (hsCastApp sc) (map (hsMapAlt hsCastApp) bs) hsCastApp (HS.InfixApp e1 op e2) = HS.InfixApp (hsCastApp e1) op (hsCastApp e2) hsCastApp e =@@ -680,6 +789,7 @@ , "ScopedTypeVariables" , "NoMonomorphismRestriction" , "Rank2Types"+ , "PatternSynonyms" ] @@ -701,35 +811,42 @@ outFile_ :: TCM FilePath outFile_ = outFile =<< curHsMod -callGHC :: IsMain -> Interface -> TCM ()-callGHC modIsMain i = do- setInterface i- mdir <- compileDir- hsmod <- prettyPrint <$> curHsMod- MName agdaMod <- curMName- let outputName = case agdaMod of+callGHC :: GHCOptions -> IsMain -> Map ModuleName IsMain -> TCM ()+callGHC opts modIsMain mods = do+ mdir <- compileDir+ hsmod <- prettyPrint <$> curHsMod+ agdaMod <- curMName+ let outputName = case mnameToList agdaMod of [] -> __IMPOSSIBLE__ ms -> last ms (mdir, fp) <- outFile' =<< curHsMod- opts <- optGhcFlags <$> commandLineOptions+ let ghcopts = optGhcFlags opts + let modIsReallyMain = fromMaybe __IMPOSSIBLE__ $ Map.lookup agdaMod mods+ isMain = mappend modIsMain modIsReallyMain -- both need to be IsMain++ -- Warn if no main function and not --no-main+ when (modIsMain /= isMain) $+ genericWarning =<< fsep (pwords "No main function defined in" ++ [prettyTCM agdaMod <> text "."] +++ pwords "Use --no-main to suppress this warning.")+ let overridableArgs = [ "-O"] ++- (if modIsMain == IsMain then ["-o", mdir </> show (nameConcrete outputName)] else []) +++ (if isMain == IsMain then ["-o", mdir </> show (nameConcrete outputName)] else []) ++ [ "-Werror"] otherArgs = [ "-i" ++ mdir] ++- (if modIsMain == IsMain then ["-main-is", hsmod] else []) +++ (if isMain == IsMain then ["-main-is", hsmod] else []) ++ [ fp , "--make" , "-fwarn-incomplete-patterns" , "-fno-warn-overlapping-patterns" ]- args = overridableArgs ++ opts ++ otherArgs+ args = overridableArgs ++ ghcopts ++ otherArgs compiler = "ghc" -- Note: Some versions of GHC use stderr for progress reports. For -- those versions of GHC we don't print any progress information -- unless an error is encountered.- doCall <- optGhcCallGhc <$> commandLineOptions+ let doCall = optGhcCallGhc opts callCompiler doCall compiler args
src/full/Agda/Compiler/MAlonzo/Encode.hs view
@@ -8,7 +8,7 @@ import Data.Char import Data.Function-import Data.List+import qualified Data.List as List import qualified Agda.Utils.Haskell.Syntax as HS import Agda.Compiler.MAlonzo.Misc@@ -26,7 +26,7 @@ -- @.@s may be adjacent. encodeModuleName :: HS.ModuleName -> HS.ModuleName-encodeModuleName (HS.ModuleName s) = HS.ModuleName $ case stripPrefix mazstr s of+encodeModuleName (HS.ModuleName s) = HS.ModuleName $ case List.stripPrefix mazstr s of Just s' -> mazstr ++ foldr encNamePart "" (splitUp' s') Nothing -> s where@@ -66,4 +66,3 @@ enc c r | isOK c = c : r | otherwise = escapeChar : shows (fromEnum c) (escapeChar : r)-
+ src/full/Agda/Compiler/MAlonzo/HaskellTypes.hs view
@@ -0,0 +1,167 @@+{-# LANGUAGE CPP #-}++-- | Translating Agda types to Haskell types. Used to ensure that imported+-- Haskell functions have the right type.++module Agda.Compiler.MAlonzo.HaskellTypes where++import Control.Applicative+import Data.Maybe (fromMaybe)++import Agda.Syntax.Common+import Agda.Syntax.Internal+import Agda.TypeChecking.Monad+import Agda.TypeChecking.Monad.Builtin+import Agda.TypeChecking.Pretty+import Agda.TypeChecking.Primitive (getBuiltinName)+import Agda.TypeChecking.Reduce+import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Free++import Agda.Compiler.MAlonzo.Pragmas+import Agda.Compiler.MAlonzo.Misc+import Agda.Compiler.MAlonzo.Pretty++import Agda.Utils.Except ( MonadError(catchError) )+import Agda.Utils.Pretty (prettyShow)++#include "undefined.h"+import Agda.Utils.Impossible++type HaskellKind = String++hsStar :: HaskellKind+hsStar = "*"++hsKFun :: HaskellKind -> HaskellKind -> HaskellKind+hsKFun k l = "(" ++ k ++ " -> " ++ l ++ ")"++hsFun :: HaskellKind -> HaskellKind -> HaskellKind+hsFun a b = "(" ++ a ++ " -> " ++ b ++ ")"++hsUnit :: HaskellType+hsUnit = "()"++hsVar :: Name -> HaskellType+hsVar x = "x" ++ concatMap encode (prettyShow x)+ where+ okChars = ['a'..'z'] ++ ['A'..'Y'] ++ "_'"+ encode 'Z' = "ZZ"+ encode c+ | c `elem` okChars = [c]+ | otherwise = "Z" ++ show (fromEnum c)+++hsApp :: String -> [HaskellType] -> HaskellType+hsApp d [] = d+hsApp d as = "(" ++ unwords (d : as) ++ ")"++hsForall :: String -> HaskellType -> HaskellType+hsForall x a = "(forall " ++ x ++ ". " ++ a ++ ")"++notAHaskellType :: Type -> TCM a+notAHaskellType a = typeError . GenericDocError =<< do+ fsep $ pwords "The type" ++ [prettyTCM a] +++ pwords "cannot be translated to a Haskell type."+++getHsType :: QName -> TCM HaskellType+getHsType x = do+ d <- getHaskellPragma x+ let namedType = do+ -- For these builtin types, the type name (xhqn ...) refers to the+ -- generated, but unused, datatype and not the primitive type.+ nat <- getBuiltinName builtinNat+ int <- getBuiltinName builtinInteger+ bool <- getBuiltinName builtinBool+ case () of+ _ | Just x `elem` [nat, int] -> return "Integer"+ | Just x == bool -> return "Bool"+ | otherwise -> prettyShow <$> xhqn "T" x+ setCurrentRange d $ case d of+ Just HsDefn{} -> return hsUnit+ Just HsType{} -> namedType+ Just HsData{} -> namedType+ _ -> notAHaskellType (El Prop $ Def x [])++getHsVar :: Nat -> TCM HaskellCode+getHsVar i = hsVar <$> nameOfBV i++-- | Note that @Inf a b@, where @Inf@ is the INFINITY builtin, is+-- translated to @<translation of b>@ (assuming that all coinductive+-- builtins are defined).+--+-- Note that if @haskellType@ supported universe polymorphism then the+-- special treatment of INFINITY might not be needed.++haskellType' :: Type -> TCM HaskellType+haskellType' t = fromType t+ where+ err = notAHaskellType t+ fromArgs = mapM (fromTerm . unArg)+ fromType = fromTerm . unEl+ fromTerm v = do+ v <- unSpine <$> reduce v+ reportSLn "compile.haskell.type" 50 $ "toHaskellType " ++ show v+ kit <- liftTCM coinductionKit+ case v of+ Var x es -> do+ let args = fromMaybe __IMPOSSIBLE__ $ allApplyElims es+ hsApp <$> getHsVar x <*> fromArgs args+ Def d es | Just d == (nameOfInf <$> kit) ->+ case es of+ [Apply a, Apply b] -> fromTerm (unArg b)+ _ -> err+ Def d es -> do+ let args = fromMaybe __IMPOSSIBLE__ $ allApplyElims es+ hsApp <$> getHsType d <*> fromArgs args+ Pi a b ->+ if isBinderUsed b -- Andreas, 2012-04-03. Q: could we rely on Abs/NoAbs instead of again checking freeness of variable?+ then do+ hsA <- fromType (unDom a)+ underAbstraction a b $ \b ->+ hsForall <$> getHsVar 0 <*> (hsFun hsA <$> fromType b)+ else hsFun <$> fromType (unDom a) <*> fromType (noabsApp __IMPOSSIBLE__ b)+ Con c ci args -> hsApp <$> getHsType (conName c) <*> fromArgs args+ Lam{} -> err+ Level{} -> return hsUnit+ Lit{} -> return hsUnit+ Sort{} -> return hsUnit+ Shared p -> fromTerm $ derefPtr p+ MetaV{} -> err+ DontCare{} -> err++haskellType :: QName -> TCM HaskellType+haskellType q = do+ def <- getConstInfo q+ let np = case theDef def of+ Constructor{ conPars = np } -> np+ _ -> 0+ underPars 0 a = haskellType' a+ underPars n a = do+ a <- reduce a+ case unEl a of+ Pi a (NoAbs _ b) -> underPars (n - 1) b+ Pi a b -> underAbstraction a b $ \b -> hsForall <$> getHsVar 0 <*> underPars (n - 1) b+ _ -> __IMPOSSIBLE__+ ty <- underPars np $ defType def+ reportSLn "tc.pragma.compile" 10 $ "Haskell type for " ++ prettyShow q ++ ": " ++ ty+ return ty++checkConstructorCount :: QName -> [QName] -> [HaskellCode] -> TCM ()+checkConstructorCount d cs hsCons+ | n == hn = return ()+ | otherwise = do+ let n_forms_are = case hn of+ 1 -> "1 Haskell constructor is"+ n -> show n ++ " Haskell constructors are"+ only | hn == 0 = ""+ | hn < n = "only "+ | otherwise = ""++ genericDocError =<<+ fsep ([prettyTCM d] ++ pwords ("has " ++ show n +++ " constructors, but " ++ only ++ n_forms_are ++ " given [" ++ unwords hsCons ++ "]"))+ where+ n = length cs+ hn = length hsCons
src/full/Agda/Compiler/MAlonzo/Misc.hs view
@@ -4,7 +4,7 @@ import Control.Monad.State (gets) import Data.Char-import Data.List as List+import qualified Data.List as List import Data.Map as Map import Data.Set as Set import Data.Function@@ -12,6 +12,7 @@ import qualified Agda.Utils.Haskell.Syntax as HS import Agda.Compiler.Common+import Agda.Compiler.MAlonzo.Pragmas import Agda.Syntax.Common import Agda.Syntax.Internal@@ -22,6 +23,7 @@ import Agda.Utils.Lens import Agda.Utils.Monad import Agda.Utils.Pretty+import Agda.Utils.Maybe #include "undefined.h" import Agda.Utils.Impossible@@ -82,11 +84,7 @@ conhqn q = do cq <- canonicalName q def <- getConstInfo cq- cname <- xhqn "C" cq -- Do this even if it has custom compiledHaskell code- -- to make sure we get the import.- case (compiledHaskell (defCompiledRep def), theDef def) of- (Just (HsDefn _ hs), Constructor{}) -> return $ hsName hs- _ -> return cname+ xhqn "C" cq -- qualify name s by the module of builtin b bltQual :: String -> String -> TCM HS.QName
+ src/full/Agda/Compiler/MAlonzo/Pragmas.hs view
@@ -0,0 +1,200 @@+{-# LANGUAGE CPP #-}+module Agda.Compiler.MAlonzo.Pragmas where++import Control.Applicative+import Control.Monad+import Data.Maybe+import Data.Char+import qualified Data.List as List+import Data.Traversable (traverse)+import Data.Map (Map)+import qualified Data.Map as Map++import Agda.Syntax.Position+import Agda.Syntax.Abstract.Name+import Agda.TypeChecking.Monad+import Agda.TypeChecking.Monad.Builtin+import Agda.TypeChecking.Primitive++import Agda.Utils.Lens+import Agda.Utils.Parser.ReadP+import Agda.Utils.Pretty hiding (char)+import Agda.Utils.String ( ltrim )+import Agda.Utils.Three++import Agda.Compiler.Common++import Agda.Utils.Impossible+#include "undefined.h"++data HaskellPragma+ = HsDefn Range HaskellCode+ | HsType Range HaskellType+ | HsData Range HaskellType [HaskellCode]+ | HsExport Range HaskellCode+ deriving (Show, Eq)++instance HasRange HaskellPragma where+ getRange (HsDefn r _) = r+ getRange (HsType r _) = r+ getRange (HsData r _ _) = r+ getRange (HsExport r _) = r++-- Syntax for Haskell pragmas:+-- HsDefn CODE "= CODE"+-- HsType TYPE "= type TYPE"+-- HsData NAME CONS "= data NAME (CON₁ | .. | CONₙ)"+-- HsExport NAME "as NAME"+parsePragma :: CompilerPragma -> Either String HaskellPragma+parsePragma (CompilerPragma r s) =+ case parse pragmaP s of+ [] -> Left $ "Failed to parse GHC pragma '" ++ s ++ "'"+ [p] -> Right p+ ps -> Left $ "Ambiguous parse of pragma '" ++ s ++ "':\n" ++ unlines (map show ps) -- shouldn't happen+ where+ pragmaP :: ReadP Char HaskellPragma+ pragmaP = choice [ exportP, typeP, dataP, defnP ]++ whitespace = many1 (satisfy isSpace)++ wordsP [] = return ()+ wordsP (w:ws) = skipSpaces *> string w *> wordsP ws++ barP = skipSpaces *> char '|'++ -- quite liberal+ isIdent c = isAlphaNum c || elem c "_.':[]"+ isOp c = not $ isSpace c || elem c "()"+ hsIdent = fst <$> gather (choice+ [ string "()"+ , many1 (satisfy isIdent)+ , between (char '(') (char ')') (many1 (satisfy isOp))+ ])+ hsCode = many1 get -- very liberal++ paren = between (skipSpaces *> char '(') (skipSpaces *> char ')')++ notTypeOrData = do+ s <- look+ guard $ not $ any (`List.isPrefixOf` s) ["type", "data"]++ exportP = HsExport r <$ wordsP ["as"] <* whitespace <*> hsIdent <* skipSpaces+ typeP = HsType r <$ wordsP ["=", "type"] <* whitespace <*> hsCode+ dataP = HsData r <$ wordsP ["=", "data"] <* whitespace <*> hsIdent <*>+ paren (sepBy (skipSpaces *> hsIdent) barP) <* skipSpaces+ defnP = HsDefn r <$ wordsP ["="] <* whitespace <* notTypeOrData <*> hsCode++parseHaskellPragma :: CompilerPragma -> TCM HaskellPragma+parseHaskellPragma p = setCurrentRange p $+ case parsePragma p of+ Left err -> genericError err+ Right p -> return p++getHaskellPragma :: QName -> TCM (Maybe HaskellPragma)+getHaskellPragma q = do+ pragma <- traverse parseHaskellPragma =<< getUniqueCompilerPragma ghcBackendName q+ def <- getConstInfo q+ setCurrentRange pragma $ pragma <$ sanityCheckPragma def pragma++sanityCheckPragma :: Definition -> Maybe HaskellPragma -> TCM ()+sanityCheckPragma _ Nothing = return ()+sanityCheckPragma def (Just HsDefn{}) =+ case theDef def of+ Axiom{} -> return ()+ Function{} -> return ()+ AbstractDefn{} -> __IMPOSSIBLE__+ Datatype{} -> recOrDataErr "data"+ Record{} -> recOrDataErr "record"+ _ -> typeError $ GenericError "Haskell definitions can only be given for postulates and functions."+ where+ recOrDataErr which =+ typeError $ GenericDocError $+ sep [ text $ "Bad COMPILE GHC pragma for " ++ which ++ " type. Use"+ , text "{-# COMPILE GHC <Name> = data <HsData> (<HsCon1> | .. | <HsConN>) #-}" ]+sanityCheckPragma def (Just HsData{}) =+ case theDef def of+ Datatype{} -> return ()+ Record{} -> return ()+ _ -> typeError $ GenericError "Haskell data types can only be given for data or record types."+sanityCheckPragma def (Just HsType{}) =+ case theDef def of+ Axiom{} -> return ()+ Datatype{} -> do+ -- We use HsType pragmas for Nat, Int and Bool+ nat <- getBuiltinName builtinNat+ int <- getBuiltinName builtinInteger+ bool <- getBuiltinName builtinBool+ unless (Just (defName def) `elem` [nat, int, bool]) err+ _ -> err+ where+ err = typeError $ GenericError "Haskell types can only be given for postulates."+sanityCheckPragma def (Just HsExport{}) =+ case theDef def of+ Function{} -> return ()+ _ -> typeError $ GenericError "Only functions can be exported to Haskell using {-# COMPILE GHC <Name> as <HsName> #-}"++++-- TODO: cache this to avoid parsing the pragma for every constructor+-- occurrence!+getHaskellConstructor :: QName -> TCM (Maybe HaskellCode)+getHaskellConstructor c = do+ c <- canonicalName c+ cDef <- theDef <$> getConstInfo c+ true <- getBuiltinName builtinTrue+ false <- getBuiltinName builtinFalse+ case cDef of+ _ | Just c == true -> return $ Just "True"+ | Just c == false -> return $ Just "False"+ Constructor{conData = d} -> do+ mp <- getHaskellPragma d+ case mp of+ Just (HsData _ _ hsCons) -> do+ cons <- defConstructors . theDef <$> getConstInfo d+ return $ Just $ fromMaybe __IMPOSSIBLE__ $ lookup c $ zip cons hsCons+ _ -> return Nothing+ _ -> return Nothing++-- | Get content of @FOREIGN GHC@ pragmas, sorted by 'KindOfForeignCode':+-- file header pragmas, import statements, rest.+foreignHaskell :: TCM ([String], [String], [String])+foreignHaskell = partitionByKindOfForeignCode classifyForeign+ . map getCode . fromMaybe [] . Map.lookup ghcBackendName . iForeignCode <$> curIF+ where getCode (ForeignCode _ code) = code++-- | Classify @FOREIGN@ Haskell code.+data KindOfForeignCode+ = ForeignFileHeaderPragma+ -- ^ A pragma that must appear before the module header.+ | ForeignImport+ -- ^ An import statement. Must appear right after the module header.+ | ForeignOther+ -- ^ The rest. To appear after the import statements.++-- | Classify a @FOREIGN GHC@ declaration.+classifyForeign :: String -> KindOfForeignCode+classifyForeign s0 = case ltrim s0 of+ s | List.isPrefixOf "import " s -> ForeignImport+ s | List.isPrefixOf "{-#" s -> classifyPragma $ drop 3 s+ _ -> ForeignOther++-- | Classify a Haskell pragma into whether it is a file header pragma or not.+classifyPragma :: String -> KindOfForeignCode+classifyPragma s0 = case ltrim s0 of+ s | any (`List.isPrefixOf` s) fileHeaderPragmas -> ForeignFileHeaderPragma+ _ -> ForeignOther+ where+ fileHeaderPragmas =+ [ "LANGUAGE"+ , "OPTIONS_GHC"+ , "INCLUDE"+ ]++-- | Partition a list by 'KindOfForeignCode' attribute.+partitionByKindOfForeignCode :: (a -> KindOfForeignCode) -> [a] -> ([a], [a], [a])+partitionByKindOfForeignCode f = partition3 $ toThree . f+ where+ toThree = \case+ ForeignFileHeaderPragma -> One+ ForeignImport -> Two+ ForeignOther -> Three
src/full/Agda/Compiler/MAlonzo/Pretty.hs view
@@ -31,6 +31,8 @@ instance Pretty HS.ModulePragma where pretty (HS.LanguagePragma ps) = text "{-#" <+> text "LANGUAGE" <+> fsep (punctuate comma $ map pretty ps) <+> text "#-}"+ pretty (HS.OtherPragma p) =+ text p instance Pretty HS.ImportDecl where pretty HS.ImportDecl{ HS.importModule = m@@ -65,6 +67,7 @@ sep [ hsep (punctuate comma (map pretty fs)) <+> text "::" , nest 2 $ pretty t ] HS.FunBind ms -> vcat $ map pretty ms+ HS.PatSyn p1 p2 -> sep [ text "pattern" <+> pretty p1 <+> text "=" <+> pretty p2 ] HS.FakeDecl s -> text s instance Pretty HS.ConDecl where@@ -211,4 +214,3 @@ prettyQName :: HS.QName -> Doc prettyQName (HS.Qual m x) = pretty m <> text "." <> pretty x prettyQName (HS.UnQual x) = pretty x-
src/full/Agda/Compiler/MAlonzo/Primitives.hs view
@@ -4,9 +4,9 @@ import Control.Monad.State import Data.Char-import Data.List as L+import qualified Data.List as List import Data.Map as M-import qualified Agda.Utils.Haskell.Syntax as HS+import Data.Maybe import Agda.Compiler.Common import Agda.Compiler.ToTreeless@@ -21,34 +21,31 @@ import Agda.TypeChecking.Primitive import Agda.TypeChecking.Reduce import Agda.TypeChecking.Pretty-import Agda.Utils.Monad++import Agda.Utils.Either import Agda.Utils.Except+import Agda.Utils.Lens+import Agda.Utils.Monad import qualified Agda.Utils.HashMap as HMap+import qualified Agda.Utils.Haskell.Syntax as HS #include "undefined.h" import Agda.Utils.Impossible -{- OLD--- | Check that the main function has type IO a, for some a.-checkTypeOfMain :: QName -> Type -> TCM ()-checkTypeOfMain q ty- | show (qnameName q) /= "main" = return ()- | otherwise = do- Def io _ <- ignoreSharing <$> primIO- ty <- normalise ty- case ignoreSharing $ unEl ty of- Def d _ | d == io -> return ()- _ -> do- err <- fsep $- pwords "The type of main should be" ++- [prettyTCM io] ++ pwords " A, for some A. The given type is" ++ [prettyTCM ty]- typeError $ GenericError $ show err--}+isMainFunction :: QName -> Bool+isMainFunction q = "main" == show (nameConcrete $ qnameName q) +hasMainFunction :: Interface -> IsMain+hasMainFunction i+ | List.any isMainFunction names = IsMain+ | otherwise = NotMain+ where+ names = HMap.keys $ iSignature i ^. sigDefinitions+ -- | Check that the main function has type IO a, for some a. checkTypeOfMain :: QName -> Type -> TCM [HS.Decl] -> TCM [HS.Decl] checkTypeOfMain q ty ret- | show (nameConcrete $ qnameName q) /= "main" = ret+ | not (isMainFunction q) = ret | otherwise = do Def io _ <- ignoreSharing <$> primIO ty <- normalise ty@@ -84,12 +81,12 @@ -- primitives only used by GuardsToPrims transformation, which MAlonzo doesn't use PIf -> __IMPOSSIBLE__ --- Haskell modules to be imported for BUILT-INs+-- | Haskell modules to be imported for BUILT-INs importsForPrim :: TCM [HS.ModuleName] importsForPrim = fmap (++ [HS.ModuleName "Data.Text"]) $ xForPrim $- L.map (\(s, ms) -> (s, return (L.map HS.ModuleName ms))) $+ List.map (\(s, ms) -> (s, return (List.map HS.ModuleName ms))) $ [ "CHAR" |-> ["Data.Char"] , "primIsAlpha" |-> ["Data.Char"] , "primIsAscii" |-> ["Data.Char"]@@ -116,14 +113,14 @@ getName (Builtin (Lam _ b)) = getName (Builtin $ unAbs b) getName (Builtin _) = __IMPOSSIBLE__ getName (Prim (PrimFun q _ _)) = q- concat <$> sequence [ maybe (return []) id $ L.lookup s table+ concat <$> sequence [ fromMaybe (return []) $ List.lookup s table | (s, def) <- bs, getName def `elem` qs ] --- Definition bodies for primitive functions+-- | Definition bodies for primitive functions primBody :: String -> TCM HS.Exp-primBody s = maybe unimplemented (either (hsVarUQ . HS.Ident) id <$>) $- L.lookup s $+primBody s = maybe unimplemented (fromRight (hsVarUQ . HS.Ident) <$>) $+ List.lookup s $ [ -- Integer functions "primIntegerPlus" |-> binAsis "(+)" "Integer"@@ -200,7 +197,7 @@ , "primStringFromList" |-> return "Data.Text.pack" , "primStringAppend" |-> binAsis "Data.Text.append" "Data.Text.Text" , "primStringEquality" |-> rel "(==)" "Data.Text.Text"- , "primShowString" |-> return "id"+ , "primShowString" |-> return "(Data.Text.pack . show :: Data.Text.Text -> Data.Text.Text)" -- Reflection , "primQNameEquality" |-> rel "(==)" "MAlonzo.RTE.QName"
src/full/Agda/Compiler/ToTreeless.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} module Agda.Compiler.ToTreeless ( toTreeless@@ -44,6 +43,7 @@ import Agda.Utils.Maybe import Agda.Utils.Monad import Agda.Utils.Lens+import Agda.Utils.Pretty (prettyShow) import qualified Agda.Utils.Pretty as P #include "undefined.h"@@ -63,7 +63,7 @@ toTreeless' :: QName -> TCM C.TTerm toTreeless' q =- flip fromMaybeM (getTreeless q) $ verboseBracket "treeless.convert" 20 ("compiling " ++ show q) $ do+ flip fromMaybeM (getTreeless q) $ verboseBracket "treeless.convert" 20 ("compiling " ++ prettyShow q) $ do Just cc <- defCompiled <$> getConstInfo q unlessM (alwaysInline q) $ setTreeless q (C.TDef q) -- so recursive inlining doesn't loop, but not for always inlined@@ -81,7 +81,7 @@ ccToTreeless :: QName -> CC.CompiledClauses -> TCM C.TTerm ccToTreeless q cc = do let pbody b = pbody' "" b- pbody' suf b = sep [ text (show q ++ suf) <+> text "=", nest 2 $ prettyPure b ]+ pbody' suf b = sep [ text (prettyShow q ++ suf) <+> text "=", nest 2 $ prettyPure b ] v <- ifM (alwaysInline q) (return 20) (return 0) reportSDoc "treeless.convert" (30 + v) $ text "-- compiled clauses of" <+> prettyTCM q $$ nest 2 (prettyPure cc) body <- casetreeTop cc@@ -168,9 +168,11 @@ casetree cc = do case cc of CC.Fail -> return C.tUnreachable- CC.Done xs v -> lambdasUpTo (length xs) $ do- v <- lift $ putAllowedReductions [ProjectionReductions, CopatternReductions] $ normalise v- substTerm v+ CC.Done xs v -> withContextSize (length xs) $ do+ -- Issue 2469: Body context size (`length xs`) may be smaller than current context size+ -- if some arguments are not used in the body.+ v <- lift (putAllowedReductions [ProjectionReductions, CopatternReductions] $ normalise v)+ substTerm v CC.Case _ (CC.Branches True _ _ Just{}) -> __IMPOSSIBLE__ -- Andreas, 2016-06-03, issue #1986: Ulf: "no catch-all for copatterns!" -- lift $ do@@ -231,32 +233,49 @@ local (\e -> e { ccCatchAll = Just 0, ccCxt = shift 1 (ccCxt e) }) $ do C.mkLet def <$> cont -lambdasUpTo :: Int -> CC C.TTerm -> CC C.TTerm-lambdasUpTo n cont = do+-- | Shrinks or grows the context to the given size.+-- Does not update the catchAll expression, the catchAll expression+-- MUST NOT be used inside `cont`.+withContextSize :: Int -> CC C.TTerm -> CC C.TTerm+withContextSize n cont = do diff <- (n -) . length <$> asks ccCxt - if diff <= 0 then cont -- no new lambdas needed+ if diff <= 0+ then do+ local (\e -> e { ccCxt = shift diff $ drop (-diff) (ccCxt e)}) $+ C.mkTApp <$> cont <*> pure [C.TVar i | i <- reverse [0..(-diff - 1)]] else do- catchAll <- asks ccCatchAll- local (\e -> e { ccCxt = [0..(diff - 1)] ++ shift diff (ccCxt e)}) $ do createLambdas diff <$> do- case catchAll of- Just catchAll' -> do- -- the catch all doesn't know about the additional lambdas, so just directly- -- apply it again to the newly introduced lambda arguments.- -- we also bind the catch all to a let, to avoid code duplication- local (\e -> e { ccCatchAll = Just 0- , ccCxt = shift 1 (ccCxt e)}) $ do- let catchAllArgs = map C.TVar $ reverse [0..(diff - 1)]- C.mkLet (C.mkTApp (C.TVar $ catchAll' + diff) catchAllArgs)- <$> cont- Nothing -> cont+ cont where createLambdas :: Int -> C.TTerm -> C.TTerm createLambdas 0 cont' = cont' createLambdas i cont' | i > 0 = C.TLam (createLambdas (i - 1) cont') createLambdas _ _ = __IMPOSSIBLE__ +-- | Adds lambdas until the context has at least the given size.+-- Updates the catchAll expression to take the additional lambdas into account.+lambdasUpTo :: Int -> CC C.TTerm -> CC C.TTerm+lambdasUpTo n cont = do+ diff <- (n -) . length <$> asks ccCxt++ if diff <= 0 then cont -- no new lambdas needed+ else do+ catchAll <- asks ccCatchAll++ withContextSize n $ do+ case catchAll of+ Just catchAll' -> do+ -- the catch all doesn't know about the additional lambdas, so just directly+ -- apply it again to the newly introduced lambda arguments.+ -- we also bind the catch all to a let, to avoid code duplication+ local (\e -> e { ccCatchAll = Just 0+ , ccCxt = shift 1 (ccCxt e)}) $ do+ let catchAllArgs = map C.TVar $ reverse [0..(diff - 1)]+ C.mkLet (C.mkTApp (C.TVar $ catchAll' + diff) catchAllArgs)+ <$> cont+ Nothing -> cont+ conAlts :: Int -> Map QName (CC.WithArity CC.CompiledClauses) -> CC [C.TAlt] conAlts x br = forM (Map.toList br) $ \ (c, CC.WithArity n cc) -> do c' <- lift $ canonicalName c@@ -372,6 +391,5 @@ case getRelevance x of Irrelevant -> True NonStrict -> True- UnusedArg -> True Forced{} -> False -- TODO: would like this to be True Relevant -> False
− src/full/Agda/Compiler/Treeless/DelayCoinduction.hs
@@ -1,69 +0,0 @@-{-# LANGUAGE CPP #-}--- | Inserts an additional lambda into all coinductive auxiliary definitions (== target type Inf XX). E.g.:------ f : A -> B -> C -> Inf A--- f = \a b c -> body--- is converted to--- f = \a b c _ -> body------ Assumes that flat/sharp are implemented as follows:------ flat = \x -> x--- sharp = \x -> x ()--module Agda.Compiler.Treeless.DelayCoinduction where--import Control.Applicative--import Agda.Syntax.Internal (Type)-import Agda.Syntax.Abstract.Name (QName)-import Agda.Syntax.Treeless--import Agda.TypeChecking.Monad-import Agda.TypeChecking.Monad.Builtin-import Agda.TypeChecking.Primitive-import Agda.TypeChecking.Reduce ( instantiateFull, normalise )-import Agda.TypeChecking.Substitute hiding (underLambdas)-import Agda.TypeChecking.Telescope--import Agda.Compiler.Treeless.Subst--import Agda.Utils.Impossible--#include "undefined.h"--delayCoinduction :: TTerm -> Type -> TCM TTerm-delayCoinduction t ty = do- kit <- coinductionKit- case kit of- Just kit -> transform kit t ty- Nothing -> return t---transform :: CoinductionKit -> TTerm -> Type -> TCM TTerm-transform kit t ty = do- isInf <- outputIsInf (Just kit) ty- if isInf then do- ty <- normalise ty- TelV tel _ <- telView ty- -- insert additional lambda- return $ underLambdas (length $ telToList tel) (TLam . raise 1) t- else- return t---outputIsInf :: Maybe CoinductionKit -> Type -> TCM Bool-outputIsInf kit ty = do- ty <- normalise ty- tn <- getOutputTypeName ty- case tn of- OutputTypeName tn -> return $ Just tn == (nameOfInf <$> kit)- _ -> return False---underLambdas :: Int -> (TTerm -> TTerm) -> TTerm -> TTerm-underLambdas n cont v = loop n v where- loop 0 v = cont v- loop n v = case v of- TLam b -> TLam $ loop (n-1) b- _ -> __IMPOSSIBLE__
+ src/full/Agda/Compiler/Treeless/EliminateDefaults.hs view
@@ -0,0 +1,65 @@+{-# LANGUAGE CPP #-}+-- | Eliminates case defaults by adding an alternative for all possible+-- constructors. Literal cases are preserved as-is.+module Agda.Compiler.Treeless.EliminateDefaults where++import Control.Applicative+import Control.Monad+import qualified Data.List as List+import Data.Maybe++import Agda.Syntax.Abstract.Name (QName)+import Agda.Syntax.Treeless+import Agda.Syntax.Literal+import qualified Agda.Syntax.Internal as I++import Agda.TypeChecking.Monad+import Agda.TypeChecking.Monad.Builtin+import Agda.TypeChecking.Primitive+import Agda.TypeChecking.Substitute++import Agda.Compiler.Treeless.Subst++import Agda.Utils.Impossible++#include "undefined.h"++eliminateCaseDefaults :: TTerm -> TCM TTerm+eliminateCaseDefaults = tr+ where+ tr :: TTerm -> TCM TTerm+ tr t = case t of+ TCase sc ct@(CTData qn) def alts | not (isUnreachable def) -> do+ dtCons <- defConstructors . theDef <$> getConstInfo qn+ let missingCons = dtCons List.\\ map aCon alts+ def <- tr def+ newAlts <- forM missingCons $ \con -> do+ Constructor {conArity = ar} <- theDef <$> getConstInfo con+ return $ TACon con ar (TVar ar)++ alts' <- (++ newAlts) <$> mapM (trAlt . raise 1) alts++ return $ TLet def $ TCase (sc + 1) ct tUnreachable alts'+ TCase sc ct def alts -> TCase sc ct <$> tr def <*> mapM trAlt alts++ TVar{} -> tt+ TDef{} -> tt+ TCon{} -> tt+ TPrim{} -> tt+ TLit{} -> tt+ TUnit{} -> tt+ TSort{} -> tt+ TErased{} -> tt+ TError{} -> tt++ TLam b -> TLam <$> tr b+ TApp a bs -> TApp <$> tr a <*> mapM tr bs+ TLet e b -> TLet <$> tr e <*> tr b++ where tt = return t++ trAlt :: TAlt -> TCM TAlt+ trAlt a = case a of+ TAGuard g b -> TAGuard <$> tr g <*> tr b+ TACon q a b -> TACon q a <$> tr b+ TALit l b -> TALit l <$> tr b
src/full/Agda/Compiler/Treeless/EliminateLiteralPatterns.hs view
@@ -3,7 +3,6 @@ module Agda.Compiler.Treeless.EliminateLiteralPatterns where import Control.Applicative-import Data.List import Data.Maybe import Agda.Syntax.Abstract.Name (QName)@@ -49,7 +48,10 @@ litAlt _ _ = __IMPOSSIBLE__ TCase sc t@(CTData dt) def alts -> TCase sc t (tr def) (map trAlt alts) where- trAlt a = a { aBody = tr (aBody a) }+ trAlt a = case a of+ TAGuard g b -> TAGuard (tr g) (tr b)+ TACon q a b -> TACon q a (tr b)+ TALit l b -> TALit l (tr b) TCase _ _ _ _ -> __IMPOSSIBLE__ TVar{} -> t
src/full/Agda/Compiler/Treeless/Erase.hs view
@@ -27,15 +27,16 @@ import Agda.Compiler.Treeless.Subst import Agda.Compiler.Treeless.Pretty -import Agda.Utils.Maybe-import Agda.Utils.Impossible-import Agda.Utils.Monad import Agda.Utils.Functor import Agda.Utils.Lens+import Agda.Utils.Maybe import Agda.Utils.Memo+import Agda.Utils.Monad+import Agda.Utils.Pretty (prettyShow) import qualified Agda.Utils.Pretty as P #include "undefined.h"+import Agda.Utils.Impossible data ESt = ESt { _funMap :: Map QName FunInfo , _typeMap :: Map QName TypeInfo }@@ -173,7 +174,6 @@ erasableR Forced{} = False -- TODO: should be True but need to transform clauses erasableR NonStrict = True erasableR Irrelevant = True-erasableR UnusedArg = True erasable :: TypeInfo -> Bool erasable Erasable = True@@ -191,7 +191,7 @@ is <- mapM (getTypeInfo . snd . dget) tel return (zipWith (mkR . getRelevance) tel is, t) h <- if isAbsurdLambdaName q then pure Erasable else getTypeInfo t- lift $ reportSLn "treeless.opt.erase.info" 50 $ "type info for " ++ show q ++ ": " ++ show rs ++ " -> " ++ show h+ lift $ reportSLn "treeless.opt.erase.info" 50 $ "type info for " ++ prettyShow q ++ ": " ++ show rs ++ " -> " ++ show h lift $ setErasedConArgs q $ map erasableR rs return (rs, h) @@ -252,4 +252,3 @@ I.Function{ funClauses = cs } -> sumTypeInfo <$> mapM (maybe (return Empty) (getTypeInfo . El Prop) . clauseBody) cs _ -> return NotErasable-
src/full/Agda/Compiler/Treeless/GuardsToPrims.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE CPP #-} module Agda.Compiler.Treeless.GuardsToPrims ( convertGuards ) where -import Data.List+import qualified Data.List as List import Agda.Syntax.Abstract.Name (QName)@@ -59,6 +59,6 @@ -- | Split alts into TAGuard alts and other alts. splitAlts :: [TAlt] -> ([TAlt], [TAlt])-splitAlts = partition isGuardAlt+splitAlts = List.partition isGuardAlt where isGuardAlt (TAGuard _ _) = True isGuardAlt _ = False
src/full/Agda/Compiler/Treeless/Identity.hs view
@@ -6,7 +6,7 @@ import Data.Foldable (foldMap) import Data.Semigroup import Data.List.NonEmpty (NonEmpty(..))-import Data.List+import qualified Data.List as List import Agda.Syntax.Treeless import Agda.TypeChecking.Substitute@@ -62,7 +62,7 @@ notId = IdIn [] instance Semigroup IdentityIn where- IdIn xs <> IdIn ys = IdIn $ intersect xs ys+ IdIn xs <> IdIn ys = IdIn $ List.intersect xs ys -- Does the function always return one of its arguments unchanged (possibly -- through recursive calls).@@ -99,4 +99,3 @@ goAlt k (TALit _ b) = go k b goAlt k (TAGuard _ b) = go k b goAlt k (TACon _ n b) = go (k + n) b-
src/full/Agda/Compiler/Treeless/Pretty.hs view
@@ -98,8 +98,8 @@ <$> pTerm' 0 a <*> pTerm' 0 b <*> pTerm c- TDef f -> pure $ text (show f)- TCon c -> pure $ text (show c)+ TDef f -> pure $ pretty f+ TCon c -> pure $ pretty c TLit l -> pure $ pretty l TPrim op | isJust (isInfix op) -> pure $ text ("_" ++ opName op ++ "_") | otherwise -> pure $ text (opName op)@@ -151,4 +151,3 @@ TSort -> pure $ text "Set" TErased -> pure $ text "_" TError err -> paren 9 $ pure $ text "error" <+> text (show (show err))-
src/full/Agda/Compiler/Treeless/Simplify.hs view
@@ -6,7 +6,7 @@ import Control.Monad.Reader import Control.Monad.Writer import Data.Traversable (traverse)-import Data.List+import qualified Data.List as List import Agda.Syntax.Treeless import Agda.Syntax.Internal (Substitution'(..))@@ -55,6 +55,9 @@ underLet :: TTerm -> S a -> S a underLet u = onRewrite (raiseS 1) . onSubst (\rho -> wkS 1 $ u :# rho) +bindVar :: Int -> TTerm -> S a -> S a+bindVar x u = onSubst (inplaceS x u `composeS`)+ rewrite :: TTerm -> S TTerm rewrite t = do rules <- asks envRewrite@@ -251,10 +254,11 @@ simplAlt x (TALit l b) = TALit l <$> maybeAddRewrite x (TLit l) (simpl b) simplAlt x (TAGuard g b) = TAGuard <$> simpl g <*> simpl b + -- If x is already bound we add a rewrite, otherwise we bind x to rhs. maybeAddRewrite x rhs cont = do v <- lookupVar x case v of- TVar y | x == y -> cont+ TVar y | x == y -> bindVar x rhs $ cont _ -> addRewrite v rhs cont isTrue (TCon c) = Just c == true@@ -268,7 +272,7 @@ b_a <- rewrite' (tOp PLt b a) b_sa <- rewrite' (tOp PLt b (tOp PAdd (tInt 1) a)) a_b <- rewrite' (tOp PLt a b)- if isTrue b_a || isTrue b_sa || isFalse b_a && isFalse a_b+ if isTrue b_a || isTrue b_sa || isFalse a_b then pure $ tOp PSub a b else tApp f es @@ -312,7 +316,7 @@ Nothing -> return $ TCase x CTNat d bs where complete bs small (Just upper)- | null $ [0..upper - 1] \\ small = Just []+ | null $ [0..upper - 1] List.\\ small = Just [] complete (b@(TALit (LitNat _ n) _) : bs) small upper = (b :) <$> complete bs (n : small) upper complete (b@(TAGuard (TApp (TPrim PGeq) [TVar y, TLit (LitNat _ j)]) _) : bs) small upper | x == y =@@ -367,12 +371,12 @@ aCancel :: [Atom] -> [Atom] aCancel (a : as)- | elem (aNeg a) as = aCancel (delete (aNeg a) as)+ | elem (aNeg a) as = aCancel (List.delete (aNeg a) as) | otherwise = a : aCancel as aCancel [] = [] sortR :: Ord a => [a] -> [a]-sortR = sortBy (flip compare)+sortR = List.sortBy (flip compare) aAdd :: Arith -> Arith -> Arith aAdd (a, xs) (b, ys) = (a + b, aCancel $ sortR $ xs ++ ys)@@ -405,4 +409,3 @@ simplArith :: TTerm -> TTerm simplArith = fromArith . toArith-
src/full/Agda/Compiler/Treeless/Subst.hs view
@@ -69,7 +69,7 @@ Occurs a k s <> Occurs b l t = Occurs (a + b) (k <> l) (s <> t) instance Monoid Occurs where- mempty = Occurs 0 mempty mempty+ mempty = Occurs 0 mempty mempty mappend = (<>) class HasFree a where
src/full/Agda/Compiler/Treeless/Unused.hs view
@@ -16,13 +16,15 @@ import Agda.Compiler.Treeless.Subst import Agda.Compiler.Treeless.Pretty +import Agda.Utils.Pretty (prettyShow)+ usedArguments :: QName -> TTerm -> TCM [Bool] usedArguments q t = computeUnused q b (replicate n False) where (n, b) = tLamView t computeUnused :: QName -> TTerm -> [Bool] -> TCM [Bool] computeUnused q t used = do- reportSLn "treeless.opt.unused" 50 $ "Unused approximation for " ++ show q ++ ": " +++ reportSLn "treeless.opt.unused" 50 $ "Unused approximation for " ++ prettyShow q ++ ": " ++ unwords [ if u then [x] else "_" | (x, u) <- zip ['a'..] used ] setCompiledArgUse q used fv <- go t@@ -68,4 +70,3 @@ computeSubst (False : bs) = TErased :# computeSubst bs computeSubst (True : bs) = liftS 1 $ computeSubst bs computeSubst [] = idS-
− src/full/Agda/Compiler/UHC/Bridge.hs
@@ -1,292 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DeriveDataTypeable #-}---- | Exports the UHC API, and provides dummy--- definitions if the backend is disabled.-module Agda.Compiler.UHC.Bridge- ( uhcBackendEnabled-- -- UHC.Util.Pretty- , PP_Doc- , putPPFile- , disp- , pp-- -- UHC.Util.Serialize- , Serialize- , putSerializeFile- , serialize- , unserialize-- -- UHC.Light.Compiler.Base.API- , EHCOpts- , defaultEHCOpts- , HsName- , CTag- , mkHsName- , mkHsName1- , mkUniqueHsName-- -- UHC.Light.Compiler.Core.API- , CModule- , CImport- , CExport- , CDeclMeta- , CDataCon- , CExpr- , CBind- , CAlt- , CPat- , CPatFld--- , CPatRest-- , mkUnit- , mkInt- , mkInteger- , mkChar- , mkString- , mkError- , mkUndefined- , mkVar- , mkLet1Plain- , mkLet1Strict- , mkLetRec- , mkLam- , mkApp- , mkBind1- , mkBind1Nm1- , mkCTag- , destructCTag- , ctagUnit- , ctagTrue- , ctagFalse- , ctagCons- , ctagNil- , mkCase- , mkAlt- , mkPatCon- , mkPatRestEmpty- , mkPatFldBind- , mkTagTup- , mkModule- , mkImport- , mkExport- , mkMetaData- , mkMetaDataCon- , mkMetaDataConFromCTag- , mkMain- , parseExpr- , printModule- ) where--#include "undefined.h"-import Agda.Utils.Impossible--import Data.Binary.Put-import Data.Binary.Get-import Data.Typeable--#if defined(UHC_BACKEND)-import UHC.Util.Pretty-import UHC.Util.Serialize-import UHC.Util.ParseUtils-import UHC.Util.ScanUtils-import UU.Scanner.Position--import UHC.Light.Compiler.Core.API-import UHC.Light.Compiler.Base.API-#else---- UHC.Util.Pretty-type PP_Doc = String--class Show a => PP a where- pp :: a -> PP_Doc--instance PP CExpr where- pp CExpr_DUMMY = "DUMMY - UHC backend is disabled"--putPPFile :: String -> PP_Doc -> Int -> IO ()-putPPFile = __IMPOSSIBLE__--disp :: PP_Doc -> Int -> ShowS-disp s _ = (s ++)---- UHC.Util.Serialize-class Serialize a where--putSerializeFile :: FilePath -> a -> IO ()-putSerializeFile = __IMPOSSIBLE__--serialize :: x -> Put-serialize = __IMPOSSIBLE__--unserialize :: Get x-unserialize = __IMPOSSIBLE__---- UHC.Light.Compiler.Base.API--data EHCOpts-defaultEHCOpts :: EHCOpts-defaultEHCOpts = __IMPOSSIBLE__--data HsName deriving (Typeable)-deriving instance Eq HsName-deriving instance Ord HsName-deriving instance Show HsName-instance Serialize HsName where--data CTag deriving (Typeable)-deriving instance Eq CTag-deriving instance Ord CTag-deriving instance Show CTag-instance Serialize CTag where--mkHsName :: [String] -> String -> HsName-mkHsName = __IMPOSSIBLE__--mkHsName1 :: String -> HsName-mkHsName1 = __IMPOSSIBLE__--mkUniqueHsName :: String -> [String] -> String -> HsName-mkUniqueHsName = __IMPOSSIBLE__---- UHC.Light.Compiler.Core.API-data CModule-instance Serialize CModule-data CImport-data CExport-data CDeclMeta-data CDataCon--- dummy to use as parse result for core pragmas-data CExpr = CExpr_DUMMY deriving (Eq, Ord, Show, Typeable)-instance Serialize CExpr where-data CBind-data CAlt-data CPat-data CPatFld-data CPatRest--mkUnit :: EHCOpts -> CExpr-mkUnit = __IMPOSSIBLE__--mkInt :: EHCOpts -> Int -> CExpr-mkInt = __IMPOSSIBLE__--mkInteger :: EHCOpts -> Integer -> CExpr-mkInteger = __IMPOSSIBLE__--mkChar :: Char -> CExpr-mkChar = __IMPOSSIBLE__--mkString :: EHCOpts -> String -> CExpr-mkString = __IMPOSSIBLE__--mkError :: EHCOpts -> String -> CExpr-mkError = __IMPOSSIBLE__--mkUndefined :: EHCOpts -> CExpr-mkUndefined = __IMPOSSIBLE__--mkVar :: HsName -> CExpr-mkVar = __IMPOSSIBLE__--mkLet1Plain :: HsName -> CExpr -> CExpr -> CExpr-mkLet1Plain = __IMPOSSIBLE__--mkLet1Strict :: HsName -> CExpr -> CExpr -> CExpr-mkLet1Strict = __IMPOSSIBLE__--mkLetRec :: [CBind] -> CExpr -> CExpr-mkLetRec = __IMPOSSIBLE__--mkLam :: [HsName] -> CExpr -> CExpr-mkLam = __IMPOSSIBLE__--mkApp :: CExpr -> [CExpr] -> CExpr-mkApp = __IMPOSSIBLE__--mkBind1 :: HsName -> CExpr -> CBind-mkBind1 = __IMPOSSIBLE__--mkBind1Nm1 :: HsName -> CBind-mkBind1Nm1 = __IMPOSSIBLE__--mkCTag :: HsName -> HsName -> Int -> Int -> CTag-mkCTag = __IMPOSSIBLE__--destructCTag :: a -> (HsName -> HsName -> Int -> Int -> a) -> CTag -> a-destructCTag = __IMPOSSIBLE__--ctagUnit :: CTag-ctagUnit = __IMPOSSIBLE__--ctagTrue :: EHCOpts -> CTag-ctagTrue = __IMPOSSIBLE__--ctagFalse :: EHCOpts -> CTag-ctagFalse = __IMPOSSIBLE__--ctagCons :: EHCOpts -> CTag-ctagCons = __IMPOSSIBLE__--ctagNil :: EHCOpts -> CTag-ctagNil = __IMPOSSIBLE__--mkCase :: CExpr -> [CAlt] -> CExpr-mkCase = __IMPOSSIBLE__--mkAlt :: CPat -> CExpr -> CAlt-mkAlt = __IMPOSSIBLE__--mkPatCon :: CTag -> CPatRest -> [CPatFld] -> CPat-mkPatCon = __IMPOSSIBLE__--mkPatRestEmpty :: CPatRest-mkPatRestEmpty = __IMPOSSIBLE__--mkPatFldBind :: (HsName, CExpr) -> CBind -> CPatFld-mkPatFldBind = __IMPOSSIBLE__--mkTagTup :: CTag -> [CExpr] -> CExpr-mkTagTup = __IMPOSSIBLE__--mkModule :: HsName -> [CExport] -> [CImport] -> [CDeclMeta] -> CExpr -> CModule-mkModule = __IMPOSSIBLE__--mkImport :: HsName -> CImport-mkImport = __IMPOSSIBLE__--mkExport :: HsName -> CExport-mkExport = __IMPOSSIBLE__--mkMetaData :: HsName -> [CDataCon] -> CDeclMeta-mkMetaData = __IMPOSSIBLE__--mkMetaDataCon :: HsName -> Int -> Int -> CDataCon-mkMetaDataCon = __IMPOSSIBLE__--mkMetaDataConFromCTag :: CTag -> Maybe CDataCon-mkMetaDataConFromCTag = __IMPOSSIBLE__--mkMain :: HsName -> CExpr-mkMain = __IMPOSSIBLE__--parseExpr :: EHCOpts -> String -> Either [String] CExpr--- just always succeed, as we don't want to fail on UHC pragmas--- if the backend is disabled-parseExpr _ _ = Right CExpr_DUMMY--printModule :: EHCOpts -> CModule -> PP_Doc-printModule = __IMPOSSIBLE__--#endif----uhcBackendEnabled :: Bool-#if defined(UHC_BACKEND)-uhcBackendEnabled = True-#else-uhcBackendEnabled = False-#endif
− src/full/Agda/Compiler/UHC/CompileState.hs
@@ -1,248 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE UndecidableInstances #-}---- | Contains the state monad that the compiler works in and some functions--- for tampering with the state.-module Agda.Compiler.UHC.CompileState- ( CompileT- , Compile- , runCompileT- , CoreMeta-- , addExports- , addMetaCon- , addMetaData- , getExports- , getDeclMetas-- , getCoreName- , getCoreName1- , getConstrCTag- , getConstrFun- , moduleNameToCoreName- , moduleNameToCoreNameParts- , freshLocalName-- , conArityAndPars- , dataRecCons- )-where--import Control.Monad.State-import Control.Monad.Reader.Class-import Data.List-import qualified Data.Map as Map-import Data.Maybe-import Data.Char--#if __GLASGOW_HASKELL__ <= 708-import Control.Applicative-#endif-import Data.Semigroup (Semigroup, Monoid, (<>), mempty, mappend)--import Agda.Compiler.UHC.MagicTypes-import Agda.Syntax.Internal-import Agda.Syntax.Common-import Agda.TypeChecking.Monad-import Agda.TypeChecking.Substitute-import Agda.TypeChecking.Telescope-import Agda.TypeChecking.Monad.Builtin hiding (coinductionKit')-import qualified Agda.TypeChecking.Monad as TM-import Agda.Compiler.UHC.Bridge-import Agda.Compiler.UHC.Pragmas.Base-import Agda.Compiler.Common--import Agda.Utils.Lens--#include "undefined.h"-import Agda.Utils.Impossible--import Data.Time.Clock.POSIX--getTime :: IO Integer-getTime = round <$> getPOSIXTime--data CoreMeta = CoreMeta- { coreMetaData :: Map.Map QName ( [CDataCon] -> CDeclMeta )- , coreMetaCon :: Map.Map QName [CDataCon] -- map data name to constructors- , coreExports :: [CExport] -- ^ UHC core exports- }--instance Semigroup CoreMeta where- CoreMeta a b c <> CoreMeta r s t =- CoreMeta (Map.union a r) (Map.unionWith (++) b s) (c ++ t)--instance Monoid CoreMeta where- mempty = CoreMeta mempty mempty []- mappend = (<>)---- | Stuff we need in our compiler-data CompileState = CompileState- { coreMeta :: CoreMeta- , nameSupply :: Integer- }---- | Compiler monad-newtype CompileT m a = CompileT { unCompileT :: StateT CompileState m a }- deriving (Monad, MonadIO, MonadTrans, Applicative, Functor)--type Compile = CompileT TCM---- | Used to run the Agda-to-UHC Core transformation.--- During this transformation,-runCompileT :: MonadIO m =>- ModuleName -- ^ The module to compile.- -> CompileT m a- -> m a-runCompileT amod comp = do- (result, state') <- runStateT (unCompileT comp) initial-- return result- where initial = CompileState- { coreMeta = mempty- , nameSupply = 0- }--appendCoreMeta :: Monad m => CoreMeta -> CompileT m ()-appendCoreMeta cm =- CompileT $ modify (\s -> s { coreMeta = cm `mappend` coreMeta s })--addExports :: Monad m => [HsName] -> CompileT m ()-addExports = addExports' . map mkExport--addExports' :: Monad m => [CExport] -> CompileT m ()-addExports' nms = appendCoreMeta (mempty { coreExports = nms })--addMetaCon :: QName -> CDataCon -> Compile ()-addMetaCon q c = do- dtNm <- conData . theDef <$> lift (getConstInfo q)- appendCoreMeta (mempty { coreMetaCon = Map.singleton dtNm [c] })--addMetaData :: QName -> ([CDataCon] -> CDeclMeta) -> Compile ()-addMetaData q d =- appendCoreMeta (mempty { coreMetaData = Map.singleton q d })--getExports :: Compile [CExport]-getExports = CompileT $ gets (coreExports . coreMeta)--getDeclMetas :: Compile [CDeclMeta]-getDeclMetas = CompileT $ do- cons <- gets (coreMetaCon . coreMeta)- dts <- gets (coreMetaData . coreMeta)- return $ map (\(dtNm, f) -> f (Map.findWithDefault [] dtNm cons)) (Map.toList dts)--freshLocalName :: Monad m => CompileT m HsName-freshLocalName = CompileT $ do- i <- gets nameSupply- modify (\s -> s { nameSupply = i + 1 } )- return $ mkUniqueHsName "nl.uu.agda.fresh-local-name" [] ("x" ++ show i)---------------------- Constructors----------------------- | Returns the CTag for a constructor. Not defined--- for Sharp and magic __UNIT__ constructor.-getConstrCTag :: QName -> Compile CTag-getConstrCTag q = do- def <- lift $ getConstInfo q- (arity, _) <- lift $ conArityAndPars q- case compiledCore $ defCompiledRep def of- Nothing -> do- let dtQ = conData $ theDef def- -- get tag, which is the index of current con in datatype con list- tag <- fromJust . elemIndex q . dataRecCons . theDef <$> lift (getConstInfo dtQ)- mkCTag <$> getCoreName dtQ <*> (getCoreName q) <*> pure tag <*> pure arity- Just (CrConstr crCon) -> do- return $ coreConstrToCTag crCon arity- _ -> __IMPOSSIBLE__----- | Returns the expression to use to build a value of the given datatype/constructor.-getConstrFun :: QName -> Compile HsName-getConstrFun q = do- def <- lift $ getConstInfo q- case compiledCore $ defCompiledRep def of- Nothing -> getCoreName q- Just (CrConstr crCon) ->- return $- destructCTag builtinUnitCtor (\_ con _ _ -> con)- (coreConstrToCTag crCon 0) -- Arity doesn't matter here, as we immediately destruct the ctag again!- _ -> __IMPOSSIBLE__--dataRecCons :: Defn -> [QName]-dataRecCons r@(Record{}) = [recCon r]-dataRecCons d@(Datatype{}) = dataCons d-dataRecCons _ = __IMPOSSIBLE__----------------------- Names---------------------- All agda modules live in their own namespace in Agda.XXX, to avoid--- clashes with existing haskell modules. (e.g. Data.List) with confusing error messages.--- If we don't wan't this, we would have to avoid loading the HS base libraries--- or would need package-specific imports. As we don't have this in UHC right now,--- this is the best we can do.-moduleNameToCoreNameParts :: ModuleName -> [String]-moduleNameToCoreNameParts modNm = "Agda" : (map show $ mnameToList modNm)--moduleNameToCoreName :: ModuleName -> HsName-moduleNameToCoreName modNm = mkHsName (init nmParts) (last nmParts)- where nmParts = moduleNameToCoreNameParts modNm--getCoreName :: QName -> Compile HsName-getCoreName qnm = CompileT $ do- lift $ getCoreName1 qnm--getCoreName1 :: QName -> TCM HsName-getCoreName1 qnm = do-- modNm <- topLevelModuleName (qnameModule qnm)-- def <- theDef <$> getConstInfo qnm-- let locName = intercalate "_" $ map show $ either id id $ unqualifyQ modNm qnm- modParts = moduleNameToCoreNameParts modNm- identName = locName ++ "_" ++ show idnum- identName' = case def of- Datatype{} -> capitalize identName- Record{} -> capitalize identName- Constructor{} -> capitalize identName- _ -> identName-- return $ mkUniqueHsName "nl.uu.agda.top-level-def" modParts identName- where- idnum = let (NameId x _) = nameId $ qnameName qnm in x- -- we don't really care about the original name, we just keep it for easier debugging- capitalize (x:xs) = (toUpper x):xs- capitalize _ = __IMPOSSIBLE__---- | Returns the names inside a QName, with the module prefix stripped away.--- If the name is not module-qualified, returns the full name as left. (TODO investigate when this happens)-unqualifyQ :: ModuleName -> QName -> Either [Name] [Name]-unqualifyQ modNm qnm =- case stripPrefix modNs qnms of- -- not sure when the name doesn't have a module prefix... just force generation of a name for the time being- Nothing -> Left qnms- Just nm -> Right nm- where- modNs = mnameToList modNm- qnms = qnameToList qnm-----instance MonadReader r m => MonadReader r (CompileT m) where- ask = lift ask- local f (CompileT x) = CompileT $ local f x--instance MonadState s m => MonadState s (CompileT m) where- get = lift get- put = lift . put--instance MonadTCM m => MonadTCM (CompileT m) where- liftTCM = lift . TM.liftTCM
− src/full/Agda/Compiler/UHC/Compiler.hs
@@ -1,216 +0,0 @@-{-# LANGUAGE CPP #-}---- | UHC compiler backend, main entry point.---- In the long term, it would be nice if we could use e.g. shake to--- build individual Agda modules. The problem with that is that some--- parts need to be in the TCM Monad, which doesn't easily work in--- shake. We would need a way to extract the information out of the--- TCM monad, so that we can pass it to the compilation function--- without pulling in the TCM Monad. Another minor problem might be--- error reporting?--module Agda.Compiler.UHC.Compiler(compilerMain) where--#if __GLASGOW_HASKELL__ <= 708-import Control.Applicative-import Data.Monoid-#endif--import Control.Monad-import Control.Monad.Reader-import Control.Monad.State-import qualified Data.ByteString.Lazy as BS-import qualified Data.Map as M-import Data.Maybe--import System.Directory ( canonicalizePath, createDirectoryIfMissing- , setCurrentDirectory- , doesDirectoryExist- , getDirectoryContents, copyFile- )-import Data.List as L-import System.Exit-import System.FilePath hiding (normalise)--import Paths_Agda-import Agda.Compiler.CallCompiler-import Agda.Interaction.FindFile-import Agda.Interaction.Options-import Agda.Interaction.Imports-import qualified Agda.Syntax.Concrete.Name as CN-import Agda.Syntax.Internal hiding (Term(..))-import Agda.TypeChecking.Monad-import Agda.TypeChecking.Serialise-import Agda.Utils.FileName-import Agda.Utils.Pretty-import qualified Agda.Utils.HashMap as HMap-import Agda.Utils.IO.Directory-import Agda.Utils.Lens--import Agda.Compiler.UHC.CompileState-import Agda.Compiler.UHC.Bridge as UB-import qualified Agda.Compiler.UHC.FromAgda as FAgda-import Agda.Compiler.Common--#include "undefined.h"-import Agda.Utils.Impossible---- for the time being, we just copy the base library into the generated code.--- We don't install it into the user db anymore, as that gets complicated when--- multiple Agda instances run concurrently.--- Just copying it is safe for the time being, as we only have full-program--- compilation at the moment.-copyUHCAgdaBase :: FilePath -> TCM ()-copyUHCAgdaBase outDir = do- dataDir <- liftIO getDataDir- let srcDir = dataDir </> "uhc-agda-base" </> "src" </> "UHC"-- liftIO $ copyDirContent srcDir (outDir </> "UHC")----- | Compile an interface into an executable using UHC-compilerMain :: IsMain -> Interface -> TCM ()-compilerMain isMain i = inCompilerEnv i $ do- when (not uhcBackendEnabled) $ typeError $ GenericError "Agda has been built without UHC support. To use the UHC compiler you need to reinstall Agda with 'cabal install Agda -f uhc'."- -- TODO we should do a version check here at some point.- let uhc_exist = ExitSuccess- case uhc_exist of- ExitSuccess -> do-- copyUHCAgdaBase =<< compileDir-- doCompile isMain i $ \_ -> compileModule-- case isMain of- IsMain -> do- main <- getMain i- -- get core name from modInfo- crMain <- getCoreName1 main- runUHCMain $ Just (iModuleName i, crMain)- NotMain -> runUHCMain Nothing-- ExitFailure _ -> internalError $ unlines- [ "Agda cannot find the UHC compiler."- ]----- | Compiles a module and it's imports. Returns the module info--- of this module, and the accumulating module interface.-compileModule :: Interface -> TCM ()-compileModule i = do- -- look for the Agda.Primitive interface in visited modules.- -- (It will not be in ImportedModules, if it has not been- -- explicitly imported)- -- TODO this should be done in a more clean way- [agdaPrimInter] <- filter (("Agda.Primitive"==) . prettyShow . iModuleName)- . map miInterface . M.elems- <$> getVisitedModules- -- we can't use the Core module name to get the name of the aui file,- -- as we don't know the Core module name before we loaded/compiled the file.- -- (well, we could just compute the module name and use that, that's- -- probably better? )- let modNm = iModuleName i- let topModuleName = toTopLevelModuleName modNm- -- check if this module has already been compiled- imports <- map miInterface . catMaybes- <$> (mapM (getVisitedModule . toTopLevelModuleName . fst)- (iImportedModules i))-- let imports' = if prettyShow (iModuleName i) == "Agda.Primitive"- then imports- else agdaPrimInter : imports-- reportSLn "compile.uhc" 1 $- "Compiling: " ++ show (iModuleName i)- code <- compileDefns modNm (map iModuleName imports') i- crFile <- corePath modNm- _ <- writeCoreFile crFile code- return ()---corePath :: ModuleName -> TCM FilePath-corePath mName = do- mdir <- compileDir- let fp = mdir </> replaceExtension fp' "bcr"- liftIO $ createDirectoryIfMissing True (takeDirectory fp)- return fp- where- fp' = foldl1 (</>) $ moduleNameToCoreNameParts mName----getMain :: MonadTCM m => Interface -> m QName-getMain iface = case concatMap f defs of- [] -> typeError $ GenericError $ "Could not find main."- [x] -> return x- _ -> __IMPOSSIBLE__- where defs = HMap.toList $ iSignature iface ^. sigDefinitions- f (qn, def) = case theDef def of- (Function{}) | "main" == show (qnameName qn) -> [qn]- _ -> []---- | Perform the chain of compilation stages, from definitions to UHC Core code-compileDefns :: ModuleName- -> [ModuleName] -- ^ top level imports- -> Interface -> TCM UB.CModule-compileDefns modNm curModImps iface = do-- crMod <- FAgda.fromAgdaModule modNm curModImps iface-- reportSLn "compile.uhc" 10 $ "Done generating Core for \"" ++ show modNm ++ "\"."- return crMod--writeCoreFile :: String -> UB.CModule -> TCM ()-writeCoreFile f cmod = do- useTextual <- optUHCTextualCore <$> commandLineOptions-- -- dump textual core, useful for debugging.- when useTextual (do- let f' = replaceExtension f ".dbg.tcr"- reportSLn "compile.uhc" 10 $ "Writing textual core to \"" ++ show f' ++ "\"."- liftIO $ putPPFile f' (UB.printModule defaultEHCOpts cmod) 200- )-- reportSLn "compile.uhc" 10 $ "Writing binary core to \"" ++ show f ++ "\"."- liftIO $ putSerializeFile f cmod---- | Create the UHC Core main file, which calls the Agda main function-runUHCMain- :: Maybe (ModuleName, HsName) -- main module- -> TCM ()-runUHCMain mainInfo = do- otherFps <- mapM (corePath . iModuleName . miInterface) =<< (M.elems <$> getVisitedModules)- allFps <-- case mainInfo of- Nothing -> return otherFps- Just (mainMod, mainName) -> do- fp <- (</> "Main.bcr") <$> compileDir- let mmod = FAgda.createMainModule mainMod mainName- writeCoreFile fp mmod- return ["Main.bcr"]-- let extraOpts = maybe- ["--compile-only"]- ((\x -> [x]) . ("--output="++) . prettyShow . last . mnameToList . fst)- mainInfo-- liftIO . setCurrentDirectory =<< compileDir-- -- TODO drop the RTS args as soon as we don't need the additional- -- memory anymore- callUHC1 $ [ "--pkg-hide-all"- , "--pkg-expose=uhcbase"- , "--pkg-expose=base"- , "UHC/Agda/double.c"- ] ++ extraOpts ++ allFps ++ ["+RTS", "-K50m", "-RTS"]--callUHC1 :: [String] -> TCM ()-callUHC1 args = do- uhcBin <- getUhcBin- doCall <- optUHCCallUHC <$> commandLineOptions- extraArgs <- optUHCFlags <$> commandLineOptions- callCompiler doCall uhcBin (args ++ extraArgs)--getUhcBin :: TCM FilePath-getUhcBin = fromMaybe ("uhc") . optUHCBin <$> commandLineOptions
− src/full/Agda/Compiler/UHC/FromAgda.hs
@@ -1,376 +0,0 @@-{-# LANGUAGE CPP #-}---- | Convert from Agda's internal representation to UHC Core via Treeless.--------- The coinduction kit is translated the same way as in MAlonzo:--- flat = id--- sharp = id--- -> There is no runtime representation of Coinductive values.-module Agda.Compiler.UHC.FromAgda where--#if __GLASGOW_HASKELL__ <= 708-import Control.Applicative-import Data.Traversable (traverse)-#endif--import Control.Monad-import Control.Monad.State-import Control.Monad.Reader-import qualified Data.Map as M-import Data.Maybe-import Data.Either-import Data.List-import qualified Data.Set as Set--import Agda.Syntax.Internal hiding (Term(..))-import qualified Agda.Syntax.Internal as I-import Agda.Syntax.Literal as TL-import Agda.Syntax.Treeless (TTerm (..), TAlt (..))-import qualified Agda.Syntax.Treeless as C-import Agda.TypeChecking.Monad-import Agda.TypeChecking.Monad.Builtin-import Agda.TypeChecking.Pretty-import Agda.Utils.List-import qualified Agda.Utils.Pretty as P-import qualified Agda.Utils.HashMap as HMap-import Agda.Syntax.Abstract.Name-import Agda.Syntax.Common--import Agda.Compiler.Common-import Agda.Compiler.ToTreeless-import Agda.Compiler.Treeless.GuardsToPrims-import Agda.Compiler.Treeless.NormalizeNames-import Agda.Compiler.Treeless.Pretty-import Agda.Compiler.UHC.Pragmas.Base-import Agda.Compiler.UHC.Pragmas.Parse (coreExprToCExpr)-import Agda.Compiler.UHC.CompileState-import Agda.Compiler.UHC.Primitives-import Agda.Compiler.UHC.MagicTypes--import Agda.Compiler.UHC.Bridge as CA--import Agda.Utils.Maybe-import Agda.Utils.Except ( MonadError (catchError) )-import Agda.Utils.Lens--#include "undefined.h"-import Agda.Utils.Impossible--opts :: EHCOpts-opts = defaultEHCOpts---- | Convert from Agda's internal representation to our auxiliary AST.-fromAgdaModule :: ModuleName- -> [ModuleName] -- imported modules.- -> Interface -- interface to compile- -> TCM CModule-fromAgdaModule modNm curModImps iface = do-- -- Set correct pragma options- setCommandLineOptions =<< gets (stPersistentOptions . stPersistentState)- mapM_ setOptionsFromPragma (iPragmaOptions iface)-- -- sort defs to ensure consistent order (see Issue 1900)- let defs = sortDefs $ iSignature iface ^. sigDefinitions-- runCompileT modNm (do- lift $ reportSLn "compile.uhc" 10 "Translate datatypes..."-- funs' <- concat <$> mapM translateDefn defs- let funs = mkLetRec funs' (mkInt opts 0)---- additionalImports <- lift getHaskellImportsUHC- let imps = map mkImport $ nub $- [ mkHsName1 "UHC.Base"- , mkHsName1 "UHC.Agda.Builtins" ]- ++ map moduleNameToCoreName curModImps- ++ map mkHsName1 (Set.toList additionalImports)-- crModNm = moduleNameToCoreName modNm-- mkModule crModNm- <$> getExports <*> pure imps <*> getDeclMetas <*> pure funs- )----- | Translate an Agda definition to an UHC Core function where applicable-translateDefn :: (QName, Definition) -> Compile [CBind]-translateDefn (n, defini) = do-- crName <- getCoreName n- let crRep = compiledCore $ defCompiledRep defini- kit <- lift coinductionKit- case theDef defini of- d@(Datatype {}) -> do-- unless (isJust crRep || Just n == (nameOfInf <$> kit)) $ do- addMetaData n (mkMetaData crName)-- vars <- replicateM (dataPars d + dataIxs d) freshLocalName- addExports [crName]- return [mkBind1 crName (mkLam vars $ mkUnit opts)]- (Function{}) | Just n == (nameOfFlat <$> kit) -> do- addExports [crName]- (\x -> [x]) <$> mkIdentityFun n "coind-flat" 0- f@(Function{}) | otherwise -> do- let ty = (defType defini)- lift $ reportSDoc "compile.uhc.fromagda" 5 $ text "compiling fun:" <+> prettyTCM n- lift $ reportSDoc "compile.uhc.fromagda" 15 $ text "type:" <+> (text . show) ty-- caseMaybeM (lift $ toTreeless n) (pure []) $ \ treeless -> do- funBody <- convertGuards <$> lift (normalizeNames treeless)- lift $ reportSDoc "compile.uhc.fromagda" 30 $ text " compiled treeless fun:" <+> (text . show) funBody- funBody' <- runTT $ compileTerm funBody- lift $ reportSDoc "compile.uhc.fromagda" 30 $ text " compiled UHC Core fun:" <+> (text . show) funBody'-- addExports [crName]- return [mkBind1 crName funBody']-- Constructor{} | Just n == (nameOfSharp <$> kit) -> do- addExports [crName]- (\x -> [x]) <$> mkIdentityFun n "coind-sharp" 0-- (Constructor{}) | Nothing <- crRep -> do -- become functions returning a constructor with their tag- -- we have to ignore instantiated constructors here!- n' <- lift $ canonicalName n- if (n /= n')- then return []- else do- addExports [crName]- ctag <- getConstrCTag n-- addMetaCon n (fromJust $ mkMetaDataConFromCTag ctag)-- vars <- replicateM (getCTagArity ctag) freshLocalName- let conWrapper = mkLam vars (mkTagTup ctag $ map mkVar vars)- return [mkBind1 crName conWrapper]- Constructor{} -> return []- -- either foreign or builtin type. We can just assume existence of the wrapper functions then.-- r@(Record{}) -> do- unless (isJust crRep) $ do- addMetaData n (mkMetaData crName)-- vars <- replicateM (recPars r) freshLocalName- addExports [crName]- return [mkBind1 crName (mkLam vars $ mkUnit opts)]- (Axiom{}) -> do -- Axioms get their code from COMPILED_UHC pragmas- addExports [crName]- case crRep of- Nothing -> return [mkBind1 crName- (coreError $ "Axiom " ++ show n ++ " used but has no computation.")]- Just (CrDefn x) -> do- x' <- case coreExprToCExpr x of- -- This can only happen if an *.agdai file was generated by an Agda version- -- without UHC support enabled.- Left err -> internalError $ "Invalid COMPILED_UHC pragma value: " ++ err- Right y -> return y- return [mkBind1 crName x']- _ -> __IMPOSSIBLE__-- p@(Primitive{}) -> do -- Primitives use primitive functions from UHC.Agda.Builtins of the same name.- addExports [crName]-- case primName p `M.lookup` primFunctions of- Nothing -> internalError $ "Primitive " ++ show (primName p) ++ " declared, but no such primitive exists."- (Just expr) -> do- expr' <- expr- return [mkBind1 crName expr']- AbstractDefn -> __IMPOSSIBLE__- where- -- | Produces an identity function, optionally ignoring the first n arguments.- mkIdentityFun :: QName- -> String -- ^ comment- -> Int -- ^ How many arguments to ignore.- -> Compile CBind- mkIdentityFun nm comment ignArgs = do- crName <- getCoreName nm- xs <- replicateM (ignArgs + 1) freshLocalName- return $ mkBind1 crName (mkLam xs (mkVar $ last xs))---runTT :: TT a -> Compile a-runTT r = do- r `runReaderT` (TTEnv [])--data TTEnv = TTEnv- { nmEnv :: [HsName] -- maps de-bruijn indices to names- }--type TT = ReaderT TTEnv Compile---addToEnv :: [HsName] -> TT a -> TT a-addToEnv nms cont =- local (\e -> e { nmEnv = nms ++ (nmEnv e) }) cont--data BuiltinKit = BuiltinKit- { isNat :: QName -> Bool- , isInt :: QName -> Bool- }--builtinKit :: TCM BuiltinKit-builtinKit =- BuiltinKit <$> is dat builtinNat- <*> is dat builtinInteger- where- dat (I.Def d _) = pure d- dat _ = Nothing-- is a b = maybe (const False) (==) . (a =<<) <$> getBuiltin' b---- | Translate the actual Agda terms, with an environment of all the bound variables--- from patternmatching. Agda terms are in de Bruijn so we just check the new--- names in the position.-compileTerm :: C.TTerm -> TT CExpr-compileTerm term = do- builtinKit' <- lift $ lift builtinKit- case term of- C.TPrim t -> return $ compilePrim t- C.TVar x -> do- nm <- fromMaybe __IMPOSSIBLE__ . (!!! x) <$> asks nmEnv- return $ mkVar nm- C.TDef nm -> do- nm' <- lift $ getCoreName nm- return $ mkVar nm'- C.TApp t xs -> do- mkApp <$> compileTerm t <*> mapM compileTerm xs- C.TLam t -> do- name <- lift freshLocalName- addToEnv [name] $ do- mkLam [name] <$> compileTerm t- C.TLit l -> return $ litToCore l- C.TCon c -> do- con <- lift $ getConstrFun c- return $ mkVar con- C.TLet x body -> do- nm <- lift freshLocalName- mkLet1Plain nm- <$> compileTerm x- <*> addToEnv [nm] (compileTerm body)- C.TCase sc (C.CTData dt) def alts | not (isNat builtinKit' dt || isInt builtinKit' dt) -> do- -- normal constructor case- caseScr <- lift freshLocalName- defVar <- lift freshLocalName- def' <- compileTerm def-- branches <- traverse compileConAlt alts- defBranches <- defaultBranches dt alts (mkVar defVar)- let cas = mkCase (mkVar caseScr) (branches ++ defBranches)- caseScr' <- compileTerm (C.TVar sc)-- return $ mkLet1Plain defVar def' (mkLet1Strict caseScr caseScr' cas)-- C.TCase sc ct def alts | otherwise -> do- -- cases on literals- sc <- compileTerm (C.TVar sc)- var <- lift freshLocalName- def <- compileTerm def-- css <- buildPrimCases eq (mkVar var) alts def- return $ mkLet1Strict var sc css- where- eq :: CExpr- eq = case ct of- C.CTChar -> mkVar $ primFunNm "primCharEquality"- C.CTString -> mkVar $ primFunNm "primStringEquality"- C.CTQName -> mkVar $ primFunNm "primQNameEquality"- C.CTFloat -> mkVar $ primFunNm "primFloatEquality"- C.CTNat -> mkVar $ primFunNm "primIntegerEquality"- C.CTInt -> mkVar $ primFunNm "primIntegerEquality"- _ -> __IMPOSSIBLE__-- C.TUnit -> unit- C.TSort -> unit- C.TErased -> unit- C.TError e -> return $ case e of- C.TUnreachable -> coreError $ "Unreachable code reached. This should never happen! Crashing..."- where unit = return $ mkUnit opts---buildPrimCases :: CExpr -- ^ equality function- -> CExpr -- ^ case scrutinee (in WHNF)- -> [C.TAlt]- -> CExpr -- ^ default value- -> TT CExpr-buildPrimCases _ _ [] def = return def-buildPrimCases eq scr (b:brs) def = do- var <- lift freshLocalName- e' <- compileTerm (C.aBody b)- rec' <- buildPrimCases eq scr brs def-- let lit = litToCore $ C.aLit b- eqTest = mkApp eq [scr, lit]-- return $ mkLet1Strict var eqTest (mkIfThenElse (mkVar var) e' rec')---- move to UHC Core API-mkIfThenElse :: CExpr -> CExpr -> CExpr -> CExpr-mkIfThenElse c t e = mkCase c [b1, b2]- where b1 = mkAlt (mkPatCon (ctagTrue opts) mkPatRestEmpty []) t- b2 = mkAlt (mkPatCon (ctagFalse opts) mkPatRestEmpty []) e--compileConAlt :: C.TAlt -> TT CAlt-compileConAlt a =- makeConAlt (C.aCon a)- (\vars -> addToEnv (reverse vars) $ compileTerm (C.aBody a))--makeConAlt :: QName -> ([HsName] -> TT CExpr) -> TT CAlt-makeConAlt con mkBody = do- ctag <- lift $ getConstrCTag con- vars <- lift $ replicateM (getCTagArity ctag) freshLocalName- body <- mkBody vars-- let patFlds = [mkPatFldBind (mkHsName [] "", mkInt opts i) (mkBind1Nm1 v) | (i, v) <- zip [0..] vars]- return $ mkAlt (mkPatCon ctag mkPatRestEmpty patFlds) body---- | Constructs an alternative for all constructors not explicitly matched by a branch.-defaultBranches :: QName -> [C.TAlt] -> CExpr -> TT [CAlt]-defaultBranches dt alts def = do- dtCons <- dataRecCons . theDef <$> (lift . lift) (getConstInfo dt)- let altCons = map C.aCon alts- missingCons = dtCons \\ altCons-- mapM (\a -> makeConAlt a (\_ -> return def)) missingCons--litToCore :: Literal -> CExpr-litToCore (LitNat _ i) = mkApp (mkVar $ primFunNm "primIntegerToNat") [mkInteger opts i]-litToCore (LitString _ s) = mkString opts s-litToCore (LitChar _ c) = mkChar c--- UHC and GHC handle trailing zeros slightly different. Work around to make sure--- we have the same semantics as MAlonzo.-litToCore (LitFloat _ f) = mkApp (mkVar $ primFunNm "primMkFloat") [mkString opts (show f)]-litToCore (LitQName _ q) = mkApp (mkVar $ primFunNm "primMkQName")- [mkInteger opts $ fromIntegral n, mkInteger opts $ fromIntegral m,- mkString opts $ P.prettyShow q]- where NameId n m = nameId $ qnameName q-litToCore LitMeta{} = __IMPOSSIBLE__--getCTagArity :: CTag -> Int--- for records/datatypes, we can always extract the arity. If there is no arity,--- it is the unit constructor, so just return zero.-getCTagArity = destructCTag 0 (\_ _ _ ar -> ar)--coreError :: String -> CExpr-coreError msg = mkError opts $ "Fatal error: " ++ msg--compilePrim :: C.TPrim -> CExpr-compilePrim C.PQuot = mkVar $ primFunNm "primIntegerQuot"-compilePrim C.PRem = mkVar $ primFunNm "primIntegerRem"-compilePrim C.PSub = mkVar $ primFunNm "primIntegerMinus"-compilePrim C.PAdd = mkVar $ primFunNm "primIntegerPlus"-compilePrim C.PMul = mkVar $ primFunNm "primIntegerTimes"-compilePrim C.PIf = mkVar $ primFunNm "primIfThenElse"-compilePrim C.PGeq = mkVar $ primFunNm "primIntegerGreaterOrEqual"-compilePrim C.PLt = mkVar $ primFunNm "primIntegerLess"-compilePrim p | C.isPrimEq p = mkVar $ primFunNm "primIntegerEquality"-compilePrim C.PSeq = mkVar $ primFunNm "primSeq"-compilePrim _ = __IMPOSSIBLE__---createMainModule :: ModuleName -> HsName -> CModule-createMainModule mainMod main = mkModule (mkHsName [] "Main") [] [mkImport $ mkHsName1 "UHC.Run", mkImport mainModAux] [] (mkMain main)- where mainModAux = moduleNameToCoreName mainMod
− src/full/Agda/Compiler/UHC/MagicTypes.hs
@@ -1,59 +0,0 @@-{-# LANGUAGE CPP #-}--- | Defines some magic builtin datatypes.-module Agda.Compiler.UHC.MagicTypes-( builtinUnitCtor- , MagicName- , getMagicTypes- , MagicConstrInfo- , MagicTypeInfo- , HsDataType (..)- )-where--import Data.List-import qualified Data.Map as M--import Agda.Compiler.UHC.Bridge----- | name of a magic, differently translated datatype/constructor-type MagicName = String--data HsDataType- = HsDataType HsName- | HsUnit--type MagicConstrInfo = M.Map MagicName CTag -- maps primitive names to constructor ctags-type MagicTypeInfo = M.Map MagicName (HsDataType, MagicConstrInfo) -- maps types to the UHC Core name--- (or nothing for unit) and to their constructors.--getMagicTypes :: MagicTypeInfo-getMagicTypes = M.fromList $ map f primCrTys1- where f :: (MagicName, [(MagicName, CTag)]) -> (MagicName, (HsDataType, MagicConstrInfo))- f (dtMgcNm, constrs) = let dtCrNm = ctagDataTyNm $ snd $ head constrs- in (dtMgcNm, (dtCrNm, M.fromList constrs))---- | Returns the name of the datatype or 'Nothing' for the unit datatype.-ctagDataTyNm :: CTag -> HsDataType-ctagDataTyNm = destructCTag HsUnit (\dt _ _ _ -> HsDataType dt)---primCrTys1 :: [(- MagicName -- the magic name of the dt in COMPILED_DATA_UHC pragmas- , [(MagicName, CTag)] -- constructors. Maps magic name to constructor tags.- )]-primCrTys1 =- [( "BOOL",- [ ("TRUE", ctagTrue defaultEHCOpts)- , ("FALSE", ctagFalse defaultEHCOpts)- ])- , ("LIST",- [ ("NIL", ctagNil defaultEHCOpts)- , ("CONS", ctagCons defaultEHCOpts)- ])- , ("UNIT",- [("UNIT", ctagUnit)])- ]--builtinUnitCtor :: HsName-builtinUnitCtor = mkHsName1 "UHC.Agda.Builtins.unit"
− src/full/Agda/Compiler/UHC/Pragmas/Base.hs
@@ -1,58 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DeriveDataTypeable #-}---- | Defines UHC Core functions used in other parts of Agda.--- E.g. parsing Core pragmas uses the `parseCoreCode` function.-module Agda.Compiler.UHC.Pragmas.Base- ( CoreExpr,- CoreType (..),- CoreConstr (..),- coreConstrToCTag,- setTag,- HsName- )-where---import Data.Typeable-import qualified Data.Map as M--import Agda.Compiler.UHC.Bridge as CA-import Agda.Compiler.UHC.MagicTypes--#include "undefined.h"-import Agda.Utils.Impossible----data CoreType- = CTMagic MagicName -- ^ Magic name- | CTNormal String -- Core Datatype name- deriving (Eq, Show, Typeable)---- We store the COMPILED_UHC pragmas as string,--- as storing the UHC AST makes the serialization--- format dependent on uhc-light. This also makes it--- possible to just store COMPILED_UHC pragmas unchecked--- in the interface file, if the UHC backend is disabled.-type CoreExpr = String---- We need an explicit representation for constructors, as we need to serialise the CoreConstr--- to store it inside agdai files. Else we could just use a partially applied--- CTag constructor instead (we don't know the arity yet...).-data CoreConstr- = CCMagic MagicName MagicName -- Magic type constructor with fixed arity; (datatype, ctor)- | CCNormal HsName HsName Int -- Normall UHC Core Constructor; (datatype, constr, tag)- deriving (Eq, Show, Typeable)---setTag :: CoreConstr -> Int -> CoreConstr-setTag (CCNormal a b _) t = CCNormal a b t-setTag _ _ = __IMPOSSIBLE__--coreConstrToCTag :: CoreConstr- -> Int -- ^ Arity- -> CTag-coreConstrToCTag (CCMagic dtMgcNm conMgcNm) _ = conMp M.! conMgcNm- where (_, conMp) = getMagicTypes M.! dtMgcNm-coreConstrToCTag (CCNormal dt con tg) ar = mkCTag dt con tg ar
− src/full/Agda/Compiler/UHC/Pragmas/Parse.hs
@@ -1,103 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DeriveDataTypeable #-}---- | Defines UHC Core functions used in other parts of Agda.--- E.g. parsing Core pragmas uses the `parseCoreCode` function.-module Agda.Compiler.UHC.Pragmas.Parse- ( module Agda.Compiler.UHC.Pragmas.Base- , parseCoreExpr- , coreExprToCExpr- , parseCoreData- , parseCoreConstrs- )--where---import Data.List-import qualified Data.Map as M--import Agda.TypeChecking.Monad-import Agda.Compiler.UHC.Pragmas.Base-import Agda.Compiler.UHC.MagicTypes--import Agda.Compiler.UHC.Bridge as CA--#include "undefined.h"-import Agda.Utils.Impossible---- | Parse a COMPILED_DATA_UHC specification.-parseCoreData :: MonadTCM m => String -> m CoreType-parseCoreData dt = do- isDtMgc <- isMagicEntity getMagicTypes dt "datatype"- return $ case isDtMgc of- Nothing -> CTNormal dt- Just (dtMgc, _) -> CTMagic dtMgc--parseCoreConstrs :: MonadTCM m => CoreType -> [String] -> m [CoreConstr]-parseCoreConstrs (CTNormal dtCrNm) cs = do- constrs <- mapM parseNormalConstr cs- -- UHC assigns tags in lexographical order.- -- Requires that the mapping is complete, else it will break.- return $ zipWith setTag (sortBy ccOrd constrs) [0..]- where- parseNormalConstr :: MonadTCM m => String -> m CoreConstr- parseNormalConstr c- | isMagic c = typeError $- GenericError $ "Magic constructor " ++ (drop 2 $ init $ init c) ++ " can only be used for magic datatypes."- | otherwise = let dtMod = dropWhileEnd (/='.') dtCrNm- conNm = dtMod ++ c- -- tag gets assigned after we have parsed all ctors- in return $ CCNormal (mkHsName1 dtCrNm) (mkHsName1 conNm) __IMPOSSIBLE__- ccOrd :: CoreConstr -> CoreConstr -> Ordering- ccOrd (CCNormal dtNm1 ctNm1 _) (CCNormal dtNm2 ctNm2 _) | dtNm1 == dtNm2 = compare ctNm1 ctNm2- ccOrd _ _ = __IMPOSSIBLE__--parseCoreConstrs (CTMagic dtMgcNm) cs = do- mapM parseMagicConstr cs- where- (_, conMp) = getMagicTypes M.! dtMgcNm- parseMagicConstr :: MonadTCM m => String -> m CoreConstr- parseMagicConstr c- | not (isMagic c) = typeError $- GenericError $ "A magic datatype can only have magic constructors."- | otherwise = do- (Just (conMgcNm, _)) <- isMagicEntity conMp c "constructor"- return $ CCMagic dtMgcNm conMgcNm----- | Parse a COMPILED_UHC expression.-parseCoreExpr :: String -> Either String CoreExpr-#if defined(UHC_BACKEND)-parseCoreExpr str = either Left (const $ Right str) (coreExprToCExpr str)-#else--- we don't have the uhc-light parser, so just succeed here.-parseCoreExpr str = Right str-#endif--coreExprToCExpr :: CoreExpr -> Either String CExpr-#if defined(UHC_BACKEND)-coreExprToCExpr str = case CA.parseExpr defaultEHCOpts str of- (Left errs) -> Left $ intercalate "\n" errs- (Right res) -> Right res-#else-coreExprToCExpr = __IMPOSSIBLE__-#endif---- | Check if the given name is a valid Magic entity.-isMagicEntity :: MonadTCM m- => M.Map MagicName a -- ^ lookup table- -> String -- ^ name to lookup.- -> String -- ^ type of the entity. Used for errors messages.- -> m (Maybe (String, a))-isMagicEntity tbl xs ty | isMagic xs =- case nm `M.lookup` tbl of- Just x -> return $ Just (nm, x)- Nothing -> typeError $ GenericError $ "No magic " ++ ty ++ " with the name " ++ nm ++ " exists."- where nm = init $ init $ drop 2 xs-isMagicEntity _ _ _ | otherwise = return Nothing---- | Checks if the given name is syntactically a Magic name.--- A syntactally correct magic name is NOT necessarily a valid magic name.-isMagic :: String -> Bool-isMagic xs = "__" `isPrefixOf` xs && "__" `isSuffixOf` xs
− src/full/Agda/Compiler/UHC/Primitives.hs
@@ -1,118 +0,0 @@-{-# LANGUAGE CPP #-}--- | Defines some primitive functions.-module Agda.Compiler.UHC.Primitives- ( primFunNm- , primFunctions- )-where--import Agda.Compiler.UHC.CompileState-import Agda.TypeChecking.Monad-import Agda.TypeChecking.Monad.Builtin-import qualified Agda.Syntax.Internal as T-import Control.Monad.Trans--#include "undefined.h"-import Agda.Utils.Impossible--#if __GLASGOW_HASKELL__ <= 708-import Control.Applicative-#endif--import qualified Data.Map as M-import Data.Maybe--import Agda.Compiler.UHC.Bridge--primFunNm :: String -> HsName-primFunNm = mkHsName ["UHC", "Agda", "Builtins"]---- | Primitives defined for the UHC backend. Maps primitive names to the core expression to be used as function body.-primFunctions :: M.Map String ((CompileT TCM) CExpr)-primFunctions = M.fromList $- [(n, return $ mkVar (primFunNm n)) | n <-- [- -- Level- "primLevelMax"- , "primLevelZero"- , "primLevelSuc"- -- Integer- , "primShowInteger"- -- Nat- , "primNatPlus"- , "primNatTimes"- , "primNatMinus"- , "primNatDivSuc"- , "primNatDivSucAux"- , "primNatModSuc"- , "primNatModSucAux"- , "primNatToInteger"- , "primNatEquality"- , "primNatLess"- , "primIntegerToNat"- -- String- , "primStringAppend"- , "primStringEquality"- , "primStringFromList"- , "primStringToList"- , "primShowString"- -- Char- , "primCharToNat"- , "primCharEquality"- , "primShowChar"- , "primIsLower"- , "primIsDigit"- , "primIsAlpha"- , "primIsSpace"- , "primIsAscii"- , "primIsLatin1"- , "primIsPrint"- , "primIsHexDigit"- , "primToUpper"- , "primToLower"- , "primNatToChar"- -- Float- , "primShowFloat"- , "primFloatEquality"- , "primFloatNumericalEquality"- , "primFloatNumericalLess"- , "primNatToFloat"- , "primFloatPlus"- , "primFloatMinus"- , "primFloatTimes"- , "primFloatNegate"- , "primFloatDiv"- , "primFloatSqrt"- , "primRound"- , "primFloor"- , "primCeiling"- , "primExp"- , "primLog"- , "primSin"- , "primCos"- , "primTan"- , "primASin"- , "primACos"- , "primATan"- , "primATan"- , "primATan2"- -- Reflection- , "primQNameEquality"- , "primQNameLess"- , "primShowQName"- , "primQNameFixity"- , "primMetaEquality"- , "primMetaLess"- , "primShowMeta"- ]- ] ++ [- ("primTrustMe", mkTrustMe)- ]- where mkTrustMe = do- -- lookup refl constructor- bt <- fromMaybe __IMPOSSIBLE__ <$> (lift $ getBuiltin' builtinRefl)- let reflNm = case T.ignoreSharing bt of- (T.Con conHd _ []) -> T.conName conHd- _ -> __IMPOSSIBLE__-- mkVar <$> getConstrFun reflNm
src/full/Agda/Interaction/BasicOps.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-}@@ -15,7 +14,8 @@ import Control.Monad.Identity import qualified Data.Map as Map-import Data.List hiding (null)+import qualified Data.Set as Set+import qualified Data.List as List import Data.Maybe import Data.Traversable hiding (mapM, forM, for) import Data.Monoid@@ -41,6 +41,7 @@ import Agda.TheTypeChecker import Agda.TypeChecking.Constraints import Agda.TypeChecking.Conversion+import Agda.TypeChecking.Errors ( stringTCErr ) import Agda.TypeChecking.Monad as M hiding (MetaInfo) import Agda.TypeChecking.MetaVars import Agda.TypeChecking.Reduce@@ -55,10 +56,11 @@ import Agda.TypeChecking.CheckInternal import Agda.TypeChecking.SizedTypes.Solve import qualified Agda.TypeChecking.Pretty as TP+import Agda.TypeChecking.Warnings (runPM) import Agda.Termination.TermCheck (termMutual) -import Agda.Utils.Except ( Error(strMsg), MonadError(catchError, throwError) )+import Agda.Utils.Except ( MonadError(catchError, throwError) ) import Agda.Utils.Functor import Agda.Utils.Lens import Agda.Utils.List@@ -90,10 +92,10 @@ e <- parseExpr rng s concreteToAbstract (clScope mi) e -giveExpr :: Maybe InteractionId -> MetaId -> Expr -> TCM ()+giveExpr :: UseForce -> Maybe InteractionId -> MetaId -> Expr -> TCM () -- When translator from internal to abstract is given, this function might return -- the expression returned by the type checker.-giveExpr mii mi e = do+giveExpr force mii mi e = do mv <- lookupMeta mi -- In the context (incl. signature) of the meta variable, -- type check expression and assign meta@@ -127,7 +129,7 @@ -- if there are more free variables than the context has -- we need to abstract over the additional ones (xs2) let (_xs1, xs2) = splitAt (size ctx) xs- v' <- return $ foldr (\ (Arg ai x) -> I.Lam ai . I.Abs x) v' xs2+ v' <- return $ foldr mkLam v' xs2 reportSDoc "interaction.give" 20 $ TP.sep [ TP.text "in meta context, v' = " TP.<+> prettyTCM v' ]@@ -139,12 +141,14 @@ nowSolvingConstraints $ assign DirEq mi args v reportSDoc "interaction.give" 20 $ TP.text "give: meta variable updated!"- redoChecks mii+ unless (force == WithForce) $ redoChecks mii wakeupConstraints mi solveSizeConstraints DontDefaultToInfty- -- Double check.- vfull <- instantiateFull v- checkInternal vfull t'+ unless (force == WithForce) $ do+ -- Double check.+ reportSDoc "interaction.give" 20 $ TP.text "give: double checking"+ vfull <- instantiateFull v+ checkInternal vfull t' -- | After a give, redo termination etc. checks for function which was complemented. redoChecks :: Maybe InteractionId -> TCM ()@@ -166,22 +170,25 @@ -- Returns the given expression unchanged -- (for convenient generalization to @'refine'@). give- :: InteractionId -- ^ Hole.+ :: UseForce -- ^ Skip safety checks?+ -> InteractionId -- ^ Hole. -> Maybe Range -> Expr -- ^ The expression to give. -> TCM Expr -- ^ If successful, the very expression is returned unchanged.-give ii mr e = liftTCM $ do+give force ii mr e = liftTCM $ do -- if Range is given, update the range of the interaction meta mi <- lookupInteractionId ii whenJust mr $ updateMetaVarRange mi reportSDoc "interaction.give" 10 $ TP.text "giving expression" TP.<+> prettyTCM e reportSDoc "interaction.give" 50 $ TP.text $ show $ deepUnscope e -- Try to give mi := e- catchError (giveExpr (Just ii) mi e) $ \ err -> case err of- -- Turn PatternErr into proper error:- PatternErr{} -> typeError . GenericDocError =<< do- withInteractionId ii $ TP.text "Failed to give" TP.<+> prettyTCM e- _ -> throwError err+ do setMetaOccursCheck mi DontRunMetaOccursCheck -- #589, #2710: Allow giving recursive solutions.+ giveExpr force (Just ii) mi e+ `catchError` \ case+ -- Turn PatternErr into proper error:+ PatternErr{} -> typeError . GenericDocError =<< do+ withInteractionId ii $ TP.text "Failed to give" TP.<+> prettyTCM e+ err -> throwError err removeInteractionPoint ii return e @@ -191,11 +198,12 @@ -- This amounts to successively try to give @e@, @e ?@, @e ? ?@, ... -- Returns the successfully given expression. refine- :: InteractionId -- ^ Hole.+ :: UseForce -- ^ Skip safety checks when giving?+ -> InteractionId -- ^ Hole. -> Maybe Range -> Expr -- ^ The expression to refine the hole with. -> TCM Expr -- ^ The successfully given expression.-refine ii mr e = do+refine force ii mr e = do mi <- lookupInteractionId ii mv <- lookupMeta mi let range = fromMaybe (getRange mv) mr@@ -211,8 +219,8 @@ tryRefine nrOfMetas r scope e = try nrOfMetas e where try :: Int -> Expr -> TCM Expr- try 0 e = throwError $ strMsg "Cannot refine"- try n e = give ii (Just r) e `catchError` (\_ -> try (n - 1) =<< appMeta e)+ try 0 e = throwError $ stringTCErr "Cannot refine"+ try n e = give force ii (Just r) e `catchError` (\_ -> try (n - 1) =<< appMeta e) -- Apply A.Expr to a new meta appMeta :: Expr -> TCM Expr@@ -222,7 +230,10 @@ ii <- registerInteractionPoint False rng Nothing let info = Info.MetaInfo { Info.metaRange = rng- , Info.metaScope = scope { scopePrecedence = ArgumentCtx }+ , Info.metaScope = scope { scopePrecedence = [ArgumentCtx] }+ -- Ulf, 2017-09-07: The `ArgumentCtx` above is causing #737.+ -- If we're building an operator application the precedence+ -- should be something else. , metaNumber = Nothing -- in order to print just as ?, not ?n , metaNameSuggestion = "" }@@ -264,9 +275,11 @@ withMetaInfo mi $ evalInCurrent e -+-- | Modifier for interactive commands,+-- specifying the amount of normalization in the output.+-- data Rewrite = AsIs | Instantiated | HeadNormal | Simplified | Normalised- deriving (Read)+ deriving (Show, Read) normalForm :: (Reduce t, Simplify t, Normalise t) => Rewrite -> t -> TCM t normalForm AsIs t = return t@@ -275,8 +288,11 @@ normalForm Simplified t = {- etaContract =<< -} simplify t normalForm Normalised t = {- etaContract =<< -} normalise t +-- | Modifier for the interactive computation command,+-- specifying the mode of computation and result display.+-- data ComputeMode = DefaultCompute | IgnoreAbstract | UseShowInstance- deriving (Read, Eq)+ deriving (Show, Read, Eq) computeIgnoreAbstract :: ComputeMode -> Bool computeIgnoreAbstract DefaultCompute = False@@ -296,6 +312,13 @@ _ -> (text "Not a string:" $$) <$> prettyATop e showComputed _ e = prettyATop e +-- | Modifier for interactive commands,+-- specifying whether safety checks should be ignored.+data UseForce+ = WithForce -- ^ Ignore additional checks, like termination/positivity...+ | WithoutForce -- ^ Don't ignore any checks.+ deriving (Eq, Read, Show)+ data OutputForm a b = OutputForm Range [ProblemId] (OutputConstraint a b) deriving (Functor) @@ -342,7 +365,7 @@ FindInScopeOF _ _ _ -> __IMPOSSIBLE__ instance Reify ProblemConstraint (Closure (OutputForm Expr Expr)) where- reify (PConstr pids cl) = enterClosure cl $ \c -> buildClosure =<< (OutputForm (getRange c) pids <$> reify c)+ reify (PConstr pids cl) = enterClosure cl $ \c -> buildClosure =<< (OutputForm (getRange c) (Set.toList pids) <$> reify c) reifyElimToExpr :: I.Elim -> TCM Expr reifyElimToExpr e = case e of@@ -380,7 +403,7 @@ target <- reify target let bs = TypedBindings noRange $ Arg ai $ TBind noRange xs domType- e = A.Lam Info.exprNoRange (DomainFull bs) body+ e = A.Lam Info.defaultLamInfo_ (DomainFull bs) body return $ TypedAssign m' e target CheckArgs _ _ args t0 t1 _ -> do t0 <- reify t0@@ -436,10 +459,10 @@ show (IsEmptyType a) = "Is empty: " ++ show a show (SizeLtSat a) = "Not empty type of sizes: " ++ show a show (FindInScopeOF s t cs) = "Resolve instance argument " ++ showCand (s,t) ++ ".\n Candidates:\n [ " ++- intercalate "\n , " (map showCand cs) ++ " ]"- where showCand (tm,ty) = indent 6 $ show tm ++ " : " ++ show ty- indent n s = intercalate ("\n" ++ replicate n ' ') (l:ls)- where l:ls = lines s+ List.intercalate "\n , " (map showCand cs) ++ " ]"+ where+ showCand (tm,ty) = indent 6 $ show tm ++ " : " ++ show ty+ indent n s = List.intercalate ("\n" ++ replicate n ' ') $ lines s instance (ToConcrete a c, ToConcrete b d) => ToConcrete (OutputForm a b) (OutputForm c d) where@@ -831,7 +854,7 @@ hfs <- getRecordFieldNames d fs <- ifM showImplicitArguments (return $ map unArg hfs)- (return [ unArg a | a <- hfs, getHiding a == NotHidden ])+ (return [ unArg a | a <- hfs, visible a ]) let e = C.Rec noRange $ for fs $ \ f -> Left $ C.FieldAssignment f $ C.QuestionMark noRange Nothing return [ prettyShow e ]@@ -849,12 +872,36 @@ tel <- lookupSection current -- Get the names of the local variables from @scope@ -- and put them into the context.+ --+ -- Andreas, 2017-04-24, issue #2552:+ --+ -- Delete the let-bound ones, since they are not represented+ -- in the module telescope.+ --+ -- This is a temporary fix until a better solution is available,+ -- e.g., when the module telescope represents let-bound variables.+ --+ -- Unfortunately, referring to let-bound variables+ -- from the top level module telescope will for now result in a not-in-scope error. let names :: [A.Name]- names = reverse $ map snd $ notShadowedLocals $ scopeLocals scope- types :: [Dom I.Type]+ names = map localVar $ filter ((False ==) . localLetBound) $ map snd $ reverse $ scopeLocals scope+ -- Andreas, 2016-12-31, issue #2371+ -- The following is an unnecessary complication, as shadowed locals+ -- are not in scope anyway (they are ambiguous).+ -- -- Replace the shadowed names by fresh names (such that they do not shadow imports)+ -- let mnames :: [Maybe A.Name]+ -- mnames = map (notShadowedLocal . snd) $ reverse $ scopeLocals scope+ -- names <- mapM (maybe freshNoName_ return) mnames+ let types :: [Dom I.Type] types = map (snd <$>) $ telToList tel gamma :: ListTel' A.Name- gamma = zipWith' (\ x dom -> (x,) <$> dom) names types+ gamma = fromMaybe __IMPOSSIBLE__ $+ zipWith' (\ x dom -> (x,) <$> dom) names types+ reportSDoc "interaction.top" 20 $ TP.vcat+ [ TP.text "BasicOps.atTopLevel"+ , TP.text " names = " TP.<+> TP.sep (map prettyA names)+ , TP.text " types = " TP.<+> TP.sep (map prettyTCM types)+ ] M.withCurrentModule current $ withScope_ scope $ addContext gamma $
src/full/Agda/Interaction/CommandLine.hs view
@@ -5,7 +5,7 @@ import Control.Monad.Reader import Control.Applicative -import Data.List as List+import qualified Data.List as List import Data.Maybe import Agda.Interaction.BasicOps as BasicOps hiding (parseExpr)@@ -13,6 +13,7 @@ import qualified Agda.Syntax.Abstract as A import Agda.Syntax.Common+import Agda.Syntax.Internal (telToList) import qualified Agda.Syntax.Internal as I import Agda.Syntax.Parser import Agda.Syntax.Position@@ -29,6 +30,7 @@ import Agda.TypeChecking.Errors import Agda.TypeChecking.Pretty ( PrettyTCM(prettyTCM) ) import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Warnings (runPM) import Agda.Utils.Except ( MonadError(catchError) ) import Agda.Utils.Monad@@ -42,7 +44,7 @@ matchCommand :: String -> [Command a] -> Either [String] ([String] -> TCM (ExitCode a)) matchCommand x cmds =- case List.filter (isPrefixOf x . fst) cmds of+ case List.filter (List.isPrefixOf x . fst) cmds of [(_,m)] -> Right m xs -> Left $ List.map fst xs @@ -65,7 +67,7 @@ do liftIO $ putStrLn $ "Unknown command '" ++ cmd ++ "'" loop Left xs ->- do liftIO $ putStrLn $ "More than one command match: " ++ concat (intersperse ", " xs)+ do liftIO $ putStrLn $ "More than one command match: " ++ concat (List.intersperse ", " xs) loop Just _ -> do go =<< liftTCM (eval $ fromJust ms)@@ -202,7 +204,7 @@ giveMeta :: [String] -> TCM () giveMeta s | length s >= 2 = do- _ <- actOnMeta s (\ii -> \e -> give ii Nothing e)+ _ <- actOnMeta s $ \ ii e -> give WithoutForce ii Nothing e return () giveMeta _ = liftIO $ putStrLn $ ": give" ++ " metaid expr" @@ -210,7 +212,7 @@ refineMeta :: [String] -> TCM () refineMeta s | length s >= 2 = do- _ <- actOnMeta s (\ii -> \e -> refine ii Nothing e)+ _ <- actOnMeta s $ \ ii e -> refine WithoutForce ii Nothing e return () refineMeta _ = liftIO $ putStrLn $ ": refine" ++ " metaid expr" @@ -289,7 +291,8 @@ , " __/ /" , " \\__/" , ""- , "The interactive mode is no longer supported. Don't complain if it doesn't work."+ -- , "The interactive mode is no longer supported. Don't complain if it doesn't work."+ , "The interactive mode is no longer under active development. Use at your own risk." ] -- | The help message
src/full/Agda/Interaction/EmacsTop.hs view
@@ -7,12 +7,13 @@ import Control.Monad.State import Data.Char-import Data.List+import qualified Data.List as List import Data.Maybe import System.IO import Agda.Utils.Monad+import Agda.Utils.Maybe import Agda.Utils.Pretty import Agda.Utils.String @@ -23,7 +24,7 @@ import Agda.Interaction.Response as R import Agda.Interaction.InteractionTop-import Agda.Interaction.EmacsCommand+import Agda.Interaction.EmacsCommand hiding (putResponse) import Agda.Interaction.Highlighting.Emacs import Agda.Interaction.Options @@ -46,70 +47,89 @@ hSetEncoding stdin utf8 setInteractionOutputCallback $- liftIO . mapM_ print <=< lispifyResponse+ mapM_ print <=< lispifyResponse - handleCommand_ (lift setup) `evalStateT` initCommandState+ commands <- liftIO $ initialiseCommandQueue readCommand + handleCommand_ (lift setup) `evalStateT` initCommandState commands+ opts <- commandLineOptions- _ <- interact' `runStateT` initCommandState { optionsOnReload = opts{ optAbsoluteIncludePaths = [] } }+ _ <- interact' `runStateT`+ (initCommandState commands)+ { optionsOnReload = opts{ optAbsoluteIncludePaths = [] } } return () where+ interact' :: CommandM ()+ interact' = do+ Bench.reset+ done <- Bench.billTo [] $ do - interact' :: CommandM ()- interact' = do- Bench.reset- done <- Bench.billTo [] $ do+ liftIO $ do+ putStr "Agda2> "+ hFlush stdout+ c <- nextCommand+ case c of+ Done -> return True -- Done.+ Error s -> liftIO (putStrLn s) >> return False+ Command c -> do+ maybeAbort (runInteraction c)+ return False - liftIO $ do- putStr "Agda2> "- hFlush stdout- done <- liftIO isEOF- unless done $ do- r <- liftIO getLine- _ <- return $! length r -- force to read the full input line- case dropWhile isSpace r of- "" -> return ()- ('-':'-':_) -> return ()- _ -> case listToMaybe $ reads r of- Just (x, "") -> runInteraction x- Just (_, rem) -> liftIO $ putStrLn $ "not consumed: " ++ rem- _ -> liftIO $ putStrLn $ "cannot read: " ++ r- return done+ lift Bench.print+ unless done interact' - lift Bench.print- unless done interact'+ -- Reads the next command from stdin. + readCommand :: IO Command+ readCommand = do+ done <- isEOF+ if done then+ return Done+ else do+ r <- getLine+ _ <- return $! length r -- force to read the full input line+ case dropWhile isSpace r of+ "" -> readCommand+ ('-':'-':_) -> readCommand+ _ -> case listToMaybe $ reads r of+ Just (x, "") -> return $ Command x+ Just (_, rem) -> return $ Error $ "not consumed: " ++ rem+ _ -> return $ Error $ "cannot read: " ++ r++-- | Given strings of goals, warnings and errors, return a pair of the+-- body and the title for the info buffer+formatWarningsAndErrors :: String -> String -> String -> (String, String)+formatWarningsAndErrors g w e = (body, title)+ where+ isG = not $ null g+ isW = not $ null w+ isE = not $ null e+ title = List.intercalate "," $ catMaybes+ [ " Goals" <$ guard isG+ , " Warnings" <$ guard isW+ , " Errors" <$ guard isE+ , " Done" <$ guard (not (isG || isW || isE))+ ]++ body = List.intercalate "\n" $ catMaybes+ [ g <$ guard isG+ , delimiter "Warnings" <$ guard (isW && (isG || isE))+ , w <$ guard isW+ , delimiter "Errors" <$ guard (isE && (isG || isW))+ , e <$ guard isE+ ]+ -- | Convert Response to an elisp value for the interactive emacs frontend. -lispifyResponse :: Response -> TCM [Lisp String]-lispifyResponse (Resp_HighlightingInfo info modFile) =- (:[]) <$> lispifyHighlightingInfo info modFile+lispifyResponse :: Response -> IO [Lisp String]+lispifyResponse (Resp_HighlightingInfo info method modFile) =+ (:[]) <$> lispifyHighlightingInfo info method modFile lispifyResponse (Resp_DisplayInfo info) = return $ case info of- Info_CompilationOk -> f "The module was successfully compiled." "*Compilation result*"+ Info_CompilationOk w e -> f body "*Compilation result*"+ where (body, _) = formatWarningsAndErrors "The module was successfully compiled.\n" w e -- abusing the goals field since we ignore the title Info_Constraints s -> f s "*Constraints*"- Info_AllGoalsWarnings g w e -> f body ("*All" ++ title ++ "*")- where- isG = not $ null g- isW = not $ null w- isE = not $ null e- title = intercalate "," $ catMaybes- [ " Goals" <$ guard isG- , " Warnings" <$ guard isW- , " Errors" <$ guard isE- , " Done" <$ guard (not (isG || isW || isE))- ]- delimiter s = concat [ replicate 4 '\x2014'- , " ", s, " "- , replicate (54 - length s) '\x2014'- ]-- body = intercalate "\n" $ catMaybes- [ g <$ guard isG- , delimiter "Warnings" <$ guard (isW && (isG || isE))- , w <$ guard isW- , delimiter "Errors" <$ guard (isE && (isG || isW))- , e <$ guard isE- ]+ Info_AllGoalsWarnings g w e -> f body ("*All" ++ title ++ "*")+ where (body, title) = formatWarningsAndErrors g w e Info_Auto s -> f s "*Auto*" Info_Error s -> f s "*Error*" -- FNF: if Info_Warning comes back into use, the above should be@@ -134,6 +154,7 @@ Info_Version -> f ("Agda version " ++ versionWithCommitInfo) "*Agda Version*" where f content bufname = [ display_info' False bufname content ] lispifyResponse Resp_ClearHighlighting = return [ L [ A "agda2-highlight-clear" ] ]+lispifyResponse Resp_DoneAborting = return [ L [ A "agda2-abort-done" ] ] lispifyResponse Resp_ClearRunningInfo = return [ clearRunningInfo ] -- FNF: if Info_Warning comes back into use, the above should be -- return [ clearRunningInfo, clearWarning ]@@ -142,12 +163,10 @@ | otherwise = return [ L [A "agda2-verbose", A (quote s)] ] lispifyResponse (Resp_Status s) = return [ L [ A "agda2-status-action"- , A (quote $ intercalate "," $ catMaybes [checked, showImpl])+ , A (quote $ List.intercalate "," $ catMaybes [checked, showImpl]) ] ] where- boolToMaybe b x = if b then Just x else Nothing- checked = boolToMaybe (sChecked s) "Checked" showImpl = boolToMaybe (sShowImplicitArguments s) "ShowImplicit"
src/full/Agda/Interaction/FindFile.hs view
@@ -23,7 +23,7 @@ import Control.Applicative hiding (empty) import Control.Monad import Control.Monad.Trans-import Data.List hiding (null)+import qualified Data.List as List import Data.Maybe (catMaybes) import qualified Data.Map as Map import System.FilePath@@ -39,6 +39,7 @@ import Agda.TypeChecking.Monad.Benchmark (billTo) import qualified Agda.TypeChecking.Monad.Benchmark as Bench import {-# SOURCE #-} Agda.TypeChecking.Monad.Options (getIncludeDirs)+import Agda.TypeChecking.Warnings (runPM) import Agda.Utils.Except import Agda.Utils.FileName@@ -121,7 +122,7 @@ filesShortList <- fileList sourceFileExtsShortList existingFiles <- liftIO $ filterM (doesFileExistCaseSensitive . filePath) files- return $ case nub existingFiles of+ return $ case List.nub existingFiles of [] -> (Left (NotFound filesShortList), modFile) [file] -> (Right file, Map.insert m file modFile) files -> (Left (Ambiguous existingFiles), modFile)@@ -182,19 +183,18 @@ -- -- No side effects! Only in 'TCM' to raise errors. -moduleName' :: AbsolutePath -> TCM (Ranged TopLevelModuleName)+moduleName' :: AbsolutePath -> TCM TopLevelModuleName moduleName' file = billTo [Bench.ModuleName] $ do q <- runPM (parseFile' moduleParser file) let name = topLevelModuleName q- case name of- TopLevelModuleName ["_"] -> do+ if moduleNameParts name == ["_"] then do q <- runPM (parse moduleNameParser defaultName) `catchError` \_ -> typeError $ GenericError $ "File name " ++ show file ++ " is invalid as it does not correspond to a valid module name."- return $ Ranged (getRange q) $ TopLevelModuleName [defaultName]- _ -> return $ Ranged (getRange q) name+ return $ TopLevelModuleName (getRange q) [defaultName]+ else return name where defaultName = rootNameModule file @@ -211,7 +211,7 @@ _ -> __IMPOSSIBLE__ where stripExtension :: String -> String -> Maybe String- stripExtension e = fmap reverse . stripPrefix (reverse e) . reverse+ stripExtension e = fmap reverse . List.stripPrefix (reverse e) . reverse rootNameModule :: AbsolutePath -> String rootNameModule = dropAgdaExtension . snd . splitFileName . filePath@@ -224,7 +224,8 @@ moduleName :: AbsolutePath -> TCM TopLevelModuleName moduleName file = do- Ranged r m <- moduleName' file+ m <- moduleName' file+ let r = getRange m -- Andreas, 2016-07-11, issue 2092 -- The error range should be set to the file with the wrong module name -- not the importing one (which would be the default).
src/full/Agda/Interaction/FindFile.hs-boot view
@@ -1,10 +1,9 @@ module Agda.Interaction.FindFile where -import Agda.Syntax.Common (Ranged) import Agda.Syntax.Concrete.Name (TopLevelModuleName) import Agda.TypeChecking.Monad.Base (TCM) import Agda.Utils.FileName (AbsolutePath) moduleName :: AbsolutePath -> TCM TopLevelModuleName-moduleName' :: AbsolutePath -> TCM (Ranged TopLevelModuleName)+moduleName' :: AbsolutePath -> TCM TopLevelModuleName checkModuleName :: TopLevelModuleName -> AbsolutePath -> Maybe TopLevelModuleName -> TCM ()
src/full/Agda/Interaction/Highlighting/Emacs.hs view
@@ -38,7 +38,8 @@ toAtoms :: Aspects -> [String] toAtoms m = map toAtom (otherAspects m) ++ toAtoms' (aspect m) where- toAtom x = map toLower (show x)+ toAtom :: Show a => a -> String+ toAtom = map toLower . show kindToAtom (Constructor Inductive) = "inductiveconstructor" kindToAtom (Constructor CoInductive) = "coinductiveconstructor"@@ -58,20 +59,18 @@ :: ModuleToSource -- ^ Must contain a mapping for the definition site's module, if any. -> (Range, Aspects) -> Lisp String-showAspects modFile (r, m) =- L $ ((map (A . show) [from r, to r])- ++- [L $ map A $ toAtoms m]- ++- (A $ maybe "nil" quote $ note m)- :- defSite)+showAspects modFile (r, m) = L $+ (map (A . show) [from r, to r])+ +++ [L $ map A $ toAtoms m]+ +++ [A $ maybe "nil" quote $ note m]+ +++ (maybeToList $ fmap defSite $ definitionSite m) where- defSite = case definitionSite m of- Nothing -> []- Just (m, p) -> case Map.lookup m modFile of- Nothing -> __IMPOSSIBLE__- Just f -> [Cons (A $ quote $ filePath f) (A $ show p)]+ defSite (DefinitionSite m p _ _) =+ Cons (A $ quote $ filePath f) (A $ show p)+ where f = Map.findWithDefault __IMPOSSIBLE__ m modFile -- | Turns syntax highlighting information into a list of -- S-expressions.@@ -83,12 +82,12 @@ lispifyHighlightingInfo :: HighlightingInfo+ -> HighlightingMethod -> ModuleToSource -- ^ Must contain a mapping for every definition site's module.- -> TCM (Lisp String)-lispifyHighlightingInfo h modFile = do- method <- envHighlightingMethod <$> ask- liftIO $ case ranges h of+ -> IO (Lisp String)+lispifyHighlightingInfo h method modFile = do+ case ranges h of _ | method == Direct -> direct ((_, mi) : _) | otherAspects mi == [TypeChecks] || mi == mempty -> direct
src/full/Agda/Interaction/Highlighting/Generate.hs view
@@ -43,10 +43,12 @@ hiding (MetaInfo, Primitive, Constructor, Record, Function, Datatype) import qualified Agda.TypeChecking.Monad as M import Agda.TypeChecking.Positivity.Occurrence+import Agda.TypeChecking.Warnings (runPM) import qualified Agda.Syntax.Abstract as A import Agda.Syntax.Concrete (FieldAssignment'(..)) import qualified Agda.Syntax.Common as Common+import qualified Agda.Syntax.Concrete.Name as C import qualified Agda.Syntax.Concrete as C import Agda.Syntax.Fixity import qualified Agda.Syntax.Info as SI@@ -64,6 +66,7 @@ import Agda.Utils.Maybe import qualified Agda.Utils.Maybe.Strict as Strict import Agda.Utils.Null+import Agda.Utils.Pretty import Agda.Utils.HashMap (HashMap) import qualified Agda.Utils.HashMap as HMap @@ -109,14 +112,17 @@ -- | Lispify and print the given highlighting information. printHighlightingInfo :: MonadTCM tcm => HighlightingInfo -> tcm ()-printHighlightingInfo x = do+printHighlightingInfo info = do modToSrc <- use stModuleToSource- liftTCM $ reportSLn "highlighting" 50 $- "Printing highlighting info:\n" ++ show x ++ "\n" ++- " modToSrc = " ++ show modToSrc- unless (null $ ranges x) $ do+ method <- view eHighlightingMethod+ liftTCM $ reportSLn "highlighting" 50 $ unlines+ [ "Printing highlighting info:"+ , show info+ , " modToSrc = " ++ show modToSrc+ ]+ unless (null $ ranges info) $ do liftTCM $ appInteractionOutputCallback $- Resp_HighlightingInfo x modToSrc+ Resp_HighlightingInfo info method modToSrc -- | Highlighting levels. @@ -129,20 +135,24 @@ -- constructors. -- | Generate syntax highlighting information for the given--- declaration, and (if appropriate) print it. If the--- 'HighlightingLevel' is @'Full'@, then the state is--- additionally updated with the new highlighting info (in case of a--- conflict new info takes precedence over old info).+-- declaration, and (if appropriate) print it. If the boolean is+-- 'True', then the state is additionally updated with the new+-- highlighting info (in case of a conflict new info takes precedence+-- over old info). -- -- The procedure makes use of some of the token highlighting info in -- 'stTokens' (that corresponding to the interval covered by the--- declaration). If the 'HighlightingLevel' is @'Full'@,--- then this token highlighting info is additionally removed from--- 'stTokens'.+-- declaration). If the boolean is 'True', then this token+-- highlighting info is additionally removed from 'stTokens'. -generateAndPrintSyntaxInfo :: A.Declaration -> Level -> TCM ()-generateAndPrintSyntaxInfo decl _ | null $ P.getRange decl = return ()-generateAndPrintSyntaxInfo decl hlLevel = do+generateAndPrintSyntaxInfo+ :: A.Declaration+ -> Level+ -> Bool+ -- ^ Update the state?+ -> TCM ()+generateAndPrintSyntaxInfo decl _ _ | null $ P.getRange decl = return ()+generateAndPrintSyntaxInfo decl hlLevel updateState = do file <- fromMaybe __IMPOSSIBLE__ <$> asks envCurrentPath reportSLn "import.iface.create" 15 $@@ -152,7 +162,7 @@ Partial {} -> "(first approximation)" ++ "." - reportSLn "highlighting.names" 60 $ "highlighting names = " ++ show names+ reportSLn "highlighting.names" 60 $ "highlighting names = " ++ prettyShow names M.ignoreAbstractMode $ do modMap <- sourceToModule@@ -166,8 +176,12 @@ Full{} -> generateConstructorInfo modMap file kinds decl _ -> return mempty - warnInfo <- Fold.fold . map (warningHighlighting . tcWarning) <$> use stTCWarnings+ cm <- P.rangeFile <$> view eRange+ reportSLn "highlighting.warning" 60 $ "current path = " ++ show cm + warnInfo <- Fold.foldMap warningHighlighting+ . filter ((cm ==) . tcWarningOrigin) <$> use stTCWarnings+ let (from, to) = case P.rangeToInterval (P.getRange decl) of Nothing -> __IMPOSSIBLE__ Just i -> ( fromIntegral $ P.posPos $ P.iStart i@@ -189,10 +203,9 @@ `mappend` curTokens - case hlLevel of- Full{} -> do stSyntaxInfo %= mappend syntaxInfo- stTokens .= prevTokens `mappend` postTokens- _ -> return ()+ when updateState $ do+ stSyntaxInfo %= mappend syntaxInfo+ stTokens .= prevTokens `mappend` postTokens ifTopLevelAndHighlightingLevelIs NonInteractive $ printHighlightingInfo syntaxInfo@@ -243,12 +256,14 @@ (\isOp -> mempty { aspect = Just $ Name (Just Module) isOp }) Nothing + -- For top level modules, we set the binding site to the beginning of the file+ -- so that clicking on an imported module will jump to the beginning of the file+ -- which defines this module. mod isTopLevelModule n = nameToFile modMap file [] (A.nameConcrete n) P.noRange (\isOp -> mempty { aspect = Just $ Name (Just Module) isOp })- (Just $ (if isTopLevelModule then P.beginningOfFile else id)- (A.nameBindingSite n))+ (Just $ applyWhen isTopLevelModule P.beginningOfFile $ A.nameBindingSite n) getVarAndField :: A.Expr -> File getVarAndField (A.Var x) = bound x@@ -375,7 +390,9 @@ tokenToCFile (T.TokTeX (i, _)) = aToF Comment (P.getRange i) tokenToCFile (T.TokId {}) = mempty tokenToCFile (T.TokQId {}) = mempty- tokenToCFile (T.TokString {}) = mempty+ tokenToCFile (T.TokString (i,s))+ | "--" `isPrefixOf` s = aToF Option (P.getRange i)+ | otherwise = mempty tokenToCFile (T.TokDummy {}) = mempty tokenToCFile (T.TokEOF {}) = mempty @@ -424,7 +441,7 @@ defnToKind M.Record{} = Record defnToKind M.Constructor{ M.conInd = i } = Constructor i defnToKind M.Primitive{} = Primitive- defnToKind M.AbstractDefn = __IMPOSSIBLE__+ defnToKind M.AbstractDefn{} = __IMPOSSIBLE__ declToKind :: A.Declaration -> HashMap A.QName NameKind -> HashMap A.QName NameKind@@ -530,12 +547,33 @@ -- | Generate syntax highlighting for warnings. -warningHighlighting :: Warning -> File-warningHighlighting w = case w of- TerminationIssue terrs -> terminationErrorHighlighting terrs- NotStrictlyPositive d ocs -> positivityErrorHighlighting d ocs- _ -> mempty-+warningHighlighting :: TCWarning -> File+warningHighlighting w = case tcWarning w of+ TerminationIssue terrs -> terminationErrorHighlighting terrs+ NotStrictlyPositive d ocs -> positivityErrorHighlighting d ocs+ UnreachableClauses{} -> unreachableErrorHighlighting $ P.getRange w+ CoverageIssue{} -> coverageErrorHighlighting $ P.getRange w+ CoverageNoExactSplit{} -> catchallHighlighting $ P.getRange w+ -- expanded catch-all case to get a warning for new constructors+ UnsolvedMetaVariables{} -> mempty+ UnsolvedInteractionMetas{} -> mempty+ UnsolvedConstraints{} -> mempty+ OldBuiltin{} -> mempty+ EmptyRewritePragma{} -> mempty+ UselessPublic{} -> mempty+ UselessInline{} -> mempty+ ParseWarning{} -> mempty+ GenericWarning{} -> mempty+ GenericNonFatalError{} -> mempty+ SafeFlagPostulate{} -> mempty+ SafeFlagPragma{} -> mempty+ SafeFlagNonTerminating -> mempty+ SafeFlagTerminating -> mempty+ SafeFlagPrimTrustMe -> mempty+ SafeFlagNoPositivityCheck -> mempty+ SafeFlagPolarity -> mempty+ DeprecationWarning{} -> mempty+ NicifierIssue{} -> mempty -- | Generate syntax highlighting for termination errors. @@ -558,7 +596,20 @@ rs = case o of Unknown -> []; Known r _ -> [r] m = mempty { otherAspects = [PositivityProblem] } +unreachableErrorHighlighting :: P.Range -> File+unreachableErrorHighlighting r = singleton (rToR $ P.continuousPerLine r) m+ where m = mempty { otherAspects = [ReachabilityProblem] } +coverageErrorHighlighting :: P.Range -> File+coverageErrorHighlighting r = singleton (rToR $ P.continuousPerLine r) m+ where m = mempty { otherAspects = [CoverageProblem] }+++catchallHighlighting :: P.Range -> File+catchallHighlighting r = singleton (rToR $ P.continuousPerLine r) m+ where m = mempty { otherAspects = [CatchallClause] }++ -- | Generates and prints syntax highlighting information for unsolved -- meta-variables and certain unsolved constraints. @@ -650,18 +701,65 @@ nameToFile modMap file xs x fr m mR = -- We don't care if we get any funny ranges. if all (== Strict.Just file) fileNames then+ frFile `mappend` several (map rToR rs)- ((m $ C.isOperator x) { definitionSite = mFilePos })+ (aspects { definitionSite = mFilePos }) else mempty where+ aspects = m $ C.isOperator x fileNames = catMaybes $ map (fmap P.srcFile . P.rStart . P.getRange) (x : xs)- rs = applyWhen (not $ null fr) (fr :) $ map P.getRange (x : xs)+ frFile = singleton (rToR fr) (aspects { definitionSite = notHere <$> mFilePos })+ rs = map P.getRange (x : xs)++ -- The fixity declaration should not get a symbolic anchor.+ notHere d = d { defSiteHere = False }++ mFilePos :: Maybe DefinitionSite mFilePos = do r <- mR P.Pn { P.srcFile = Strict.Just f, P.posPos = p } <- P.rStart r mod <- Map.lookup f modMap- return (mod, fromIntegral p)+ -- Andreas, 2017-06-16, Issue #2604: Symbolic anchors.+ -- We drop the file name part from the qualifiers, since+ -- this is contained in the html file name already.+ -- We want to get anchors of the form:+ -- @<a name="TopLevelModule.html#LocalModule.NestedModule.identifier">@+ let qualifiers = drop (length $ C.moduleNameParts mod) xs+ -- For bound variables, we do not create symbolic anchors.+ local = maybe True isLocalAspect $ aspect aspects+ return $ DefinitionSite+ { defSiteModule = mod+ , defSitePos = fromIntegral p+ -- Is our current position the definition site?+ , defSiteHere = r == P.getRange x+ -- For bound variables etc. we do not create a symbolic anchor name.+ -- Also not for names that include anonymous modules,+ -- otherwise, we do not get unique anchors.+ , defSiteAnchor = if local || C.isNoName x || any Common.isUnderscore qualifiers+ then Nothing+ else Just $ prettyShow $ foldr C.Qual (C.QName x) qualifiers+ }++ -- Is the name a bound variable or similar? If in doubt, yes.+ isLocalAspect :: Aspect -> Bool+ isLocalAspect = \case+ Name mkind _ -> maybe True isLocal mkind+ _ -> True+ isLocal :: NameKind -> Bool+ isLocal = \case+ Bound -> True+ Argument -> True+ Constructor{} -> False+ Datatype -> False+ Field -> False+ Function -> False+ Module -> False+ Postulate -> False+ Primitive -> False+ Record -> False+ Macro -> False+ -- | A variant of 'nameToFile' for qualified abstract names.
src/full/Agda/Interaction/Highlighting/HTML.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-} -- | Function for generating highlighted, hyperlinked HTML from Agda -- sources.@@ -14,21 +15,31 @@ , code ) where +import Prelude hiding ((!!), concatMap) import Control.Applicative import Control.Monad import Control.Monad.Trans import Data.Function import Data.Monoid+import Data.Foldable (toList, concatMap) import Data.Maybe import qualified Data.IntMap as IntMap import qualified Data.Map as Map import qualified Data.List as List+import Data.Text.Lazy (Text) +import qualified Network.URI.Encode+ import System.FilePath import System.Directory -import Text.XHtml.Strict+import Text.Blaze.Html5 hiding (code, map, title)+import qualified Text.Blaze.Html5 as Html5+import Text.Blaze.Html5.Attributes as Attr+import Text.Blaze.Html.Renderer.Text+ -- The imported operator (!) attaches an Attribute to an Html value+ -- The defined operator (!!) attaches a list of such Attributes import Paths_Agda @@ -42,9 +53,10 @@ import qualified Agda.TypeChecking.Monad as TCM import Agda.Utils.FileName (filePath)+import Agda.Utils.Function import Agda.Utils.Lens import qualified Agda.Utils.IO.UTF8 as UTF8-import Agda.Utils.Pretty+import Agda.Utils.Pretty hiding ((<>)) import Agda.Utils.Tuple #include "undefined.h"@@ -64,8 +76,10 @@ generateHTML :: TCM () generateHTML = generateHTMLWithPageGen pageGen where+ pageGen :: FilePath -> C.TopLevelModuleName -> CompressedFile -> TCM () pageGen dir mod hinfo = generatePage renderer dir mod where+ renderer :: FilePath -> FilePath -> String -> Text renderer css _ contents = page css mod $ code $ tokenStream contents hinfo -- | Prepare information for HTML page generation.@@ -105,54 +119,55 @@ -- | Converts module names to the corresponding HTML file names. modToFile :: C.TopLevelModuleName -> FilePath-modToFile m = render (pretty m) <.> "html"+modToFile m =+ Network.URI.Encode.encode $+ render (pretty m) <.> "html" -- | Generates a highlighted, hyperlinked version of the given module. generatePage- :: (FilePath -> FilePath -> String -> String) -- ^ Page renderer+ :: (FilePath -> FilePath -> String -> Text) -- ^ Page renderer -> FilePath -- ^ Directory in which to create files. -> C.TopLevelModuleName -- ^ Module to be highlighted. -> TCM () generatePage renderpage dir mod = do- mf <- Map.lookup mod <$> use TCM.stModuleToSource- case mf of- Nothing -> __IMPOSSIBLE__- Just f -> do- contents <- liftIO $ UTF8.readTextFile $ filePath f- css <- maybe defaultCSSFile id . optCSSFile <$>- TCM.commandLineOptions- let html = renderpage css (filePath f) contents- TCM.reportSLn "html" 1 $ "Generating HTML for " ++- render (pretty mod) ++- " (" ++ target ++ ")."- liftIO $ UTF8.writeFile target html+ f <- fromMaybe __IMPOSSIBLE__ . Map.lookup mod <$> use TCM.stModuleToSource+ contents <- liftIO $ UTF8.readTextFile $ filePath f+ css <- fromMaybe defaultCSSFile . optCSSFile <$>+ TCM.commandLineOptions+ let html = renderpage css (filePath f) contents+ TCM.reportSLn "html" 1 $ "Generating HTML for " +++ render (pretty mod) +++ " (" ++ target ++ ")."+ liftIO $ UTF8.writeTextToFile target html where target = dir </> modToFile mod ++-- | Attach multiple Attributes++(!!) :: Html -> [Attribute] -> Html+h !! as = h ! mconcat as+ -- | Constructs the web page, including headers. page :: FilePath -- ^ URL to the CSS file. -> C.TopLevelModuleName -- ^ Module to be highlighted. -> Html- -> String-page css modName pagecontent = renderHtml $- header (thetitle << render (pretty modName)- +++- meta ! [ httpequiv "Content-Type"- , content "text/html; charset=UTF-8"- ]- +++- meta ! [ httpequiv "Content-Style-Type"- , content "text/css"- ]- +++- thelink noHtml ! [ href css- , rel "stylesheet"- , thetype "text/css"- ])- +++- body << pre << pagecontent+ -> Text+page css modName pagecontent = renderHtml $ docTypeHtml $ hdr <> rest + where++ hdr = Html5.head $ mconcat+ [ meta !! [ charset "utf-8" ]+ , Html5.title (toHtml $ render $ pretty modName)+ , link !! [ rel "stylesheet"+ , href (stringValue css)+ ]+ ]++ rest = body (pre pagecontent)+ -- | Constructs token stream ready to print. tokenStream@@ -162,7 +177,7 @@ tokenStream contents info = map (\cs -> case cs of (mi, (pos, _)) : _ ->- (pos, map (snd . snd) cs, maybe mempty id mi)+ (pos, map (snd . snd) cs, fromMaybe mempty mi) [] -> __IMPOSSIBLE__) $ List.groupBy ((==) `on` fst) $ map (\(pos, c) -> (IntMap.lookup pos infoMap, (pos, c))) $@@ -174,26 +189,32 @@ code :: [(Int, String, Aspects)] -> Html-code = mconcat . map (\(pos, s, mi) -> annotate pos mi (stringToHtml s))+code = mconcat . map mkHtml where+ mkHtml :: (Int, String, Aspects) -> Html+ mkHtml (pos, s, mi) =+ -- Andreas, 2017-06-16, issue #2605:+ -- Do not create anchors for whitespace.+ applyUnless (mi == mempty) (annotate pos mi) $ toHtml s+ annotate :: Int -> Aspects -> Html -> Html- annotate pos mi = anchor ! attributes+ annotate pos mi content = a content !! attributes where- attributes =- [name (show pos)] ++- maybe [] link (definitionSite mi) ++- (case classes of- [] -> []- cs -> [theclass $ unwords cs])+ attributes = concat+ [ [Attr.id $ stringValue $ applyWhen here anchorName $ show pos ]+ , toList $ fmap link mDefinitionSite+ , class_ (stringValue $ unwords classes) <$ guard (not $ null classes)+ ] - classes =- maybe [] noteClasses (note mi)- ++ otherAspectClasses (otherAspects mi)- ++ maybe [] aspectClasses (aspect mi)+ classes = concat+ [ concatMap noteClasses (note mi)+ , otherAspectClasses (otherAspects mi)+ , concatMap aspectClasses (aspect mi)+ ] aspectClasses (Name mKind op) = kindClass ++ opClass where- kindClass = maybe [] ((: []) . showKind) mKind+ kindClass = toList $ fmap showKind mKind showKind (Constructor Inductive) = "InductiveConstructor" showKind (Constructor CoInductive) = "CoinductiveConstructor"@@ -207,4 +228,13 @@ -- Notes are not included. noteClasses s = [] - link (m, pos) = [href $ modToFile m ++ "#" ++ show pos]+ mDefinitionSite = definitionSite mi+ here = maybe False defSiteHere mDefinitionSite+ anchorName = (`fromMaybe` maybe __IMPOSSIBLE__ defSiteAnchor mDefinitionSite)+ link (DefinitionSite m pos _here aName) = href $ stringValue $+ -- If the definition site points to the top of a file,+ -- we drop the anchor part and just link to the file.+ applyUnless (pos <= 1)+ (++ "#" +++ Network.URI.Encode.encode (fromMaybe (show pos) aName))+ (Network.URI.Encode.encode $ modToFile m)
src/full/Agda/Interaction/Highlighting/LaTeX.hs view
@@ -14,16 +14,26 @@ import Data.Maybe import Data.Function import Control.Monad.RWS.Strict+import Control.Applicative+import Control.Arrow (second) import System.Directory+import System.Exit import System.FilePath+import System.Process import Data.Text (Text)-import qualified Data.Text as T-import qualified Data.Text.IO as T-import qualified Data.Text.Encoding as E-import qualified Data.ByteString as BS+import qualified Data.Text as T+#ifdef COUNT_CLUSTERS+import qualified Data.Text.ICU as ICU+#endif+import qualified Data.Text.IO as T+import qualified Data.Text.Lazy as L+import qualified Data.Text.Lazy.Encoding as E+import qualified Data.ByteString.Lazy as BS -import qualified Data.IntMap as IntMap-import qualified Data.List as List+import Data.HashSet (HashSet)+import qualified Data.HashSet as Set+import qualified Data.IntMap as IntMap+import qualified Data.List as List import Paths_Agda @@ -31,16 +41,18 @@ import Agda.Syntax.Common import Agda.Syntax.Concrete (TopLevelModuleName, moduleNameParts, projectRoot)+import Agda.Syntax.Parser.Literate (literateTeX, LayerRole, atomizeLayers)+import qualified Agda.Syntax.Parser.Literate as L+import Agda.Syntax.Position (startPos) import qualified Agda.Interaction.FindFile as Find import Agda.Interaction.Highlighting.Precise import Agda.TypeChecking.Monad (TCM, Interface(..)) import qualified Agda.TypeChecking.Monad as TCM import Agda.Interaction.Options+ (optGHCiInteraction, optLaTeXDir, optCountClusters) import Agda.Compiler.CallCompiler import qualified Agda.Utils.IO.UTF8 as UTF8-import Agda.Utils.FileName (filePath)--import Agda.Utils.Except ( ExceptT, MonadError(throwError), runExceptT )+import Agda.Utils.FileName (filePath, AbsolutePath, mkAbsolute) #include "undefined.h" import Agda.Utils.Impossible@@ -53,15 +65,66 @@ -- or not, the reader part isn't used, the writer is where the output -- goes and the state is for keeping track of the tokens and some other -- useful info, and the I/O part is used for printing debugging info.-type LaTeX = ExceptT String (RWST () Text State IO) +type LaTeX = RWST () [Output] State IO++-- | Output items.++data Output+ = Text !Text+ -- ^ A piece of text.+ | MaybeColumn !AlignmentColumn+ -- ^ A column. If it turns out to be an indentation column that is+ -- not used to indent or align something, then no column will be+ -- generated, only whitespace ('agdaSpace').+ deriving Show++-- | Column kinds.++data Kind+ = Indentation+ -- ^ Used only for indentation (the placement of the first token+ -- on a line, relative to tokens on previous lines).+ | Alignment+ -- ^ Used both for indentation and for alignment.+ deriving (Eq, Show)++-- | Unique identifiers for indentation columns.++type IndentationColumnId = Int++-- | Alignment and indentation columns.++data AlignmentColumn = AlignmentColumn+ { columnCodeBlock :: !Int+ -- ^ The column's code block.+ , columnColumn :: !Int+ -- ^ The column number.+ , columnKind :: Maybe IndentationColumnId+ -- ^ The column kind. 'Nothing' for alignment columns and @'Just'+ -- i@ for indentation columns, where @i@ is the column's unique+ -- identifier.+ } deriving Show+ data State = State- { tokens :: Tokens- , column :: !Int -- ^ Column number, used for polytable alignment.- , indent :: !Int -- ^ Indentation level, also for alignment.- , indentPrev :: !Int- , inCode :: !Bool -- ^ Keeps track of whether we are in a code- -- block or not.+ { codeBlock :: !Int -- ^ The number of the current code block.+ , column :: !Int -- ^ The current column number.+ , columns :: [AlignmentColumn]+ -- ^ All alignment columns found on the+ -- current line (so far), in reverse+ -- order.+ , columnsPrev :: [AlignmentColumn]+ -- ^ All alignment columns found in+ -- previous lines (in any code block),+ -- with larger columns coming first.+ , nextId :: !IndentationColumnId+ -- ^ The next indentation column+ -- identifier.+ , usedColumns :: HashSet IndentationColumnId+ -- ^ Indentation columns that have+ -- actually+ -- been used.+ , countClusters :: !Bool -- ^ Count extended grapheme clusters? } type Tokens = [Token]@@ -69,12 +132,12 @@ data Token = Token { text :: !Text , info :: Aspects- , position :: !Int -- ^ Is not used currently, but could- -- potentially be used for hyperlinks as in- -- the HTML output? } deriving Show +withTokenText :: (Text -> Text) -> Token -> Token+withTokenText f tok@Token{text = t} = tok{text = f t}+ data Debug = MoveColumn | NonCode | Code | Spaces | Output deriving (Eq, Show) @@ -84,21 +147,42 @@ debugs = [] -- | Run function for the @LaTeX@ monad.-runLaTeX :: LaTeX a -> () -> State -> IO (Either String a, State, Text)-runLaTeX = runRWST . runExceptT+runLaTeX ::+ LaTeX a -> () -> State -> IO (a, State, [Output])+runLaTeX = runRWST -emptyState :: State-emptyState = State- { tokens = []- , column = 0- , indent = 0- , indentPrev = 0- , inCode = False+emptyState+ :: Bool -- ^ Count extended grapheme clusters?+ -> State+emptyState cc = State+ { codeBlock = 0+ , column = 0+ , columns = []+ , columnsPrev = []+ , nextId = 0+ , usedColumns = Set.empty+ , countClusters = cc } ------------------------------------------------------------------------ -- * Some helpers. +-- | Gives the size of the string. If cluster counting is enabled,+-- then the number of extended grapheme clusters is computed (the root+-- locale is used), and otherwise the number of code points.++size :: Text -> LaTeX Int+size t = do+ cc <- countClusters <$> get+ if cc then+#ifdef COUNT_CLUSTERS+ return $ length $ ICU.breaks (ICU.breakCharacter ICU.Root) t+#else+ __IMPOSSIBLE__+#endif+ else+ return $ T.length t+ (<+>) :: Text -> Text -> Text (<+>) = T.append @@ -117,112 +201,121 @@ Nothing -> Nothing Just (pre, suf) -> Just (T.reverse suf, T.reverse pre) +-- | Does the string consist solely of whitespace?+ isSpaces :: Text -> Bool isSpaces = T.all isSpace -isActualSpaces :: Text -> Bool-isActualSpaces = T.all (== ' ')+-- | Is the character a whitespace character distinct from '\n'? --- | Yields the next token, taking special care to begin/end code--- blocks. Junk occuring before and after the code blocks is separated--- into separate tokens, this makes it easier to keep track of whether--- we are in a code block or not.-nextToken' :: LaTeX Token-nextToken' = do- toks <- gets tokens- case toks of- [] -> throwError "Done"+isSpaceNotNewline :: Char -> Bool+isSpaceNotNewline c = isSpace c && c /= '\n' - -- Clean begin/end code block or a LaTeX comment.- t : ts | text t == beginCode || text t == endCode ||- T.singleton '%' == T.take 1 (T.stripStart (text t)) -> do+-- | Replaces all forms of whitespace, except for new-line characters,+-- with spaces. - modify $ \s -> s { tokens = ts }- return t+replaceSpaces :: Text -> Text+replaceSpaces = T.map (\c -> if isSpaceNotNewline c then ' ' else c) - t : ts -> do- modify $ \s -> s { tokens = ts } - inCode <- gets inCode- let code = if inCode then endCode else beginCode-- case code `isInfixOf'` text t of- Nothing -> do-- -- Spaces take care of their own column tracking.- unless (isSpaces (text t)) $ do- log MoveColumn $ text t- moveColumn $ T.length $ text t-- return t-- Just (pre, suf) -> do-- let (textToReturn, textsToPutBack) =+-- | Yields the next token, taking special care to begin/end code+-- blocks. Junk occuring before and after the code blocks is separated+-- into separate tokens, this makes it easier to keep track of whether+-- we are in a code block or not.+moveColumnForToken :: Token -> LaTeX ()+moveColumnForToken t = do+ unless (isSpaces (text t)) $ do+ log MoveColumn $ text t+ moveColumn =<< size (text t) - -- This bit fixes issue 954.+-- | Merges 'columns' into 'columnsPrev', resets 'column' and+-- 'columns' - -- Drop spaces up until and including the first trailing- -- newline after begin code blocks.- if code == beginCode && isSpaces suf- then case T.singleton '\n' `isInfixOf'` suf of- Nothing -> (pre, [ beginCode ])- Just (_, suf') -> (pre, [ beginCode, suf' ])+resetColumn :: LaTeX ()+resetColumn = modify $ \s ->+ s { column = 0+ , columnsPrev = merge (columns s) (columnsPrev s)+ , columns = []+ }+ where+ -- Remove shadowed columns from old.+ merge [] old = old+ merge new old = new ++ filter ((< leastNew) . columnColumn) old+ where+ leastNew = columnColumn (last new) - -- Do the converse thing for end code blocks.- else if code == endCode && isSpaces pre- then case T.singleton '\n' `isInfixOfRev` pre of- Nothing -> (code, [ suf ])- Just (pre', suf') ->- (pre' <+> T.dropWhile (`elem` [' ', '\t']) suf',- [ code, suf ])+moveColumn :: Int -> LaTeX ()+moveColumn i = modify $ \s -> s { column = i + column s } - -- This case happens for example when you have two code- -- blocks after each other, i.e. the begin code of the- -- second ends up in the suffix of the first's end code.- else (pre, [ code, suf ])+-- | Registers a column of the given kind. The column is returned. - let tokToReturn = t { text = textToReturn }- let toksToPutBack = map (\txt -> t { text = txt }) textsToPutBack+registerColumn :: Kind -> LaTeX AlignmentColumn+registerColumn kind = do+ column <- gets column+ codeBlock <- gets codeBlock+ kind <- case kind of+ Alignment -> return Nothing+ Indentation -> do+ nextId <- gets nextId+ modify $ \s -> s { nextId = succ nextId }+ return (Just nextId)+ let c = AlignmentColumn { columnColumn = column+ , columnCodeBlock = codeBlock+ , columnKind = kind+ }+ modify $ \s -> s { columns = c : columns s }+ return c - unless (isSpaces pre) $ do- log MoveColumn pre- moveColumn $ T.length pre+-- | Registers the given column as used (if it is an indentation+-- column). - modify $ \s -> s { tokens = toksToPutBack ++ tokens s }- return tokToReturn+useColumn :: AlignmentColumn -> LaTeX ()+useColumn c = case columnKind c of+ Nothing -> return ()+ Just i -> modify $ \s ->+ s { usedColumns = Set.insert i (usedColumns s) } -nextToken :: LaTeX Text-nextToken = text `fmap` nextToken'+-- | Alignment column zero in the current code block. -resetColumn :: LaTeX ()-resetColumn = modify $ \s -> s { column = 0 }+columnZero :: LaTeX AlignmentColumn+columnZero = do+ codeBlock <- gets codeBlock+ return $ AlignmentColumn { columnColumn = 0+ , columnCodeBlock = codeBlock+ , columnKind = Nothing+ } -moveColumn :: Int -> LaTeX ()-moveColumn i = modify $ \s -> s { column = i + column s }+-- | Registers column zero as an alignment column. -setIndent :: Int -> LaTeX ()-setIndent i = modify $ \s -> s { indent = i }+registerColumnZero :: LaTeX ()+registerColumnZero = do+ c <- columnZero+ modify $ \s -> s { columns = [c] } -resetIndent :: LaTeX ()-resetIndent = modify $ \s -> s { indent = 0 }+-- | Changes to the state that are performed at the start of a code+-- block. -setIndentPrev :: Int -> LaTeX ()-setIndentPrev i = modify $ \s -> s { indentPrev = i }+-- This code is based on the assumption that there are no+-- non-whitespace characters following \begin{code}. For occurrences+-- of \begin{code} which start a code block this is true. However, the+-- LaTeX backend does not identify code blocks correctly, see Issue+-- #2400. -resetIndentPrev :: LaTeX ()-resetIndentPrev = modify $ \s -> s { indentPrev = 0 }+enterCode :: LaTeX ()+enterCode = do+ resetColumn+ modify $ \s -> s { codeBlock = codeBlock s + 1 } -setInCode :: LaTeX ()-setInCode = modify $ \s -> s { inCode = True }+-- | Changes to the state that are performed at the end of a code+-- block. -unsetInCode :: LaTeX ()-unsetInCode = modify $ \s -> s { inCode = False }+leaveCode :: LaTeX ()+leaveCode = return () logHelper :: Debug -> Text -> [String] -> LaTeX () logHelper debug text extra = when (debug `elem` debugs) $ do- lift $ lift $ T.putStrLn $ T.pack (show debug ++ ": ") <+>+ lift $ T.putStrLn $ T.pack (show debug ++ ": ") <+> T.pack "'" <+> text <+> T.pack "' " <+> if null extra then T.empty@@ -230,21 +323,21 @@ log :: Debug -> Text -> LaTeX () log MoveColumn text = do- ind <- gets indent- logHelper MoveColumn text ["ind=", show ind]+ cols <- gets columns+ logHelper MoveColumn text ["columns=", show cols] log Code text = do- ind <- gets indent+ cols <- gets columns col <- gets column- logHelper Code text ["ind=", show ind, "col=", show col]+ logHelper Code text ["columns=", show cols, "col=", show col] log debug text = logHelper debug text [] log' :: Debug -> String -> LaTeX () log' d = log d . T.pack -output :: Text -> LaTeX ()-output text = do- log Output text- tell text+output :: Output -> LaTeX ()+output item = do+ log' Output (show item)+ tell [item] ------------------------------------------------------------------------ -- * LaTeX and polytable strings.@@ -257,118 +350,154 @@ beginCode = T.pack "\\begin{code}" endCode = T.pack "\\end{code}" -ptOpen :: Text-ptOpen = T.pack "\\>"+-- | A command that is used when two tokens are put next to each other+-- in the same column. -ptOpen' :: Show a => a -> Text-ptOpen' i = ptOpen <+> T.pack ("[" ++ show i ++ "]")+agdaSpace :: Text+agdaSpace = cmdPrefix <+> T.pack "Space" <+> cmdArg T.empty <+> nl +-- | The column's name.+--+-- Indentation columns have unique names, distinct from all alignment+-- column names.++columnName :: AlignmentColumn -> Text+columnName c = T.pack $ case columnKind c of+ Nothing -> show (columnColumn c)+ Just i -> show i ++ "I"++-- | Opens a column with the given name.++ptOpen' :: Text -> Text+ptOpen' name = T.pack "\\>[" <+> name <+> T.singleton ']'++-- | Opens the given column.++ptOpen :: AlignmentColumn -> Text+ptOpen c = ptOpen' (columnName c)++-- | Opens a special column that is only used at the beginning of+-- lines.++ptOpenBeginningOfLine :: Text+ptOpenBeginningOfLine = ptOpen' (T.pack ".")++-- | Opens the given column, and inserts an indentation instruction+-- with the given argument at the end of it.++ptOpenIndent+ :: AlignmentColumn+ -> Int -- ^ Indentation instruction argument.+ -> Text+ptOpenIndent c delta =+ ptOpen c <+> T.pack "[@{}l@{"+ <+> cmdPrefix+ <+> T.pack "Indent"+ <+> cmdArg (T.pack $ show delta)+ <+> T.pack "}]"+ ptClose :: Text ptClose = T.pack "\\<" -ptClose' :: Show a => a -> Text-ptClose' i = ptClose <+> T.pack ("[" ++ show i ++ "]")+ptClose' :: AlignmentColumn -> Text+ptClose' c =+ ptClose <+> T.singleton '[' <+> columnName c <+> T.singleton ']' ptNL :: Text ptNL = nl <+> T.pack "\\\\\n" +ptEmptyLine :: Text+ptEmptyLine =+ nl <+> T.pack "\\\\["+ <+> cmdPrefix+ <+> T.pack "EmptyExtraSkip"+ <+> T.pack "]%\n"+ cmdPrefix :: Text cmdPrefix = T.pack "\\Agda" cmdArg :: Text -> Text cmdArg x = T.singleton '{' <+> x <+> T.singleton '}' -cmdIndent :: Show a => a -> Text-cmdIndent i = cmdPrefix <+> T.pack "Indent" <+>- cmdArg (T.pack (show i)) <+> cmdArg T.empty----- Andreas, 2016-09-08, issue #2140:--- The following special treatment of infix declarations seems--- superfluous (and does the wrong thing with the fix for #2140):---- infixl', infix', infixr' :: Text--- infixl' = T.pack "infixl"--- infix' = T.pack "infix"--- infixr' = T.pack "infixr"- ------------------------------------------------------------------------ -- * Automaton. -- | The start state, @nonCode@, prints non-code (the LaTeX part of--- literate Agda) until it sees a @beginBlock@.-nonCode :: LaTeX ()-nonCode = do- tok <- nextToken- log NonCode tok-- if tok == beginCode+-- literate Agda) until it sees a @beginBlock@.+processLayers :: [(LayerRole, Tokens)] -> LaTeX ()+processLayers = mapM_ $ \(layerRole,toks) -> do+ case layerRole of+ L.Markup -> processMarkup toks+ L.Comment -> processComment toks+ L.Code -> processCode toks - then do- output $ beginCode <+> nl- resetColumn- setInCode- code+processMarkup, processComment, processCode :: Tokens -> LaTeX ()+-- | Deals with markup+processMarkup = mapM_ moveColumnForToken - else do- output tok- nonCode+-- | Deals with literate text, which is output verbatim+processComment = mapM_ $ \t -> do+ unless (T.singleton '%' == T.take 1 (T.stripStart (text t))) $ do+ moveColumnForToken t+ output (Text (text t)) -- | Deals with code blocks. Every token, except spaces, is pretty -- printed as a LaTeX command.-code :: LaTeX ()-code = do-- -- Get the column information before grabbing the token, since- -- grabbing (possibly) moves the column.- col <- gets column-- tok' <- nextToken'- let tok = text tok'- log Code tok-- when (tok == T.empty) code-- when (col == 0 && not (isActualSpaces tok)) $ do- output ptOpen-- when (tok == endCode) $ do- output $ ptClose <+> nl <+> endCode- unsetInCode- nonCode-- -- Andreas, 2016-09-08, issue #2140:- -- The following special treatment of infix declarations seems- -- superfluous (and does the wrong thing with the fix for #2140):+processCode toks' = do+ output $ Text $ beginCode <+> nl+ enterCode+ mapM_ go toks'+ ptOpenWhenColumnZero =<< gets column+ output $ Text $ ptClose <+> nl <+> endCode+ leaveCode - -- when (tok `elem` [ infixl', infix', infixr' ]) $ do- -- output $ cmdPrefix <+> T.pack "Keyword" <+> cmdArg tok- -- fixity- -- code+ where+ go tok' = do+ -- Get the column information before grabbing the token, since+ -- grabbing (possibly) moves the column.+ col <- gets column - when (isSpaces tok) $ do- spaces $ T.group tok- code+ moveColumnForToken tok'+ let tok = text tok'+ log Code tok - case aspect (info tok') of- Nothing -> output $ escape tok- Just a -> output $ cmdPrefix <+> T.pack (cmd a) <+> cmdArg (escape tok)+ if (tok == T.empty) then return ()+ else do+ if (isSpaces tok) then do+ spaces $ T.group $ replaceSpaces tok+ else do+ ptOpenWhenColumnZero col+ case aspect (info tok') of+ Nothing -> output $ Text $ escape tok+ Just a -> output $ Text $+ cmdPrefix <+> T.pack (cmd a) <+> cmdArg (escape tok) - code+ -- Non-whitespace tokens at the start of a line trigger an+ -- alignment column.+ ptOpenWhenColumnZero col =+ when (col == 0) $ do+ registerColumnZero+ output . Text . ptOpen =<< columnZero - where- cmd :: Aspect -> String- cmd a = let s = show a in case a of- Comment -> s- Keyword -> s- String -> s- Number -> s- Symbol -> s- PrimitiveType -> s- Name mKind _ -> maybe __IMPOSSIBLE__ showKind mKind- where- showKind :: NameKind -> String- showKind n = let s = show n in case n of+ cmd :: Aspect -> String+ cmd a = let s = show a in case a of+ Comment -> s+ Option -> s+ Keyword -> s+ String -> s+ Number -> s+ Symbol -> s+ PrimitiveType -> s+ Name Nothing isOp -> cmd (Name (Just Postulate) isOp)+ -- At the time of writing the case above can be encountered in+ -- --only-scope-checking mode, for instance for the token "Size"+ -- in the following code:+ --+ -- {-# BUILTIN SIZE Size #-}+ --+ -- The choice of "Postulate" works for this example, but might+ -- be less appropriate for others.+ Name (Just kind) _ -> case kind of Bound -> s Constructor Inductive -> "InductiveConstructor" Constructor CoInductive -> "CoinductiveConstructor"@@ -381,6 +510,8 @@ Record -> s Argument -> s Macro -> s+ where+ s = show kind -- Escapes special characters. escape :: Text -> Text@@ -399,142 +530,81 @@ '~' -> "\\textasciitilde{}" '^' -> "\\textasciicircum{}" '\\' -> "\\textbackslash{}"- -- Escaping newlines seems to fix the problem caused by pattern- -- synonyms.- '\n' -> "\\<\\\\\n\\>"+ '-' -> "{-}" _ -> [ c ] escape _ = __IMPOSSIBLE__ ---- Andreas, 2016-09-08, issue #2140:--- The following special treatment of infix declarations seems--- superfluous (and does the wrong thing with the fix for #2140):---- -- | Fixity declarations need a special treatment. The operations in--- -- declarations like:--- ----- -- infix num op1 op2 op3--- ----- -- are treated as comments and thus grouped together with the newlines--- -- that follow, which results incorrect LaTeX output -- the following--- -- state remedies the problem by breaking on newlines.--- fixity :: LaTeX ()--- fixity = do--- tok <- nextToken---- case T.breakOn (T.pack "\n") tok of---- -- Spaces.--- (sps, nls) | nls == T.empty && isSpaces sps -> do--- spaces $ T.group sps--- fixity---- -- Fixity level.--- (num, nls) | nls == T.empty -> do--- output $ cmdPrefix <+> T.pack "Number" <+> cmdArg num--- fixity---- -- Operations followed by newlines.--- (ops, nls) | otherwise -> do--- output $ (T.pack " " <+>) $ T.unwords $ map ((cmdPrefix <+> T.pack "FixityOp" <+>) . cmdArg . escape) $ T.words ops--- spaces (T.group nls)----- | Spaces are grouped before processed, because multiple consecutive--- spaces determine the alignment of the code and consecutive newline--- characters need special treatment as well.+-- | Every element in the list should consist of either one or more+-- newline characters, or one or more space characters. Two adjacent+-- list elements must not contain the same character.+--+-- If the final element of the list consists of spaces, then these+-- spaces are assumed to not be trailing whitespace. spaces :: [Text] -> LaTeX ()-spaces [] = return ()-spaces ((T.uncons -> Nothing) : ss) = __IMPOSSIBLE__+spaces [] = return () --- Single spaces are ignored.-spaces ((T.uncons -> Just (' ', s)) : []) | T.null s = do+-- Newlines.+spaces (s@(T.uncons -> Just ('\n', _)) : ss) = do col <- gets column- when (col == 0) $ do- output ptOpen-- moveColumn 1- output $ T.singleton ' '+ when (col == 0) $+ output . Text . ptOpen =<< columnZero+ output $ Text $ ptClose <+> ptNL <+>+ T.replicate (T.length s - 1) ptEmptyLine+ resetColumn+ spaces ss --- Multiple spaces.-spaces (s@(T.uncons -> Just (' ', _)) : ss) = do- let len = T.length s+-- Spaces followed by a newline character.+spaces (_ : ss@(_ : _)) = spaces ss +-- Spaces that are not followed by a newline character.+spaces [ s ] = do col <- gets column- moveColumn len - if col /= 0-- then do- log' Spaces "col /= 0"- output $ T.singleton ' '- col <- gets column- output $ ptClose' col <+> nl <+> ptOpen' col-- else do- log' Spaces "col == 0"- indent <- gets indent- indentPrev <- gets indentPrev-- case compare len indent of-- GT -> do- log' Spaces "GT"- setIndent len- setIndentPrev indent- output $ ptOpen' indent- output $ cmdIndent len- output $ ptClose' len <+> nl <+> ptOpen' len-- EQ -> do- log' Spaces "EQ"- output $ ptOpen' indentPrev- output $ cmdIndent len- output $ ptClose' len <+> nl <+> ptOpen' len+ let len = T.length s+ kind = if col /= 0 && len == 1+ then Indentation+ else Alignment - LT -> do- log' Spaces "LT"- setIndent len- resetIndentPrev- output $ ptOpen' 0- output $ cmdIndent len- output $ ptClose' len <+> nl <+> ptOpen' len+ moveColumn len+ column <- registerColumn kind - spaces ss+ if col /= 0+ then log' Spaces "col /= 0"+ else do+ columns <- gets columnsPrev+ codeBlock <- gets codeBlock --- Newlines.-spaces (s@(T.uncons -> Just ('\n', _)) : ss) = do- resetColumn- output $ ptClose <+> T.replicate (T.length s) ptNL- spaces ss+ log' Spaces $+ "col == 0: " ++ show (len, columns) --- Treat tabs and non-standard spaces as if they were spaces--- [Issue_#2019].-spaces (s@(T.uncons -> Just (c, _)) : ss)- | isSpace c && (c /= '\n') =- spaces $ T.replicate (T.length s) (T.singleton ' ') : ss- | otherwise = __IMPOSSIBLE__+ case filter ((<= len) . columnColumn) columns of+ c : _ | columnColumn c == len, isJust (columnKind c) -> do+ -- Align. (This happens automatically if the column is an+ -- alignment column, but c is an indentation column.)+ useColumn c+ output $ Text $ ptOpenBeginningOfLine+ output $ Text $ ptClose' c+ c : _ | columnColumn c < len -> do+ -- Indent.+ useColumn c+ output $ Text $ ptOpenIndent c (codeBlock - columnCodeBlock c)+ _ -> return () -spaces (_ : ss) = __IMPOSSIBLE__+ output $ MaybeColumn column -- Split multi-lines string literals into multiple string literals -- Isolating leading spaces for the alignment machinery to work -- properly stringLiteral :: Token -> Tokens stringLiteral t | aspect (info t) == Just String =- reverse $ snd $ foldl insertShifted (0, [])- $ concatMap leadingSpaces- $ List.intersperse (T.pack "\n")- $ T.lines (text t) where-- leadingSpaces :: Text -> [Text]- leadingSpaces t = [pre, suf]- where (pre , suf) = T.span (== ' ') t-- insertShifted :: (Int, Tokens) -> Text -> (Int, Tokens)- insertShifted (i, xs) x =- let tx = t { text = x, position = position t + i }- in (i + T.length x, tx : xs)+ reverse $ foldl (\xs x -> t { text = x } : xs) []+ $ concatMap leadingSpaces+ $ List.intersperse (T.pack "\n")+ $ T.lines (text t)+ where+ leadingSpaces :: Text -> [Text]+ leadingSpaces t = [pre, suf]+ where (pre , suf) = T.span isSpaceNotNewline t stringLiteral t = [t] @@ -544,7 +614,11 @@ defaultStyFile :: String defaultStyFile = "agda.sty" --- | The only exported function.+-- | Generates a LaTeX file for the given interface.+--+-- The underlying source file is assumed to match the interface, but+-- this is not checked. TODO: Fix this problem, perhaps by storing the+-- source code in the interface. generateLaTeX :: Interface -> TCM () generateLaTeX i = do let mod = toTopLevelModuleName $ iModuleName i@@ -560,19 +634,14 @@ </> optLaTeXDir options liftIO $ createDirectoryIfMissing True dir - TCM.reportSLn "latex" 1 $ unlines- [ ""- , "Checking if " ++ defaultStyFile ++ " is found by the LaTeX environment."- ]-- merrors <- callCompiler' "kpsewhich" [ "--path=" ++ dir, defaultStyFile ]+ (code, _, _) <- liftIO $ readProcessWithExitCode+ "kpsewhich" [ "--path=" ++ dir, defaultStyFile ] "" - when (isJust merrors) $ do- TCM.reportSLn "latex" 1 $ unlines- [ ""- , defaultStyFile ++ " was not found. Copying a default version of " +++ when (code /= ExitSuccess) $ do+ TCM.reportSLn "compile.latex" 1 $ unlines+ [ defaultStyFile ++ " was not found. Copying a default version of " ++ defaultStyFile- , "into the directory " ++ dir ++ "."+ , "into " ++ dir ++ "." ] liftIO $ do@@ -584,7 +653,9 @@ liftIO $ do source <- UTF8.readTextFile inAbsPath- latex <- E.encodeUtf8 `fmap` toLaTeX source hi+ latex <- E.encodeUtf8 `fmap`+ toLaTeX (optCountClusters options)+ (mkAbsolute inAbsPath) source hi createDirectoryIfMissing True $ dir </> takeDirectory outPath BS.writeFile (dir </> outPath) latex @@ -592,41 +663,111 @@ modToFile :: TopLevelModuleName -> FilePath modToFile m = List.intercalate [pathSeparator] (moduleNameParts m) <.> "tex" +groupByFst :: forall a b. Eq a => [(a,b)] -> [(a,[b])]+groupByFst =+ map (\xs -> case xs of -- Float the grouping to the top level+ [] -> __IMPOSSIBLE__+ (tag, _): _ -> (tag, map snd xs))++ . List.groupBy ((==) `on` fst) -- Group together characters in the same+ -- role.+ -- | Transforms the source code into LaTeX.-toLaTeX :: String -> HighlightingInfo -> IO Text-toLaTeX source hi+toLaTeX+ :: Bool+ -- ^ Count extended grapheme clusters?+ -> AbsolutePath+ -> String+ -> HighlightingInfo+ -> IO L.Text+toLaTeX cc path source hi - = processTokens+ = processTokens cc - . concatMap stringLiteral+ . map (\(role, tokens) -> (role,) $+ -- This bit fixes issue 954+ (if L.isCode role then+ -- Remove trailing whitespace from the+ -- final line; the function spaces+ -- expects trailing whitespace to be+ -- followed by a newline character.+ whenMoreThanOne+ (withLast $+ withTokenText $ \suf ->+ fromMaybe suf $+ fmap (T.dropWhileEnd isSpaceNotNewline) $+ T.stripSuffix (T.singleton '\n') suf)+ .+ (withLast $ withTokenText $ T.dropWhileEnd isSpaceNotNewline)+ .+ (withFirst $+ withTokenText $ \pre ->+ fromMaybe pre $+ T.stripPrefix (T.singleton '\n') $+ T.dropWhile isSpaceNotNewline pre)+ else+ -- do nothing+ id) tokens) - -- Head the list (the grouped chars contain the same meta info) and- -- collect the characters into a string.- . map (\xs -> case xs of- (mi, (pos, _)) : _ ->- Token { text = T.pack $ map (\(_, (_, c)) -> c) xs- , info = fromMaybe mempty mi- , position = pos- }- [] -> __IMPOSSIBLE__)+ . map (second (+ -- Split tokens at newlines+ concatMap stringLiteral - . List.groupBy ((==) `on` fst) -- Characters which share the same- -- meta info are the same token, so- -- group them together.+ -- Head the list (the grouped chars contain the same meta info) and+ -- collect the characters into a string.+ . map (\(mi, cs) ->+ Token { text = T.pack cs+ , info = fromMaybe mempty mi+ })+ -- Characters which share the same meta info are the same token, so+ -- group them together.+ . groupByFst+ )) + -- Characters in different layers belong to different tokens+ . groupByFst+ -- Look up the meta info at each position in the highlighting info.- . map (\(pos, char) ->- (IntMap.lookup pos infoMap, (pos, char)))+ . map (\(pos, (role, char)) -> (role, (IntMap.lookup pos infoMap, char))) -- Add position in file to each character. . zip [1..]++ -- Map each character to its role+ . atomizeLayers . literateTeX (startPos (Just path))+ $ source where infoMap = toMap (decompress hi) -processTokens :: Tokens -> IO Text-processTokens ts = do- (x, _, s) <- runLaTeX nonCode () (emptyState { tokens = ts })- case x of- Left "Done" -> return s- _ -> __IMPOSSIBLE__+ -- | This function preserves laziness of the list+ withLast :: (a -> a) -> [a] -> [a]+ withLast f [] = []+ withLast f [a] = [f a]+ withLast f (a:as) = a:withLast f as++ -- | This function preserves laziness of the list+ withFirst :: (a -> a) -> [a] -> [a]+ withFirst _ [] = []+ withFirst f (a:as) = f a:as++ whenMoreThanOne :: ([a] -> [a]) -> [a] -> [a]+ whenMoreThanOne f xs@(_:_:_) = f xs+ whenMoreThanOne _ xs = xs++++processTokens+ :: Bool+ -- ^ Count extended grapheme clusters?+ -> [(LayerRole, Tokens)]+ -> IO L.Text+processTokens cc ts = do+ ((), s, os) <- runLaTeX (processLayers ts) () (emptyState cc)+ return $ L.fromChunks $ map (render s) os+ where+ render _ (Text s) = s+ render s (MaybeColumn c)+ | Just i <- columnKind c,+ not (Set.member i (usedColumns s)) = agdaSpace+ | otherwise = nl <+> ptOpen c
src/full/Agda/Interaction/Highlighting/Precise.hs view
@@ -8,6 +8,7 @@ , NameKind(..) , OtherAspect(..) , Aspects(..)+ , DefinitionSite(..) , File(..) , HighlightingInfo -- ** Creation@@ -38,7 +39,7 @@ import Agda.Utils.String import Agda.Utils.List import Data.Maybe-import Data.List+import qualified Data.List as List import Data.Function import Data.Semigroup import Control.Applicative ((<$>), (<*>))@@ -63,6 +64,7 @@ data Aspect = Comment+ | Option | Keyword | String | Number@@ -71,7 +73,7 @@ | Name (Maybe NameKind) Bool -- ^ Is the name an operator part? deriving (Eq, Show, Typeable) --- | @NameKind@s are figured our during scope checking.+-- | @NameKind@s are figured out during scope checking. data NameKind = Bound -- ^ Bound variable.@@ -99,9 +101,12 @@ -- could for instance be an emptyness constraint. | TerminationProblem | PositivityProblem+ | ReachabilityProblem+ | CoverageProblem | IncompletePattern -- ^ When this constructor is used it is probably a good idea to -- include a 'note' explaining why the pattern is incomplete.+ | CatchallClause | TypeChecks -- ^ Code which is being type-checked. deriving (Eq, Show, Enum, Bounded, Typeable)@@ -117,14 +122,29 @@ -- something like that. It should contain useful information about -- the range (like the module containing a certain identifier, or -- the fixity of an operator).- , definitionSite :: Maybe (SC.TopLevelModuleName, Int)+ , definitionSite :: Maybe DefinitionSite -- ^ The definition site of the annotated thing, if applicable and -- known. File positions are counted from 1. } deriving (Show, Typeable) +data DefinitionSite = DefinitionSite+ { defSiteModule :: SC.TopLevelModuleName+ -- ^ The defining module.+ , defSitePos :: Int+ -- ^ The file position in that module.+ , defSiteHere :: Bool+ -- ^ Has this @DefinitionSite@ been created at the defining site of the name?+ , defSiteAnchor :: Maybe String+ -- ^ A pretty name for the HTML linking.+ }+ deriving (Show, Typeable)++instance Eq DefinitionSite where+ DefinitionSite m p _ _ == DefinitionSite m' p' _ _ = m == m' && p == p'+ instance Eq Aspects where- Aspects a o _ d == Aspects a' o' _ d' = (a, nub o, d) == (a', nub o', d')+ Aspects a o _ d == Aspects a' o' _ d' = (a, List.nub o, d) == (a', List.nub o', d') -- | A 'File' is a mapping from file positions to meta information. --@@ -160,7 +180,7 @@ mergeAspects :: Aspects -> Aspects -> Aspects mergeAspects m1 m2 = Aspects { aspect = (mplus `on` aspect) m1 m2- , otherAspects = nub $ ((++) `on` otherAspects) m1 m2+ , otherAspects = List.nub $ ((++) `on` otherAspects) m1 m2 , note = case (note m1, note m2) of (Just n1, Just n2) -> Just $ if n1 == n2@@ -310,7 +330,7 @@ ) where [(a, ma), (b, _), (c, _), (d, md)] =- sortBy (compare `on` fst)+ List.sortBy (compare `on` fst) [(from i1, m1), (to i1, m1), (from i2, m2), (to i2, m2)] fix = filter (not . empty . fst)
src/full/Agda/Interaction/Highlighting/Range.hs view
@@ -17,7 +17,6 @@ ) where import Control.Applicative ((<$>))-import Data.List import Data.Typeable (Typeable) import qualified Agda.Syntax.Position as P
src/full/Agda/Interaction/Imports.hs view
@@ -24,7 +24,7 @@ import qualified Data.List as List import qualified Data.Set as Set import qualified Data.Foldable as Fold (toList)-import Data.List hiding (null)+import qualified Data.List as List import Data.Maybe import Data.Monoid (mempty, mappend) import Data.Map (Map)@@ -47,6 +47,7 @@ import Agda.Syntax.Internal import Agda.TypeChecking.Errors+import Agda.TypeChecking.Warnings import Agda.TypeChecking.Reduce import Agda.TypeChecking.MetaVars ( openMetasToPostulates ) import Agda.TypeChecking.Monad@@ -54,7 +55,6 @@ import Agda.TypeChecking.Telescope import Agda.TypeChecking.Primitive import Agda.TypeChecking.Pretty as P-import Agda.TypeChecking.Rewriting (killCtxId) import Agda.TypeChecking.DeadCode import qualified Agda.TypeChecking.Monad.Benchmark as Bench @@ -72,10 +72,11 @@ import Agda.Utils.FileName import Agda.Utils.Lens import Agda.Utils.Maybe+import qualified Agda.Utils.Maybe.Strict as Strict import Agda.Utils.Monad import Agda.Utils.Null import Agda.Utils.IO.Binary-import Agda.Utils.Pretty+import Agda.Utils.Pretty hiding (Mode) import Agda.Utils.Time import Agda.Utils.Hash import qualified Agda.Utils.HashMap as HMap@@ -84,13 +85,33 @@ #include "undefined.h" import Agda.Utils.Impossible +-- | Is the aim to type-check the top-level module, or only to+-- scope-check it?++data Mode+ = ScopeCheck+ | TypeCheck+ deriving (Eq, Show)+ -- | Are we loading the interface for the user-loaded file -- or for an import? data MainInterface- = MainInterface -- ^ Interface for main file.- | NotMainInterface -- ^ Interface for imported file.+ = MainInterface Mode -- ^ For the main file.+ --+ -- In this case state changes inflicted by+ -- 'createInterface' are preserved.+ | NotMainInterface -- ^ For an imported file.+ --+ -- In this case state changes inflicted by+ -- 'createInterface' are not preserved. deriving (Eq, Show) +-- | Should state changes inflicted by 'createInterface' be preserved?++includeStateChanges :: MainInterface -> Bool+includeStateChanges (MainInterface _) = True+includeStateChanges NotMainInterface = False+ -- | Merge an interface into the current proof state. mergeInterface :: Interface -> TCM () mergeInterface i = do@@ -98,6 +119,7 @@ builtin = Map.toList $ iBuiltin i prim = [ x | (_,Prim x) <- builtin ] bi = Map.fromList [ (x,Builtin t) | (x,Builtin t) <- builtin ]+ warns = iWarnings i bs <- gets stBuiltinThings reportSLn "import.iface.merge" 10 $ "Merging interface" reportSLn "import.iface.merge" 20 $@@ -112,7 +134,7 @@ Just b1 = Map.lookup b bs Just b2 = Map.lookup b bi mapM_ check (map fst $ Map.toList $ Map.intersection bs bi)- addImportedThings sig bi (iHaskellImports i) (iHaskellImportsUHC i) (iPatternSyns i) (iDisplayForms i)+ addImportedThings sig bi (iPatternSyns i) (iDisplayForms i) warns reportSLn "import.iface.merge" 20 $ " Rebinding primitives " ++ show prim mapM_ rebind prim@@ -123,16 +145,13 @@ addImportedThings :: Signature -> BuiltinThings PrimFun ->- Set String -> -- MAlonzo imoprts- Set String -> -- UHC backend imports- A.PatternSynDefns -> DisplayForms -> TCM ()-addImportedThings isig ibuiltin hsImports hsImportsUHC patsyns display = do- stImports %= \ imp -> unionSignatures [imp, over sigRewriteRules killCtxId isig]+ A.PatternSynDefns -> DisplayForms -> [TCWarning] -> TCM ()+addImportedThings isig ibuiltin patsyns display warnings = do+ stImports %= \ imp -> unionSignatures [imp, isig] stImportedBuiltins %= \ imp -> Map.union imp ibuiltin- stHaskellImports %= \ imp -> Set.union imp hsImports- stHaskellImportsUHC %= \ imp -> Set.union imp hsImportsUHC stPatternSynImports %= \ imp -> Map.union imp patsyns stImportedDisplayForms %= \ imp -> HMap.unionWith (++) imp display+ stTCWarnings %= \ imp -> List.union imp warnings addImportedInstances isig -- | Scope checks the given module. A proper version of the module@@ -144,7 +163,7 @@ verboseS "import.scope" 10 $ do visited <- Map.keys <$> getVisitedModules reportSLn "import.scope" 10 $- " visited: " ++ intercalate ", " (map prettyShow visited)+ " visited: " ++ List.intercalate ", " (map prettyShow visited) -- Since scopeCheckImport is called from the scope checker, -- we need to reimburse her account. i <- Bench.billTo [] $ getInterface x@@ -174,12 +193,14 @@ -- | If the module has already been visited (without warnings), then -- its interface is returned directly. Otherwise the computation is -- used to find the interface and the computed interface is stored for--- potential later use.+-- potential later use (unless the 'MainInterface' is @'MainInterface'+-- 'ScopeCheck'@). alreadyVisited :: C.TopLevelModuleName ->+ MainInterface -> TCM (Interface, MaybeWarnings) -> TCM (Interface, MaybeWarnings)-alreadyVisited x getIface = do+alreadyVisited x isMain getIface = do mm <- getVisitedModule x case mm of -- A module with warnings should never be allowed to be@@ -191,10 +212,11 @@ reportSLn "import.visit" 5 $ " Getting interface for " ++ prettyShow x r@(i, wt) <- getIface reportSLn "import.visit" 5 $ " Now we've looked at " ++ prettyShow x- visitModule $ ModuleInfo- { miInterface = i- , miWarnings = hasWarnings wt- }+ unless (isMain == MainInterface ScopeCheck) $+ visitModule $ ModuleInfo+ { miInterface = i+ , miWarnings = hasWarnings wt+ } return r -- | Type checks the main file of the interaction.@@ -203,9 +225,16 @@ -- -- First, the primitive modules are imported. -- Then, @getInterface'@ is called to do the main work.+--+-- If the 'Mode' is 'ScopeCheck', then type-checking is not+-- performed, only scope-checking. (This may include type-checking+-- of imported modules.) In this case the generated, partial+-- interface is not stored in the state ('stDecodedModules'). Note,+-- however, that if the file has already been type-checked, then a+-- complete interface is returned. -typeCheckMain :: AbsolutePath -> TCM (Interface, MaybeWarnings)-typeCheckMain f = do+typeCheckMain :: AbsolutePath -> Mode -> TCM (Interface, MaybeWarnings)+typeCheckMain f mode = do -- liftIO $ putStrLn $ "This is typeCheckMain " ++ prettyShow f -- liftIO . putStrLn . show =<< getVerbosity reportSLn "import.main" 10 $ "Importing the primitive modules."@@ -229,7 +258,7 @@ -- Now do the type checking via getInterface. m <- moduleName f- getInterface' m MainInterface+ getInterface' m (MainInterface mode) -- | Tries to return the interface associated to the given (imported) module. -- The time stamp of the relevant interface file is also returned.@@ -263,19 +292,17 @@ getInterface' :: C.TopLevelModuleName -> MainInterface- -- ^ If type checking is necessary,- -- should all state changes inflicted by 'createInterface' be preserved?- -- Yes, if we are the 'MainInterface'. No, if we are 'NotMainInterface'. -> TCM (Interface, MaybeWarnings) getInterface' x isMain = do withIncreasedModuleNestingLevel $ do- -- Preserve the pragma options unless includeStateChanges is True.+ -- Preserve the pragma options unless we are checking the main+ -- interface. bracket_ (use stPragmaOptions)- (unless includeStateChanges . setPragmaOptions) $ do+ (unless (includeStateChanges isMain) . setPragmaOptions) $ do -- Forget the pragma options (locally). setCommandLineOptions . stPersistentOptions . stPersistentState =<< get - alreadyVisited x $ addImportCycleCheck x $ do+ alreadyVisited x isMain $ addImportCycleCheck x $ do file <- findFile x -- requires source to exist reportSLn "import.iface" 10 $ " Check for cycle"@@ -305,9 +332,10 @@ -- let maySkip = isMain == NotMainInterface -- Andreas, 2015-07-13: Serialize iInsideScope again. let maySkip = True+ if uptodate && maySkip- then getStoredInterface x file includeStateChanges- else typeCheck x file includeStateChanges+ then getStoredInterface x file isMain+ else typeCheck x file isMain -- Ensure that the given module name matches the one in the file. let topLevelName = toTopLevelModuleName $ iModuleName i@@ -327,16 +355,15 @@ stCurrentModule .= Just (iModuleName i) - -- Interfaces are only stored if no warnings were encountered.- case wt of- SomeWarnings w -> return ()- NoWarnings -> storeDecodedModule i+ -- Interfaces are not stored if we are only scope-checking, or+ -- if any warnings were encountered.+ case (isMain, wt) of+ (MainInterface ScopeCheck, _) -> return ()+ (_, SomeWarnings w) -> return ()+ _ -> storeDecodedModule i return (i, wt) - where- includeStateChanges = isMain == MainInterface- -- | Check whether interface file exists and is in cache -- in the correct version (as testified by the interface file hash). @@ -364,7 +391,6 @@ return mi - -- | Try to get the interface from interface file or cache. getStoredInterface@@ -372,16 +398,13 @@ -- ^ Module name of file we process. -> AbsolutePath -- ^ File we process.- -> Bool- -- ^ If type checking is necessary,- -- should all state changes inflicted by 'createInterface' be preserved?- -- @True@, if we are the 'MainInterface'. @False@, if we are 'NotMainInterface'.+ -> MainInterface -> TCM (Bool, (Interface, MaybeWarnings)) -- ^ @Bool@ is: do we have to merge the interface?-getStoredInterface x file includeStateChanges = do+getStoredInterface x file isMain = do -- If something goes wrong (interface outdated etc.) -- we revert to fresh type checking.- let fallback = typeCheck x file includeStateChanges+ let fallback = typeCheck x file isMain -- Examine the hash of the interface file. If it is different from the -- stored version (in stDecodedModules), or if there is no stored version,@@ -421,7 +444,12 @@ -- liftIO close -- Close the interface file. See above. fallback else do- unless cached $ chaseMsg "Skipping" x $ Just ifile+ unless cached $ do+ chaseMsg "Loading " x $ Just ifile+ -- print imported warnings+ let ws = filter ((Strict.Just file ==) . tcWarningOrigin) (iWarnings i)+ unless (null ws) $ reportSDoc "warning" 1 $ P.vcat $ P.prettyTCM <$> ws+ -- We set the pragma options of the skipped file here, -- because if the top-level file is skipped we want the -- pragmas to apply to interactive commands in the UI.@@ -440,105 +468,107 @@ -- ^ Module name of file we process. -> AbsolutePath -- ^ File we process.- -> Bool- -- ^ If type checking is necessary,- -- should all state changes inflicted by 'createInterface' be preserved?- -- @True@, if we are the 'MainInterface'. @False@, if we are 'NotMainInterface'.+ -> MainInterface -> TCM (Bool, (Interface, MaybeWarnings)) -- ^ @Bool@ is: do we have to merge the interface?-typeCheck x file includeStateChanges = do- unless includeStateChanges cleanCachedLog- let withMsgs = bracket_- (chaseMsg "Checking" x $ Just $ filePath file)+typeCheck x file isMain = do+ unless (includeStateChanges isMain) cleanCachedLog+ let checkMsg = case isMain of+ MainInterface ScopeCheck -> "Reading "+ _ -> "Checking"+ withMsgs = bracket_+ (chaseMsg checkMsg x $ Just $ filePath file) (const $ do ws <- getAllWarnings' AllWarnings RespectFlags let (we, wa) = classifyWarnings ws- unless (null wa) $ reportSDoc "warning" 1- $ P.vcat $ P.prettyTCM <$> wa- unless (not $ null we) $ chaseMsg "Finished" x Nothing)+ let wa' = filter ((Strict.Just file ==) . tcWarningOrigin) wa+ unless (null wa') $+ reportSDoc "warning" 1 $ P.vcat $ P.prettyTCM <$> wa'+ when (null we) $ chaseMsg "Finished" x Nothing) -- Do the type checking. - if includeStateChanges then do- r <- withMsgs $ createInterface file x includeStateChanges-- -- Merge the signature with the signature for imported- -- things.- reportSLn "import.iface" 40 $ "Merging with state changes included."- sig <- getSignature- patsyns <- getPatternSyns- display <- use stImportsDisplayForms- addImportedThings sig Map.empty Set.empty Set.empty patsyns display- setSignature emptySignature- setPatternSyns Map.empty+ case isMain of+ MainInterface _ -> do+ r <- withMsgs $ createInterface file x isMain - return (True, r)- else do- ms <- getImportPath- nesting <- asks envModuleNestingLevel- range <- asks envRange- call <- asks envCall- mf <- use stModuleToSource- vs <- getVisitedModules- ds <- getDecodedModules- opts <- stPersistentOptions . stPersistentState <$> get- isig <- use stImports- ibuiltin <- use stImportedBuiltins- display <- use stImportsDisplayForms- ipatsyns <- getPatternSynImports- ho <- getInteractionOutputCallback- -- Every interface is treated in isolation. Note: Changes- -- to stDecodedModules are not preserved if an error is- -- encountered in an imported module.- -- Andreas, 2014-03-23: freshTCM spawns a new TCM computation- -- with initial state and environment- -- but on the same Benchmark accounts.- r <- freshTCM $- withImportPath ms $- local (\e -> e { envModuleNestingLevel = nesting- -- Andreas, 2014-08-18:- -- Preserve the range of import statement- -- for reporting termination errors in- -- imported modules:- , envRange = range- , envCall = call- }) $ do- setDecodedModules ds- setCommandLineOptions opts- setInteractionOutputCallback ho- stModuleToSource .= mf- setVisitedModules vs- addImportedThings isig ibuiltin Set.empty Set.empty ipatsyns display+ -- Merge the signature with the signature for imported+ -- things.+ reportSLn "import.iface" 40 $ "Merging with state changes included."+ sig <- getSignature+ patsyns <- getPatternSyns+ display <- use stImportsDisplayForms+ addImportedThings sig Map.empty patsyns display []+ setSignature emptySignature+ setPatternSyns Map.empty - r <- withMsgs $ createInterface file x includeStateChanges- mf <- use stModuleToSource- ds <- getDecodedModules- return (r, do- stModuleToSource .= mf- setDecodedModules ds- case r of- (i, NoWarnings) -> storeDecodedModule i- _ -> return ()- )+ return (True, r)+ NotMainInterface -> do+ ms <- getImportPath+ nesting <- asks envModuleNestingLevel+ range <- asks envRange+ call <- asks envCall+ mf <- use stModuleToSource+ vs <- getVisitedModules+ ds <- getDecodedModules+ opts <- stPersistentOptions . stPersistentState <$> get+ isig <- use stImports+ ibuiltin <- use stImportedBuiltins+ display <- use stImportsDisplayForms+ ipatsyns <- getPatternSynImports+ ho <- getInteractionOutputCallback+ -- Every interface is treated in isolation. Note: Some changes to+ -- the persistent state may not be preserved if an error other+ -- than a type error or an IO exception is encountered in an+ -- imported module.+ r <- noCacheForImportedModule $+ freshTCM $+ withImportPath ms $+ local (\e -> e { envModuleNestingLevel = nesting+ -- Andreas, 2014-08-18:+ -- Preserve the range of import statement+ -- for reporting termination errors in+ -- imported modules:+ , envRange = range+ , envCall = call+ }) $ do+ setDecodedModules ds+ setCommandLineOptions opts+ setInteractionOutputCallback ho+ stModuleToSource .= mf+ setVisitedModules vs+ addImportedThings isig ibuiltin ipatsyns display [] - case r of- Left err -> throwError err- Right (r, update) -> do- update- case r of- (_, NoWarnings) ->- -- We skip the file which has just been type-checked to- -- be able to forget some of the local state from- -- checking the module.- -- Note that this doesn't actually read the interface- -- file, only the cached interface.- getStoredInterface x file includeStateChanges- _ -> return (False, r)+ r <- withMsgs $ createInterface file x isMain+ mf <- use stModuleToSource+ ds <- getDecodedModules+ return (r, do+ stModuleToSource .= mf+ setDecodedModules ds+ case r of+ (i, NoWarnings) -> storeDecodedModule i+ _ -> return ()+ ) + case r of+ Left err -> throwError err+ Right (r, update) -> do+ update+ case r of+ (_, NoWarnings) ->+ -- We skip the file which has just been type-checked to+ -- be able to forget some of the local state from+ -- checking the module.+ -- Note that this doesn't actually read the interface+ -- file, only the cached interface. (This comment is not+ -- correct, see+ -- test/Fail/customised/NestedProjectRoots.err.)+ getStoredInterface x file isMain+ _ -> return (False, r) --- | Formats and outputs the "Checking", "Finished" and "Skipping" messages.+-- | Formats and outputs the "Checking", "Finished" and "Loading " messages. chaseMsg- :: String -- ^ The prefix, like @Checking@, @Finished@, @Skipping@.+ :: String -- ^ The prefix, like @Checking@, @Finished@, @Loading @. -> C.TopLevelModuleName -- ^ The module name. -> Maybe String -- ^ Optionally: the file name. -> TCM ()@@ -583,12 +613,12 @@ `catchError` handler where handler e = case e of- IOException _ e -> do+ IOException _ _ e -> do reportSLn "" 0 $ "IO exception: " ++ show e return Nothing -- Work-around for file locking bug. -- TODO: What does this refer to? Please -- document.- _ -> throwError e+ _ -> throwError e -- | Writes the given interface to the given file. @@ -629,9 +659,9 @@ createInterface :: AbsolutePath -- ^ The file to type check. -> C.TopLevelModuleName -- ^ The expected module name.- -> Bool+ -> MainInterface -> TCM (Interface, MaybeWarnings)-createInterface file mname isMain =+createInterface file mname isMain = Bench.billTo [Bench.TopModule mname] $ local (\e -> e { envCurrentPath = Just file }) $ do modFile <- use stModuleToSource fileTokenInfo <- Bench.billTo [Bench.Highlighting] $@@ -643,10 +673,7 @@ verboseS "import.iface.create" 10 $ do visited <- Map.keys <$> getVisitedModules reportSLn "import.iface.create" 10 $- " visited: " ++ intercalate ", " (map prettyShow visited)-- previousHsImports <- getHaskellImports- previousHsImportsUHC <- getHaskellImportsUHC+ " visited: " ++ List.intercalate ", " (map prettyShow visited) -- Parsing. (pragmas, top) <- Bench.billTo [Bench.Parsing] $@@ -672,10 +699,12 @@ -- Highlighting from scope checker. reportSLn "import.iface.create" 7 $ "Starting highlighting from scope." Bench.billTo [Bench.Highlighting] $ do- ifTopLevelAndHighlightingLevelIs NonInteractive $ do- -- Generate and print approximate syntax highlighting info.+ -- Generate and print approximate syntax highlighting info.+ ifTopLevelAndHighlightingLevelIs NonInteractive $ printHighlightingInfo fileTokenInfo- mapM_ (\ d -> generateAndPrintSyntaxInfo d Partial) ds+ let onlyScope = isMain == MainInterface ScopeCheck+ ifTopLevelAndHighlightingLevelIsOr NonInteractive onlyScope $+ mapM_ (\ d -> generateAndPrintSyntaxInfo d Partial onlyScope) ds reportSLn "import.iface.create" 7 $ "Finished highlighting from scope." @@ -693,9 +722,14 @@ cleanCachedLog writeToCurrentLog $ Pragmas opts - reportSLn "import.iface.create" 7 $ "Starting type checking."- Bench.billTo [Bench.Typing] $ mapM_ checkDeclCached ds `finally_` cacheCurrentLog- reportSLn "import.iface.create" 7 $ "Finished type checking."+ case isMain of+ MainInterface ScopeCheck -> do+ reportSLn "import.iface.create" 7 $ "Skipping type checking."+ cacheCurrentLog+ _ -> do+ reportSLn "import.iface.create" 7 $ "Starting type checking."+ Bench.billTo [Bench.Typing] $ mapM_ checkDeclCached ds `finally_` cacheCurrentLog+ reportSLn "import.iface.create" 7 $ "Finished type checking." -- Ulf, 2013-11-09: Since we're rethrowing the error, leave it up to the -- code that handles that error to reset the state.@@ -746,7 +780,7 @@ -- permanently freeze them now by turning them into postulates. -- This will enable serialization. -- savedMetaStore <- use stMetaStore- unless isMain $+ unless (includeStateChanges isMain) $ whenM (optAllowUnsolved <$> pragmaOptions) $ do withCurrentModule (scopeCurrent scope) $ openMetasToPostulates@@ -759,24 +793,30 @@ reportSLn "import.iface.create" 7 $ "Starting serialization." syntaxInfo <- use stSyntaxInfo i <- Bench.billTo [Bench.Serialization, Bench.BuildInterface] $ do- buildInterface file topLevel syntaxInfo previousHsImports previousHsImportsUHC options+ buildInterface file topLevel syntaxInfo options - reportSLn "tc.top" 101 $ concat $- "Signature:\n" :- [ show x ++ "\n type: " ++ show (defType def)- ++ "\n def: " ++ show cc ++ "\n"+ reportSLn "tc.top" 101 $ unlines $+ "Signature:" :+ [ unlines+ [ prettyShow x+ , " type: " ++ show (defType def)+ , " def: " ++ show cc+ ] | (x, def) <- HMap.toList $ iSignature i ^. sigDefinitions, Function{ funCompiled = cc } <- [theDef def] ] reportSLn "import.iface.create" 7 $ "Finished serialization." mallWarnings <- getAllWarnings ErrorWarnings- $ if isMain then IgnoreFlags else RespectFlags+ $ case isMain of+ MainInterface _ -> IgnoreFlags+ NotMainInterface -> RespectFlags reportSLn "import.iface.create" 7 $ "Considering writing to interface file."- case mallWarnings of- SomeWarnings allWarnings -> return ()- NoWarnings -> Bench.billTo [Bench.Serialization] $ do+ case (mallWarnings, isMain) of+ (SomeWarnings allWarnings, _) -> return ()+ (_, MainInterface ScopeCheck) -> return ()+ _ -> Bench.billTo [Bench.Serialization] $ do -- The file was successfully type-checked (and no warnings were -- encountered), so the interface should be written out. let ifile = filePath $ toIFile file@@ -804,24 +844,6 @@ -- in by the user, or not (for instance when deciding if we are -- writing an interface file or not) -data WhichWarnings = ErrorWarnings | AllWarnings- -- ^ order of constructors important for derived Ord instance- deriving (Eq, Ord)--classifyWarning :: Warning -> WhichWarnings-classifyWarning w = case w of- OldBuiltin{} -> AllWarnings- EmptyRewritePragma -> AllWarnings- TerminationIssue{} -> ErrorWarnings- NotStrictlyPositive{} -> ErrorWarnings- UnsolvedMetaVariables{} -> ErrorWarnings- UnsolvedInteractionMetas{} -> ErrorWarnings- UnsolvedConstraints{} -> ErrorWarnings- ParseWarning{} -> ErrorWarnings--classifyWarnings :: [TCWarning] -> ([TCWarning], [TCWarning])-classifyWarnings = partition $ (< AllWarnings) . classifyWarning . tcWarning- getAllWarnings' :: WhichWarnings -> IgnoreFlags -> TCM [TCWarning] getAllWarnings' ww ifs = do openMetas <- getOpenMetas@@ -850,9 +872,24 @@ then NoWarnings else SomeWarnings allWarnings --- constructIScope :: ScopeInfo -> Map ModuleName Scope+errorWarningsOfTCErr :: TCErr -> TCM [TCWarning]+errorWarningsOfTCErr err = case err of+ TypeError tcst cls -> case clValue cls of+ NonFatalErrors{} -> return []+ _ -> localState $ do+ put tcst+ ws <- getAllWarnings' ErrorWarnings RespectFlags+ -- We filter out the unsolved(Metas/Constraints) to stay+ -- true to the previous error messages.+ return $ filter (not . isUnsolvedWarning . tcWarning) ws+ _ -> return []++-- | Reconstruct the 'iScope' (not serialized)+-- from the 'iInsideScope' (serialized).+ constructIScope :: Interface -> Interface-constructIScope i = i{ iScope = billToPure [ Deserialization ] $ publicModules $ iInsideScope i }+constructIScope i = billToPure [ Deserialization ] $+ i{ iScope = publicModules $ iInsideScope i } -- | Builds an interface for the current module, which should already -- have been successfully type checked.@@ -863,14 +900,10 @@ -- ^ 'TopLevelInfo' for the current module. -> HighlightingInfo -- ^ Syntax highlighting info for the module.- -> Set String- -- ^ MAlonzo: Haskell modules imported in imported modules (transitively).- -> Set String- -- ^ UHC backend: Haskell modules imported in imported modules (transitively). -> [OptionsPragma] -- ^ Options set in @OPTIONS@ pragmas. -> TCM Interface-buildInterface file topLevel syntaxInfo previousHsImports previousHsImportsUHC pragmas = do+buildInterface file topLevel syntaxInfo pragmas = do reportSLn "import.iface" 5 "Building interface..." let m = topLevelModuleName topLevel scope' <- getScope@@ -888,9 +921,7 @@ builtin <- use stLocalBuiltins ms <- getImports mhs <- mapM (\ m -> (m,) <$> moduleHash m) $ Set.toList ms- hsImps <- getHaskellImports- uhcHsImps <- getHaskellImportsUHC- hsCode <- use stHaskellCode+ foreignCode <- use stForeignCode -- Ulf, 2016-04-12: -- Non-closed display forms are not applicable outside the module anyway, -- and should be dead-code eliminated (#1928).@@ -903,6 +934,7 @@ patsyns <- killRange <$> getPatternSyns h <- liftIO $ hashFile file let builtin' = Map.mapWithKey (\ x b -> (x,) . primFunName <$> b) builtin+ warnings <- getAllWarnings' AllWarnings RespectFlags reportSLn "import.iface" 7 " instantiating all meta variables" i <- instantiateFull $ Interface { iSourceHash = h@@ -913,12 +945,11 @@ , iSignature = sig , iDisplayForms = display , iBuiltin = builtin'- , iHaskellImports = hsImps `Set.difference` previousHsImports- , iHaskellImportsUHC = uhcHsImps `Set.difference` previousHsImportsUHC- , iHaskellCode = hsCode+ , iForeignCode = foreignCode , iHighlighting = syntaxInfo , iPragmaOptions = pragmas , iPatternSyns = patsyns+ , iWarnings = warnings } reportSLn "import.iface" 7 " interface complete" return i
src/full/Agda/Interaction/InteractionTop.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} {-# OPTIONS_GHC -fno-cse #-} @@ -13,15 +12,19 @@ import Prelude hiding (null) import Control.Applicative hiding (empty)+import Control.Concurrent+import Control.Concurrent.Async+import Control.Concurrent.STM.TChan import qualified Control.Exception as E import Control.Monad.Identity import Control.Monad.Reader import Control.Monad.State+import Control.Monad.STM import qualified Data.Char as Char import Data.Foldable (Foldable) import Data.Function-import Data.List as List hiding (null)+import qualified Data.List as List import Data.Maybe import Data.Map (Map) import qualified Data.Map as Map@@ -36,6 +39,7 @@ hiding (initState, setCommandLineOptions) import qualified Agda.TypeChecking.Monad as TM import qualified Agda.TypeChecking.Pretty as TCP+import Agda.TypeChecking.Rules.Term (checkExpr, isType_) import Agda.TypeChecking.Errors import Agda.Syntax.Fixity@@ -64,15 +68,15 @@ import Agda.Interaction.BasicOps hiding (whyInScope) import Agda.Interaction.Highlighting.Precise hiding (Postulate) import qualified Agda.Interaction.Imports as Imp+import Agda.TypeChecking.Warnings import Agda.Interaction.Highlighting.Generate import qualified Agda.Interaction.Highlighting.LaTeX as LaTeX import qualified Agda.Interaction.Highlighting.Range as H import Agda.Compiler.Common (IsMain (..))-import qualified Agda.Compiler.MAlonzo.Compiler as MAlonzo-import qualified Agda.Compiler.JS.Compiler as JS+import Agda.Compiler.Backend -import qualified Agda.Auto.Auto as Auto+import Agda.Auto.Auto as Auto import Agda.Utils.Except ( ExceptT@@ -97,7 +101,8 @@ #include "undefined.h" import Agda.Utils.Impossible -------------------------------------------+------------------------------------------------------------------------+-- The CommandM monad -- | Auxiliary state of an interactive computation. @@ -119,20 +124,30 @@ -- ^ We remember (the scope of) old interaction points to make it -- possible to parse and compute highlighting information for the -- expression that it got replaced by.+ , commandQueue :: CommandQueue+ -- ^ Command queue.+ --+ -- The commands in the queue are processed in the order in which+ -- they are received. Abort commands do not have precedence over+ -- other commands, they only abort the immediately preceding+ -- command. (The Emacs mode is expected not to send a new command,+ -- other than the abort command, before the previous command has+ -- completed.) } type OldInteractionScopes = Map InteractionId ScopeInfo -- | Initial auxiliary interaction state -initCommandState :: CommandState-initCommandState = CommandState- { theInteractionPoints = []- , theCurrentFile = Nothing- , optionsOnReload = defaultOptions- , oldInteractionScopes = Map.empty- }-+initCommandState :: CommandQueue -> CommandState+initCommandState commandQueue =+ CommandState+ { theInteractionPoints = []+ , theCurrentFile = Nothing+ , optionsOnReload = defaultOptions+ , oldInteractionScopes = Map.empty+ , commandQueue = commandQueue+ } -- | Monad for computing answers to interactive commands. --@@ -229,7 +244,7 @@ handleCommand :: (forall a. CommandM a -> CommandM a) -> CommandM () -> CommandM () -> CommandM () handleCommand wrap onFail cmd = handleNastyErrors $ wrap $ do- tcSt <- lift get+ oldState <- lift get -- -- Andreas, 2016-11-18 OLD CODE: -- -- onFail and handleErr are executed in "new" command state (not TCState).@@ -246,7 +261,10 @@ handleErr e -- Andreas, 2016-11-18, issue #2174 -- Reset TCState after error is handled, to get rid of metas created during failed command- lift $ put tcSt+ lift $ do+ newPersistentState <- use lensPersistentState+ put oldState+ lensPersistentState .= newPersistentState where -- Preserves state so we can do unsolved meta highlighting@@ -259,13 +277,25 @@ put s' return x - -- | Handle nasty errors like stack space overflow (issue 637)- -- We assume that the input action handles other kind of errors.+ -- | Handle every possible kind of error (#637), except for+ -- ThreadKilled, which is used to abort Agda. handleNastyErrors :: CommandM () -> CommandM ()- handleNastyErrors m = commandMToIO $ \ toIO ->- toIO m `E.catch` \ (e :: E.SomeException) ->- toIO $ handleErr $ Exception noRange $ text $ show e+ handleNastyErrors m = commandMToIO $ \ toIO -> do+ let handle e =+ Right <$>+ (toIO $ handleErr $ Exception noRange $ text $ show e) + asyncHandler e@E.ThreadKilled = return (Left e)+ asyncHandler e = handle e++ generalHandler (e :: E.SomeException) = handle e++ r <- ((Right <$> toIO m) `E.catch` asyncHandler)+ `E.catch` generalHandler+ case r of+ Right x -> return x+ Left e -> E.throwIO e+ -- | Displays an error and instructs Emacs to jump to the site of the -- error. Because this function may switch the focus to another file -- the status information is also updated.@@ -275,15 +305,18 @@ constr <- lift $ computeUnsolvedConstraints err <- lift $ errorHighlighting e modFile <- lift $ use stModuleToSource+ method <- lift $ view eHighlightingMethod let info = compress $ mconcat $ -- Errors take precedence over unsolved things. err : if unsolvedNotOK then [meta, constr] else []- s <- lift $ prettyError e+ s1 <- lift $ prettyError e+ s2 <- lift $ prettyTCWarnings' =<< Imp.errorWarningsOfTCErr e+ let s = List.intercalate "\n" $ filter (not . null) $ s1 : s2 x <- lift $ optShowImplicit <$> use stPragmaOptions- unless (null s) $ mapM_ putResponse $+ unless (null s1) $ mapM_ putResponse $ [ Resp_DisplayInfo $ Info_Error s ] ++ tellEmacsToJumpToError (getRange e) ++- [ Resp_HighlightingInfo info modFile ] +++ [ Resp_HighlightingInfo info method modFile ] ++ [ Resp_Status $ Status { sChecked = False , sShowImplicitArguments = x } ]@@ -320,6 +353,95 @@ onFail | independent cmd = modify $ \ s -> s { theCurrentFile = Nothing } | otherwise = return () +------------------------------------------------------------------------+-- Command queues++-- | Commands.++data Command+ = Command IOTCM+ -- ^ An 'IOTCM' command.+ | Done+ -- ^ Stop processing commands.+ | Error String+ -- ^ An error message for a command that could not be parsed.+ deriving Show++-- | Command queues.++type CommandQueue = TChan Command++-- | The next command.++nextCommand :: CommandM Command+nextCommand =+ liftIO . atomically . readTChan =<< gets commandQueue++-- | Runs the given computation, but if an abort command is+-- encountered (and acted upon), then the computation is interrupted,+-- the persistent state and all options are restored, and some+-- commands are sent to the frontend.++-- TODO: It might be nice if some of the changes to the persistent+-- state inflicted by the interrupted computation were preserved.++maybeAbort :: CommandM () -> CommandM ()+maybeAbort c = do+ commandState <- get+ tcState <- lift get+ tcEnv <- lift ask+ result <- liftIO $ race+ (runTCM tcEnv tcState $ runStateT c commandState)+ (waitForAbort $ commandQueue commandState)+ case result of+ Left (((), commandState), tcState) -> do+ lift $ put tcState+ put commandState+ Right () -> do+ lift $ put $ initState+ { stPersistentState = stPersistentState tcState+ , stPreScopeState =+ (stPreScopeState initState)+ { stPrePragmaOptions =+ stPrePragmaOptions+ (stPreScopeState tcState)+ }+ }+ put $ (initCommandState (commandQueue commandState))+ { optionsOnReload = optionsOnReload commandState+ }+ putResponse Resp_DoneAborting+ displayStatus+ where++ -- | Returns if the first element in the queue is an abort command.+ -- The abort command is removed from the queue.++ waitForAbort :: CommandQueue -> IO ()+ waitForAbort q = atomically $ do+ c <- peekTChan q+ case c of+ Command (IOTCM _ _ _ Cmd_abort) -> void $ readTChan q+ _ -> retry++-- | Creates a command queue, and forks a thread that writes commands+-- to the queue. The queue is returned.++initialiseCommandQueue+ :: IO Command+ -- ^ Returns the next command.+ -> IO CommandQueue+initialiseCommandQueue next = do+ q <- newTChanIO+ let readCommands = do+ c <- next+ atomically $ writeTChan q c+ case c of+ Done -> return ()+ _ -> readCommands+ _ <- forkIO readCommands+ return q+ ---------------------------------------------------------------------------- -- | An interactive computation. @@ -332,7 +454,7 @@ -- | @cmd_compile b m argv@ compiles the module in file @m@ using -- the backend @b@, using @argv@ as the command-line options.- | Cmd_compile Backend FilePath [String]+ | Cmd_compile CompilerBackend FilePath [String] | Cmd_constraints @@ -410,7 +532,7 @@ -- If the range is 'noRange', then the string comes from the -- minibuffer rather than the goal. - | Cmd_give InteractionId range String+ | Cmd_give UseForce InteractionId range String | Cmd_refine InteractionId range String @@ -436,6 +558,11 @@ | Cmd_goal_type_context_infer B.Rewrite InteractionId range String + -- | Grabs the current goal's type and checks the expression in the hole+ -- against it.+ | Cmd_goal_type_context_check+ B.Rewrite InteractionId range String+ -- | Shows all the top-level names in the given module, along with -- their types. Uses the scope of the given goal. | Cmd_show_module_contents@@ -450,8 +577,11 @@ | Cmd_why_in_scope_toplevel String -- | Displays version of the running Agda | Cmd_show_version- deriving (Read, Functor, Foldable, Traversable)-+ | Cmd_abort+ -- ^ Abort the current computation.+ --+ -- Does nothing if no computation is in progress.+ deriving (Show, Read, Functor, Foldable, Traversable) type IOTCM = IOTCM' Range data IOTCM' range@@ -464,7 +594,7 @@ HighlightingMethod (Interaction' range) -- -^ What to do- deriving (Read, Functor, Foldable, Traversable)+ deriving (Show, Read, Functor, Foldable, Traversable) --------------------------------------------------------- -- Read instances@@ -496,7 +626,7 @@ -- | Demand an exact string. exact :: String -> Parse ()-exact s = readsToParse (show s) $ fmap (\x -> ((),x)) . stripPrefix s . dropWhile (==' ')+exact s = readsToParse (show s) $ fmap (\x -> ((),x)) . List.stripPrefix s . dropWhile (==' ') readParse :: Read a => Parse a readParse = readsToParse "read failed" $ listToMaybe . reads@@ -556,23 +686,30 @@ interpret :: Interaction -> CommandM () interpret (Cmd_load m argv) =- cmd_load' m argv True $ \_ -> interpret Cmd_metas+ cmd_load' m argv True Imp.TypeCheck $ \_ -> interpret Cmd_metas interpret (Cmd_compile b file argv) =- cmd_load' file argv (b == LaTeX) $ \(i, mw) -> do+ cmd_load' file argv (b `elem` [LaTeX, QuickLaTeX])+ (if b == QuickLaTeX+ then Imp.ScopeCheck+ else Imp.TypeCheck) $ \(i, mw) -> do mw <- lift $ Imp.applyFlagsToMaybeWarnings RespectFlags mw case mw of Imp.NoWarnings -> do lift $ case b of- GHC -> MAlonzo.compilerMain IsMain i- GHCNoMain -> MAlonzo.compilerMain NotMain i- JS -> JS.compilerMain i- LaTeX -> LaTeX.generateLaTeX i- display_info $ Info_CompilationOk- Imp.SomeWarnings w ->+ LaTeX -> LaTeX.generateLaTeX i+ QuickLaTeX -> LaTeX.generateLaTeX i+ OtherBackend "GHCNoMain" -> callBackend "GHC" NotMain i -- for backwards compatibility+ OtherBackend b -> callBackend b IsMain i+ (pwe, pwa) <- interpretWarnings+ display_info $ Info_CompilationOk pwa pwe+ Imp.SomeWarnings w -> do+ pw <- lift $ prettyTCWarnings w display_info $ Info_Error $ unlines- [ "You can only compile modules without unsolved metavariables"- , "or termination checking problems."+ [ "You need to fix the following errors before you can compile"+ , "the module:"+ , ""+ , pw ] interpret Cmd_constraints =@@ -654,7 +791,8 @@ if sourceH == iSourceHash (miInterface mi) then do modFile <- use stModuleToSource- return $ Just (iHighlighting $ miInterface mi, modFile)+ method <- view eHighlightingMethod+ return $ Just (iHighlighting $ miInterface mi, method, modFile) else return Nothing mapM_ putResponse resp@@ -680,15 +818,15 @@ try err m = mkExceptT $ do (Right <$> m) `catchError` \ _ -> return (Left err) -interpret (Cmd_give ii rng s) = give_gen ii rng s Give-interpret (Cmd_refine ii rng s) = give_gen ii rng s Refine+interpret (Cmd_give force ii rng s) = give_gen force ii rng s Give+interpret (Cmd_refine ii rng s) = give_gen WithoutForce ii rng s Refine interpret (Cmd_intro pmLambda ii rng _) = do ss <- lift $ B.introTactic pmLambda ii liftCommandMT (B.withInteractionId ii) $ case ss of [] -> do display_info $ Info_Intro $ text "No introduction forms found."- [s] -> give_gen ii rng s Intro+ [s] -> give_gen WithoutForce ii rng s Intro _:_:_ -> do display_info $ Info_Intro $ sep [ text "Don't know which constructor to introduce of"@@ -707,11 +845,11 @@ -- Save the state to have access to even those interaction ids -- that Auto solves (since Auto gives the solution right away). st <- lift $ get- (res, msg) <- lift $ Auto.auto ii rng s- case res of- Left xs -> do- lift $ reportSLn "auto" 10 $ "Auto produced the following solutions " ++ show xs- forM_ xs $ \(ii, s) -> do+ (time , res) <- maybeTimed $ lift $ Auto.auto ii rng s+ case autoProgress res of+ Solutions sols -> do+ lift $ reportSLn "auto" 10 $ "Auto produced the following solutions " ++ show sols+ forM_ sols $ \(ii, s) -> do -- Andreas, 2014-07-05 Issue 1226: -- For highlighting, Resp_GiveAction needs to access -- the @oldInteractionScope@s of the interaction points solved by Auto.@@ -723,16 +861,17 @@ -- modifyTheInteractionPoints $ filter (/= ii) putResponse $ Resp_GiveAction ii $ Give_String s -- Andreas, 2014-07-07: Remove the interaction points in one go.- modifyTheInteractionPoints (\\ (map fst xs))- case msg of- Nothing -> interpret Cmd_metas+ modifyTheInteractionPoints (List.\\ (map fst sols))+ case autoMessage res of+ Nothing -> interpret Cmd_metas Just msg -> display_info $ Info_Auto msg- Right (Left cs) -> do- case msg of- Nothing -> return ()+ FunClauses cs -> do+ case autoMessage res of+ Nothing -> return () Just msg -> display_info $ Info_Auto msg putResponse $ Resp_MakeCase R.Function cs- Right (Right s) -> give_gen ii rng s Refine+ Refinement s -> give_gen WithoutForce ii rng s Refine+ maybe (return ()) (display_info . Info_Time) time interpret (Cmd_context norm ii _ _) = display_info . Info_Context =<< liftLocalState (prettyContext norm False ii)@@ -762,6 +901,17 @@ return $ text "Have:" <+> typ cmd_goal_type_context_and have norm ii rng s +interpret (Cmd_goal_type_context_check norm ii rng s) = do+ have <- liftLocalState $ B.withInteractionId ii $ do+ expr <- B.parseExprIn ii rng s+ goal <- B.typeOfMeta AsIs ii+ term <- case goal of+ OfType _ ty -> checkExpr expr =<< isType_ ty+ _ -> __IMPOSSIBLE__+ txt <- TCP.prettyTCM =<< normalForm norm term+ return $ text "Elaborates to:" <+> txt+ cmd_goal_type_context_and have norm ii rng s+ interpret (Cmd_show_module_contents norm ii rng s) = liftCommandMT (B.withInteractionId ii) $ showModuleContents norm rng s @@ -788,6 +938,13 @@ , TCP.text "pcs' = " TCP.<+> TCP.vcat (map TCP.text pcs') ] ]+ lift $ reportSDoc "interaction.case" 90 $ TCP.vcat+ [ TCP.text "InteractionTop.Cmd_make_case"+ , TCP.nest 2 $ TCP.vcat+ [ TCP.text "cs = " TCP.<+> TCP.text (show cs)+ , TCP.text "cs' = " TCP.<+> TCP.text (show cs')+ ]+ ] putResponse $ Resp_MakeCase (makeCaseVariant casectxt) pcs' where render = renderStyle (style { mode = OneLineMode })@@ -811,11 +968,10 @@ -- Drops pattern added to extended lambda functions when lambda lifting them extlam_dropLLifted :: CaseContext -> Bool -> A.Clause -> A.Clause extlam_dropLLifted Nothing _ x = x- extlam_dropLLifted _ _ (A.Clause (A.LHS _ A.LHSProj{} _) _ _ _ _) = __IMPOSSIBLE__- extlam_dropLLifted (Just (ExtLamInfo h nh)) hidden (A.Clause (A.LHS info (A.LHSHead name nps) ps) dots rhs decl catchall)+ extlam_dropLLifted _ _ (A.Clause (A.LHS _ A.LHSProj{} _) _ _ _ _ _) = __IMPOSSIBLE__+ extlam_dropLLifted (Just (ExtLamInfo h nh)) hidden cl@A.Clause{ A.clauseLHS = A.LHS info (A.LHSHead name nps) ps } = let n = if hidden then h + nh else nh- in- (A.Clause (A.LHS info (A.LHSHead name (drop n nps)) ps) dots rhs decl catchall)+ in cl{ A.clauseLHS = A.LHS info (A.LHSHead name (drop n nps)) ps } interpret (Cmd_compute cmode ii rng s) = display_info . Info_NormalForm =<< do liftLocalState $ do@@ -826,13 +982,15 @@ interpret Cmd_show_version = display_info Info_Version +interpret Cmd_abort = return ()+ -- | Show warnings interpretWarnings :: CommandM (String, String) interpretWarnings = do- mws <- lift $ Imp.getAllWarnings Imp.AllWarnings RespectFlags+ mws <- lift $ Imp.getAllWarnings AllWarnings RespectFlags case filter isNotMeta <$> mws of Imp.SomeWarnings ws@(_:_) -> do- let (we, wa) = Imp.classifyWarnings ws+ let (we, wa) = classifyWarnings ws pwe <- lift $ prettyTCWarnings we pwa <- lift $ prettyTCWarnings wa return (pwe, pwa)@@ -895,10 +1053,12 @@ -- result of 'Imp.typeCheckMain'. cmd_load' :: FilePath -> [String]- -> Bool -- ^ Allow unsolved meta-variables?+ -> Bool -- ^ Allow unsolved meta-variables?+ -> Imp.Mode -- ^ Full type-checking, or only+ -- scope-checking? -> ((Interface, Imp.MaybeWarnings) -> CommandM ()) -> CommandM ()-cmd_load' file argv unsolvedOK cmd = do+cmd_load' file argv unsolvedOK mode cmd = do f <- liftIO $ absolute file ex <- liftIO $ doesFileExist $ filePath f let relativeTo | ex = ProjectRoot f@@ -937,7 +1097,7 @@ -- We activate the cache only when agda is used interactively lift activateLoadedFileCache - ok <- lift $ Imp.typeCheckMain f+ ok <- lift $ Imp.typeCheckMain f mode -- The module type checked. If the file was not changed while the -- type checker was running then the interaction points and the@@ -959,30 +1119,42 @@ -- | Available backends. -data Backend = GHC- | GHCNoMain- | JS- | LaTeX- deriving (Show, Read, Eq)+data CompilerBackend = LaTeX | QuickLaTeX | OtherBackend String+ deriving (Eq) +instance Show CompilerBackend where+ show LaTeX = "LaTeX"+ show QuickLaTeX = "QuickLaTeX"+ show (OtherBackend s) = s++instance Read CompilerBackend where+ readsPrec _ s = do+ (t, s) <- lex s+ let b = case t of+ "LaTeX" -> LaTeX+ "QuickLaTeX" -> QuickLaTeX+ _ -> OtherBackend t+ return (b, s)+ data GiveRefine = Give | Refine | Intro deriving (Eq, Show) -- | A "give"-like action (give, refine, etc). ----- @give_gen ii rng s give_ref mk_newtxt@+-- @give_gen force ii rng s give_ref mk_newtxt@ -- acts on interaction point @ii@ -- occupying range @rng@, -- placing the new content given by string @s@, -- and replacing @ii@ by the newly created interaction points--- in the state.+-- in the state if safety checks pass (unless @force@ is applied). give_gen- :: InteractionId+ :: UseForce -- ^ Should safety checks be skipped?+ -> InteractionId -> Range -> String -> GiveRefine -> CommandM ()-give_gen ii rng s0 giveRefine = do+give_gen force ii rng s0 giveRefine = do let s = trim s0 lift $ reportSLn "interaction.give" 20 $ "give_gen " ++ s -- Andreas, 2015-02-26 if string is empty do nothing rather@@ -1001,10 +1173,10 @@ mis <- getInteractionPoints reportSLn "interaction.give" 30 $ "interaction points before = " ++ show mis given <- B.parseExprIn ii rng s- ae <- give_ref ii Nothing given+ ae <- give_ref force ii Nothing given mis' <- getInteractionPoints reportSLn "interaction.give" 30 $ "interaction points after = " ++ show mis'- return (ae, given, mis' \\ mis)+ return (ae, given, mis' List.\\ mis) -- favonia: backup the old scope for highlighting insertOldInteractionScope ii scope -- sort the new interaction points and put them into the state@@ -1053,7 +1225,7 @@ local (\e -> e { envModuleNestingLevel = 0 , envHighlightingLevel = NonInteractive , envHighlightingMethod = Direct }) $- generateAndPrintSyntaxInfo decl Full+ generateAndPrintSyntaxInfo decl Full True where dummy = mkName_ (NameId 0 0) "dummy" info = mkDefInfo (nameConcrete dummy) noFixity' PublicAccess ConcreteDef (getRange e)@@ -1063,7 +1235,7 @@ sortInteractionPoints :: [InteractionId] -> TCM [InteractionId] sortInteractionPoints is =- map fst . sortBy (compare `on` snd) <$> do+ map fst . List.sortBy (compare `on` snd) <$> do forM is $ \ i -> do (i,) <$> getInteractionRange i @@ -1123,7 +1295,7 @@ (modules, types) <- B.moduleContents norm rng s types' <- forM types $ \ (x, t) -> do t <- TCP.prettyTCM t- return (show x, text ":" <+> t)+ return (prettyShow x, text ":" <+> t) return $ vcat [ text "Modules" , nest 2 $ vcat $ map (text . show) modules@@ -1142,9 +1314,9 @@ hits <- findMentions norm rg tnm forM hits $ \ (x, t) -> do t <- TCP.prettyTCM t- return (show x, text ":" <+> t)+ return (prettyShow x, text ":" <+> t) display_info $ Info_SearchAbout $- text "Definitions about" <+> text (intercalate ", " $ words nm) $$+ text "Definitions about" <+> text (List.intercalate ", " $ words nm) $$ nest 2 (align 10 fancy) -- | Explain why something is in scope.@@ -1181,8 +1353,8 @@ asVar = do TCP.text "* a variable bound at" TCP.<+> TCP.prettyTCM (nameBindingSite $ localVar x) shadowing :: LocalVar -> TCM Doc- shadowing LocalVar{} = TCP.text "shadowing"- shadowing ShadowedVar{} = TCP.text "in conflict with"+ shadowing (LocalVar _ _ []) = TCP.text "shadowing"+ shadowing _ = TCP.text "in conflict with" names xs = TCP.vcat $ map pName xs modules ms = TCP.vcat $ map pMod ms @@ -1256,7 +1428,7 @@ mm <- lookupModuleFromSource f case mm of Nothing -> return False -- work-around for Issue1007- Just m -> not . miWarnings . fromMaybe __IMPOSSIBLE__ <$> getVisitedModule m+ Just m -> maybe False (not . miWarnings) <$> getVisitedModule m return $ Status { sShowImplicitArguments = showImpl , sChecked = checked@@ -1322,10 +1494,10 @@ -- info (unless it is @Nothing@). tellToUpdateHighlighting- :: Maybe (HighlightingInfo, ModuleToSource) -> IO [Response]+ :: Maybe (HighlightingInfo, HighlightingMethod, ModuleToSource) -> IO [Response] tellToUpdateHighlighting Nothing = return []-tellToUpdateHighlighting (Just (info, modFile)) =- return [Resp_HighlightingInfo info modFile]+tellToUpdateHighlighting (Just (info, method, modFile)) =+ return [Resp_HighlightingInfo info method modFile] -- | Tells the Emacs mode to go to the first error position (if any).
src/full/Agda/Interaction/Library.hs view
@@ -1,10 +1,30 @@-+-- | Library management.+--+-- Sample use:+--+-- @+-- -- Get libraries as listed in @.agda/libraries@ file.+-- libs <- getInstalledLibraries Nothing+--+-- -- Get the libraries (and immediate paths) relevant for @projectRoot@.+-- -- This involves locating and processing the @.agda-lib@ file for the project.+-- (libNames, includePaths) <- getDefaultLibraries projectRoot True+--+-- -- Get include paths of depended-on libraries.+-- resolvedPaths <- libraryIncludePaths Nothing libs libNames+--+-- let allPaths = includePaths ++ resolvedPaths+-- @+-- module Agda.Interaction.Library ( getDefaultLibraries , getInstalledLibraries , libraryIncludePaths , LibName , LibM+ -- * Exported for testing+ , VersionView(..), versionView, unVersionView+ , findLib' ) where import Control.Arrow (first, second)@@ -14,57 +34,117 @@ import Data.Char import Data.Either import Data.Function-import Data.List+import qualified Data.List as List import Data.Maybe+import System.Directory ( getAppUserDataDirectory ) import System.Directory import System.FilePath import System.Environment import Agda.Interaction.Library.Base import Agda.Interaction.Library.Parse-import Agda.Utils.Monad+ import Agda.Utils.Environment import Agda.Utils.Except ( ExceptT, runExceptT, MonadError(throwError) )+import Agda.Utils.IO ( catchIO ) import Agda.Utils.List+import Agda.Utils.Maybe+import Agda.Utils.Monad import Agda.Utils.Pretty+import Agda.Utils.String ( trim, ltrim ) import Agda.Version +------------------------------------------------------------------------+-- Types and Monads+------------------------------------------------------------------------++-- | Library names are structured into the base name and a suffix of version+-- numbers, e.g. @mylib-1.2.3@. The version suffix is optional.+data VersionView = VersionView+ { vvBase :: LibName+ -- ^ Actual library name.+ , vvNumbers :: [Integer]+ -- ^ Major version, minor version, subminor version, etc., all non-negative.+ -- Note: a priori, there is no reason why the version numbers should be @Int@s.+ } deriving (Eq, Show)++-- | Collected errors while processing library files.+--+data LibError+ = LibNotFound FilePath LibName+ -- ^ Raised when a library name could no successfully be resolved+ -- to an @.agda-lib@ file.+ | AmbiguousLib LibName [AgdaLibFile]+ -- ^ Raised when a library name is defined in several @.agda-lib files@.+ | OtherError String+ -- ^ Generic error.+ deriving (Show)++-- | Collects 'LibError's.+--+type LibErrorIO = WriterT [LibError] IO++-- | Throws 'Doc' exceptions. type LibM = ExceptT Doc IO -catchIO :: IO a -> (IOException -> IO a) -> IO a-catchIO = catch+-- | Raise collected 'LibErrors' as exception.+--+mkLibM :: [AgdaLibFile] -> LibErrorIO a -> LibM a+mkLibM libs m = do+ (x, err) <- lift $ runWriterT m+ case err of+ [] -> return x+ _ -> throwError =<< do lift $ vcat <$> mapM (formatLibError libs) err +------------------------------------------------------------------------+-- Resources+------------------------------------------------------------------------++-- | Get the path to @~/.agda@ (system-specific).+-- Can be overwritten by the @AGDA_DIR@ environment variable.+--+-- (This is not to be confused with the directory for the data files+-- that Agda needs (e.g. the primitive modules).)+-- getAgdaAppDir :: IO FilePath getAgdaAppDir = do- agdaDir <- lookupEnv "AGDA_DIR"- case agdaDir of- Nothing -> getAppUserDataDirectory "agda"- Just dir ->+ -- System-specific command to build the path to ~/.agda (Unix) or %APPDATA%\agda (Win)+ let agdaDir = getAppUserDataDirectory "agda"+ -- The default can be overwritten by setting the AGDA_DIR environment variable+ caseMaybeM (lookupEnv "AGDA_DIR") agdaDir $ \ dir -> ifM (doesDirectoryExist dir) (canonicalizePath dir) $ do- d <- getAppUserDataDirectory "agda"+ d <- agdaDir putStrLn $ "Warning: Environment variable AGDA_DIR points to non-existing directory " ++ show dir ++ ", using " ++ show d ++ " instead." return d +-- | The @~/.agda/libraries@ file lists the libraries Agda should know about.+-- The content of @libraries@ is is a list of pathes to @.agda-lib@ files.+--+-- Agda honors also version specific @libraries@ files, e.g. @libraries-2.6.0@.+--+-- @defaultLibraryFiles@ gives a list of all @libraries@ files Agda should process+-- by default.+-- defaultLibraryFiles :: [FilePath] defaultLibraryFiles = ["libraries-" ++ version, "libraries"] +-- | The @defaultsFile@ contains a list of library names relevant for each Agda project.+-- defaultsFile :: FilePath defaultsFile = "defaults" -data LibError = LibNotFound FilePath LibName- | AmbiguousLib LibName [AgdaLibFile]- | OtherError String- deriving (Show)--mkLibM :: [AgdaLibFile] -> IO (a, [LibError]) -> LibM a-mkLibM libs m = do- (x, err) <- lift m- case err of- [] -> return x- _ -> throwError =<< lift (vcat <$> mapM (formatLibError libs) err)+------------------------------------------------------------------------+-- * Get the libraries for the current project+------------------------------------------------------------------------ -findAgdaLibFiles :: FilePath -> IO [FilePath]+-- | Get pathes of @.agda-lib@ files in given project root.+--+-- If there are none, look in the parent directories until one is found.+--+findAgdaLibFiles+ :: FilePath -- ^ Project root.+ -> IO [FilePath] -- ^ Pathes of @.agda-lib@ files for this project (if any). findAgdaLibFiles root = do libs <- map (root </>) . filter ((== ".agda-lib") . takeExtension) <$> getDirectoryContents root case libs of@@ -73,92 +153,149 @@ if up == root then return [] else findAgdaLibFiles up files -> return files -getDefaultLibraries :: FilePath -> Bool -> LibM ([LibName], [FilePath])+-- | Get dependencies and include paths for given project root:+--+-- Look for @.agda-lib@ files according to 'findAgdaLibFiles'.+-- If none are found, use default dependencies (according to @defaults@ file)+-- and current directory (project root).+--+getDefaultLibraries+ :: FilePath -- ^ Project root.+ -> Bool -- ^ Use @defaults@ if no @.agda-lib@ file exists for this project?+ -> LibM ([LibName], [FilePath]) -- ^ The returned @LibName@s are all non-empty strings. getDefaultLibraries root optDefaultLibs = mkLibM [] $ do- libs <- findAgdaLibFiles root+ libs <- lift $ findAgdaLibFiles root if null libs- then- if optDefaultLibs then first (, []) <$> readDefaultsFile else return (([], []), [])- else first libsAndPaths <$> parseLibFiles Nothing (zip (repeat 0) libs)+ then (,[]) <$> if optDefaultLibs then (libNameForCurrentDir :) <$> readDefaultsFile else return []+ else libsAndPaths <$> parseLibFiles Nothing (zip (repeat 0) libs) where libsAndPaths ls = (concatMap libDepends ls, concatMap libIncludes ls) -readDefaultsFile :: IO ([LibName], [LibError])+-- | Return list of libraries to be used by default.+--+-- None if the @defaults@ file does not exist.+--+readDefaultsFile :: LibErrorIO [LibName] readDefaultsFile = do- agdaDir <- getAgdaAppDir+ agdaDir <- lift $ getAgdaAppDir let file = agdaDir </> defaultsFile- ifM (doesFileExist file) (do- ls <- map snd . stripCommentLines <$> readFile file- return ("." : concatMap splitCommas ls, [])- ) {- else -} (return (["."], []))- `catchIO` \e -> return (["."], [OtherError $ "Failed to read defaults file.\n" ++ show e])+ ifNotM (lift $ doesFileExist file) (return []) $ {-else-} do+ ls <- lift $ map snd . stripCommentLines <$> readFile file+ return $ concatMap splitCommas ls+ `catchIO` \ e -> do+ tell [ OtherError $ unlines ["Failed to read defaults file.", show e] ]+ return [] -getLibrariesFile :: Maybe FilePath -> IO FilePath+------------------------------------------------------------------------+-- * Reading the installed libraries+------------------------------------------------------------------------++-- | Returns the path of the @libraries@ file which lists the libraries Agda knows about.+--+-- Note: file may not exist.+--+getLibrariesFile+ :: Maybe FilePath -- ^ Override the default @libraries@ file?+ -> IO FilePath getLibrariesFile (Just overrideLibFile) = return overrideLibFile getLibrariesFile Nothing = do agdaDir <- getAgdaAppDir- let defaults = map (agdaDir </>) defaultLibraryFiles+ let defaults = map (agdaDir </>) defaultLibraryFiles -- NB: non-empty list files <- filterM doesFileExist defaults case files of file : _ -> return file [] -> return (last defaults) -- doesn't exist, but that's ok -getInstalledLibraries :: Maybe FilePath -> LibM [AgdaLibFile]+-- | Parse the descriptions of the libraries Agda knows about.+--+-- Returns none if there is no @libraries@ file.+--+getInstalledLibraries+ :: Maybe FilePath -- ^ Override the default @libraries@ file?+ -> LibM [AgdaLibFile] -- ^ Content of library files. (Might have empty @LibName@s.) getInstalledLibraries overrideLibFile = mkLibM [] $ do- file <- getLibrariesFile overrideLibFile- ifM (doesFileExist file) (do- ls <- stripCommentLines <$> readFile file- files <- sequence [ (i, ) <$> expandEnvironmentVariables s | (i, s) <- ls ]+ file <- lift $ getLibrariesFile overrideLibFile+ ifNotM (lift $ doesFileExist file) (return []) $ {-else-} do+ ls <- lift $ stripCommentLines <$> readFile file+ files <- lift $ sequence [ (i, ) <$> expandEnvironmentVariables s | (i, s) <- ls ] parseLibFiles (Just file) files- ) {- else -} (return ([], []))- `catchIO` \e -> return ([], [OtherError $ "Failed to read installed libraries.\n" ++ show e])+ `catchIO` \ e -> do+ tell [ OtherError $ unlines ["Failed to read installed libraries.", show e] ]+ return [] -parseLibFiles :: Maybe FilePath -> [(Int, FilePath)] -> IO ([AgdaLibFile], [LibError])+-- | Parse the given library files.+--+parseLibFiles+ :: Maybe FilePath -- ^ Name of @libraries@ file for error reporting.+ -> [(LineNumber, FilePath)] -- ^ Library files paired with their line number in @libraries@.+ -> LibErrorIO [AgdaLibFile] -- ^ Content of library files. (Might have empty @LibName@s.) parseLibFiles libFile files = do- rs <- mapM (parseLibFile . snd) files+ rs <- lift $ mapM (parseLibFile . snd) files+ -- Format and raise the errors. let loc line | Just f <- libFile = f ++ ":" ++ show line ++ ": " | otherwise = ""- errs = [ if isPrefixOf "Failed to read" err- then OtherError $ loc line ++ err- else OtherError $ path ++ ":" ++ (if all isDigit (take 1 err) then "" else " ") ++ err- | ((line, path), Left err) <- zip files rs ]- return (rights rs, errs)+ tell [ OtherError $ pos ++ err+ | ((line, path), Left err) <- zip files rs+ , let pos = if List.isPrefixOf "Failed to read" err+ then loc line+ else path ++ ":" ++ (if all isDigit (take 1 err) then "" else " ")+ ]+ return $ rights rs -stripCommentLines :: String -> [(Int, String)]+-- | Remove trailing white space and line comments.+--+stripCommentLines :: String -> [(LineNumber, String)] stripCommentLines = concatMap strip . zip [1..] . lines where strip (i, s) = [ (i, s') | not $ null s' ]- where s' = stripComments $ dropWhile isSpace s+ where s' = trimLineComment s +-- | Pretty-print 'LibError'. formatLibError :: [AgdaLibFile] -> LibError -> IO Doc-formatLibError installed (LibNotFound file lib) = do- return $ vcat $+formatLibError installed = \case++ LibNotFound file lib -> return $ vcat $ [ text $ "Library '" ++ lib ++ "' not found." , sep [ text "Add the path to its .agda-lib file to" , nest 2 $ text $ "'" ++ file ++ "'"- , text "to install." ]+ , text "to install."+ ] , text "Installed libraries:" ] ++ map (nest 2) (if null installed then [text "(none)"] else [ sep [ text $ libName l, nest 2 $ parens $ text $ libFile l ] | l <- installed ])-formatLibError _ (AmbiguousLib lib tgts) = return $- vcat $ sep [ text $ "Ambiguous library '" ++ lib ++ "'."- , text "Could refer to any one of" ]- : [ nest 2 $ text (libName l) <+> parens (text $ libFile l) | l <- tgts ]-formatLibError _ (OtherError err) = return $ text err -libraryIncludePaths :: Maybe FilePath -> [AgdaLibFile] -> [LibName] -> LibM [FilePath]-libraryIncludePaths overrideLibFile libs xs0 = mkLibM libs $ do+ AmbiguousLib lib tgts -> return $ vcat $+ [ sep [ text $ "Ambiguous library '" ++ lib ++ "'.", text "Could refer to any one of" ]+ ] ++ [ nest 2 $ text (libName l) <+> parens (text $ libFile l) | l <- tgts ]++ OtherError err -> return $ text err++------------------------------------------------------------------------+-- * Resolving library names to include pathes+------------------------------------------------------------------------++-- | Get all include pathes for a list of libraries to use.+libraryIncludePaths+ :: Maybe FilePath -- ^ @libraries@ file (error reporting only).+ -> [AgdaLibFile] -- ^ Libraries Agda knows about.+ -> [LibName] -- ^ (Non-empty) library names to be resolved to (lists of) pathes.+ -> LibM [FilePath] -- ^ Resolved pathes (no duplicates). Contains "." if @[LibName]@ does.+libraryIncludePaths overrideLibFile libs xs0 = mkLibM libs $ WriterT $ do file <- getLibrariesFile overrideLibFile- return $ runWriter ((dot ++) . incs <$> find file [] xs)+ return $ runWriter $ (dot ++) . incs <$> find file [] xs where- xs = map trim $ delete "." xs0- trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace- incs = nub . concatMap libIncludes- dot = [ "." | elem "." xs0 ]+ (dots, xs) = List.partition (== libNameForCurrentDir) $ map trim xs0+ incs = List.nub . concatMap libIncludes+ dot = [ "." | not $ null dots ] - find :: FilePath -> [LibName] -> [LibName] -> Writer [LibError] [AgdaLibFile]+ -- | Due to library dependencies, the work list may grow temporarily.+ find+ :: FilePath -- ^ Only for error reporting.+ -> [LibName] -- ^ Already resolved libraries.+ -> [LibName] -- ^ Work list: libraries left to be resolved.+ -> Writer [LibError] [AgdaLibFile] find _ _ [] = pure [] find file visited (x : xs) | elem x visited = find file visited xs@@ -166,33 +303,73 @@ case findLib x libs of [l] -> (l :) <$> find file (x : visited) (libDepends l ++ xs) [] -> tell [LibNotFound file x] >> find file (x : visited) xs- ls -> tell [AmbiguousLib x ls] >> find file (x : visited) xs+ ls -> tell [AmbiguousLib x ls] >> find file (x : visited) xs +-- | @findLib x libs@ retrieves the matches for @x@ from list @libs@.+--+-- 1. Case @x@ is unversioned:+-- If @x@ is contained in @libs@, then that match is returned.+-- Otherwise, the matches with the highest version number are returned.+--+-- 2. Case @x@ is versioned: the matches with the highest version number are returned.+--+-- Examples, see 'findLib''.+-- findLib :: LibName -> [AgdaLibFile] -> [AgdaLibFile]-findLib x libs =+findLib = findLib' libName++-- | Generalized version of 'findLib' for testing.+--+-- > findLib' id "a" [ "a-1", "a-02", "a-2", "b" ] == [ "a-02", "a-2" ]+--+-- > findLib' id "a" [ "a", "a-1", "a-01", "a-2", "b" ] == [ "a" ]+-- > findLib' id "a-1" [ "a", "a-1", "a-01", "a-2", "b" ] == [ "a-1", "a-01" ]+-- > findLib' id "a-2" [ "a", "a-1", "a-01", "a-2", "b" ] == [ "a-2" ]+-- > findLib' id "c" [ "a", "a-1", "a-01", "a-2", "b" ] == []+--+findLib' :: (a -> LibName) -> LibName -> [a] -> [a]+findLib' libName x libs = case ls of- l : ls -> l : takeWhile ((== versionMeasure l) . versionMeasure) ls- [] -> []+ -- Take the first and all exact matches (modulo leading zeros in version numbers).+ l : ls' -> l : takeWhile (((==) `on` versionMeasure) l) ls'+ [] -> [] where- ls = sortBy (flip compare `on` versionMeasure) [ l | l <- libs, matchLib x l ]+ -- @LibName@s that match @x@, sorted descendingly.+ -- The unversioned LibName, if any, will come first.+ ls = List.sortBy (flip compare `on` versionMeasure) [ l | l <- libs, x `hasMatch` libName l ] -- foo > foo-2.2 > foo-2.0.1 > foo-2 > foo-1.0 versionMeasure l = (rx, null vs, vs) where- (rx, vs) = versionView (libName l)+ VersionView rx vs = versionView (libName l) -matchLib :: LibName -> AgdaLibFile -> Bool-matchLib x l = rx == ry && (vx == vy || null vx)+-- | @x `hasMatch` y@ if @x@ and @y@ have the same @vvBase@ and+-- either @x@ has no version qualifier or the versions also match.+hasMatch :: LibName -> LibName -> Bool+hasMatch x y = rx == ry && (vx == vy || null vx) where- (rx, vx) = versionView x- (ry, vy) = versionView $ libName l+ VersionView rx vx = versionView x+ VersionView ry vy = versionView y --- versionView "foo-1.2.3" == ("foo", [1, 2, 3])-versionView :: LibName -> (LibName, [Int])+-- | Split a library name into basename and a list of version numbers.+--+-- > versionView "foo-1.2.3" == VersionView "foo" [1, 2, 3]+-- > versionView "foo-01.002.3" == VersionView "foo" [1, 2, 3]+--+-- Note that because of leading zeros, @versionView@ is not injective.+-- (@unVersionView . versionView@ would produce a normal form.)+versionView :: LibName -> VersionView versionView s = case span (\ c -> isDigit c || c == '.') (reverse s) of- (v, '-' : x) | valid vs -> (reverse x, reverse $ map (read . reverse) vs)+ (v, '-' : x) | valid vs ->+ VersionView (reverse x) $ reverse $ map (read . reverse) vs where vs = chopWhen (== '.') v valid [] = False valid vs = not $ any null vs- _ -> (s, [])+ _ -> VersionView s []++-- | Print a @VersionView@, inverse of @versionView@ (modulo leading zeros).+unVersionView :: VersionView -> LibName+unVersionView = \case+ VersionView base [] -> base+ VersionView base vs -> base ++ "-" ++ List.intercalate "." (map show vs)
src/full/Agda/Interaction/Library/Base.hs view
@@ -1,13 +1,26 @@+-- | Basic data types for library management. module Agda.Interaction.Library.Base where +-- | A symbolic library name.+-- type LibName = String +-- | The special name @\".\"@ is used to indicated that the current directory+-- should count as a project root.+--+libNameForCurrentDir :: LibName+libNameForCurrentDir = "."++-- | Content of a @.agda-lib@ file.+-- data AgdaLibFile = AgdaLib- { libName :: LibName- , libFile :: FilePath- , libIncludes :: [FilePath]- , libDepends :: [LibName]+ { libName :: LibName -- ^ The symbolic name of the library.+ , libFile :: FilePath -- ^ Path to this @.agda-lib@ file (not content of the file).+ , libIncludes :: [FilePath] -- ^ Roots where to look for the modules of the library.+ , libDepends :: [LibName] -- ^ Dependencies. } deriving (Show) +emptyLibFile :: AgdaLibFile+emptyLibFile = AgdaLib { libName = "", libFile = "", libIncludes = [], libDepends = [] }
src/full/Agda/Interaction/Library/Parse.hs view
@@ -1,32 +1,67 @@-module Agda.Interaction.Library.Parse (parseLibFile, stripComments, splitCommas) where+-- | Parser for @.agda-lib@ files.+--+-- Example file:+--+-- @+-- name: Main+-- depend:+-- standard-library+-- include: .+-- src more-src+-- @+--+-- Should parse as:+--+-- @+-- AgdaLib+-- { libName = "Main"+-- , libFile = path_to_this_file+-- , libIncludes = [ "." , "src" , "more-src" ]+-- , libDepends = [ "standard-library" ]+-- }+-- @+--+module Agda.Interaction.Library.Parse ( parseLibFile, splitCommas, trimLineComment, LineNumber ) where import Control.Applicative import Control.Exception import Control.Monad import Data.Char-import Data.List+import qualified Data.List as List import System.FilePath import Agda.Interaction.Library.Base-import Agda.Utils.Except ( MonadError(throwError) ) -catchIO :: IO a -> (IOException -> IO a) -> IO a-catchIO = catch+import Agda.Utils.Except ( MonadError(throwError) )+import Agda.Utils.IO ( catchIO )+import Agda.Utils.String ( ltrim ) +-- | Parser monad: Can throw @String@ error messages.+-- type P = Either String -type GenericFile = [(String, [String])]+-- | The config files we parse have the generic structure of a sequence+-- of @field : content@ entries.+type GenericFile = [GenericEntry] +data GenericEntry = GenericEntry+ { geHeader :: String -- ^ E.g. field name. @trim@med.+ , geContent :: [String] -- ^ E.g. field content. @trim@med.+ }++-- | Library file field format format [sic!]. data Field = forall a. Field- { fName :: String- , fOptional :: Bool- , fParse :: [String] -> P a- , fSet :: a -> AgdaLibFile -> AgdaLibFile }+ { fName :: String -- ^ Name of the field.+ , fOptional :: Bool -- ^ Is it optional?+ , fParse :: [String] -> P a -- ^ Content parser for this field.+ , fSet :: a -> AgdaLibFile -> AgdaLibFile -- ^ Sets parsed content in 'AgdaLibFile' structure.+ } --- | .agda-lib file format+-- | @.agda-lib@ file format with parsers and setters. agdaLibFields :: [Field] agdaLibFields =- [ Field "name" False parseName $ \ name l -> l { libName = name }+ -- Andreas, 2017-08-23, issue #2708, field "name" is optional.+ [ Field "name" True parseName $ \ name l -> l { libName = name } , Field "include" True (pure . concatMap words) $ \ inc l -> l { libIncludes = inc } , Field "depend" True (pure . concatMap splitCommas) $ \ ds l -> l { libDepends = ds } ]@@ -34,10 +69,11 @@ parseName [s] | [name] <- words s = pure name parseName ls = throwError $ "Bad library name: '" ++ unwords ls ++ "'" -defaultLibFile :: AgdaLibFile-defaultLibFile = AgdaLib { libName = "", libFile = "", libIncludes = [], libDepends = [] }---- | .agda-lib parser+-- | Parse @.agda-lib@ file.+--+-- Sets 'libFile' name and turn mentioned include directories into absolute pathes+-- (provided the given 'FilePath' is absolute).+-- parseLibFile :: FilePath -> IO (P AgdaLibFile) parseLibFile file = (fmap setPath . parseLib <$> readFile file) `catchIO` \e ->@@ -46,73 +82,133 @@ setPath lib = unrelativise (takeDirectory file) lib{ libFile = file } unrelativise dir lib = lib { libIncludes = map (dir </>) (libIncludes lib) } +-- | Parse file contents. parseLib :: String -> P AgdaLibFile parseLib s = fromGeneric =<< parseGeneric s -findField :: String -> [Field] -> P Field-findField s fs =- case [ f | f <- fs, fName f == s ] of- f : _ -> return f- [] -> throwError $ "Unknown field '" ++ s ++ "'"-+-- | Parse 'GenericFile' with 'agdaLibFields' descriptors. fromGeneric :: GenericFile -> P AgdaLibFile fromGeneric = fromGeneric' agdaLibFields +-- | Given a list of 'Field' descriptors (with their custom parsers),+-- parse a 'GenericFile' into the 'AgdaLibFile' structure.+--+-- Checks mandatory fields are present; no duplicate fields, no unknown fields. fromGeneric' :: [Field] -> GenericFile -> P AgdaLibFile fromGeneric' fields fs = do- checkFields fields (map fst fs)- foldM upd defaultLibFile fs+ checkFields fields (map geHeader fs)+ foldM upd emptyLibFile fs where- upd :: AgdaLibFile -> (String, [String]) -> P AgdaLibFile- upd l (h, cs) = do+ upd :: AgdaLibFile -> GenericEntry -> P AgdaLibFile+ upd l (GenericEntry h cs) = do Field{..} <- findField h fields x <- fParse cs return $ fSet x l +-- | Ensure that there are no duplicate fields and no mandatory fields are missing. checkFields :: [Field] -> [String] -> P () checkFields fields fs = do let mandatory = [ fName f | f <- fields, not $ fOptional f ]- missing = mandatory \\ fs- dup = fs \\ nub fs+ -- Missing fields.+ missing = mandatory List.\\ fs+ -- Duplicate fields.+ dup = fs List.\\ List.nub fs+ -- Plural s for error message. s xs = if length xs > 1 then "s" else ""- list xs = intercalate ", " [ "'" ++ f ++ "'" | f <- xs ]+ list xs = List.intercalate ", " [ "'" ++ f ++ "'" | f <- xs ] when (not $ null missing) $ throwError $ "Missing field" ++ s missing ++ " " ++ list missing when (not $ null dup) $ throwError $ "Duplicate field" ++ s dup ++ " " ++ list dup +-- | Find 'Field' with given 'fName', throw error if unknown.+findField :: String -> [Field] -> P Field+findField s fs = maybe err return $ List.find ((s ==) . fName) fs+ where err = throwError $ "Unknown field '" ++ s ++ "'"+ -- Generic file parser ---------------------------------------------------- +-- | Example:+--+-- @+-- parseGeneric "name:Main--BLA\ndepend:--BLA\n standard-library--BLA\ninclude : . --BLA\n src more-src \n"+-- == Right [("name",["Main"]),("depend",["standard-library"]),("include",[".","src more-src"])]+-- @ parseGeneric :: String -> P GenericFile parseGeneric s = groupLines =<< concat <$> mapM (uncurry parseLine) (zip [1..] $ map stripComments $ lines s) -data GenericLine = Header Int String | Content Int String+type LineNumber = Int++-- | Lines with line numbers.+data GenericLine+ = Header LineNumber String+ -- ^ Header line, like a field name, e.g. "include :". Cannot be indented.+ -- @String@ is 'trim'med.+ | Content LineNumber String+ -- ^ Other line. Must be indented.+ -- @String@ is 'trim'med. deriving (Show) -parseLine :: Int -> String -> P [GenericLine]+-- | Parse line into 'Header' and 'Content' components.+--+-- Precondition: line comments and trailing whitespace have been stripped away.+--+-- Example file:+--+-- @+-- name: Main+-- depend:+-- standard-library+-- include: .+-- src more-src+-- @+--+-- This should give+--+-- @+-- [ Header 1 "name"+-- , Content 1 "Main"+-- , Header 2 "depend"+-- , Content 3 "standard-library"+-- , Header 4 "include"+-- , Content 4 "."+-- , Content 5 "src more-src"+-- ]+-- @+parseLine :: LineNumber -> String -> P [GenericLine] parseLine _ "" = pure [] parseLine l s@(c:_)- | isSpace c = pure [Content l $ trim s]+ -- Indented lines are 'Content'.+ | isSpace c = pure [Content l $ ltrim s]+ -- Non-indented lines are 'Header'. | otherwise = case break (==':') s of+ -- Headers are single words followed by a colon.+ -- Anything after the colon that is not whitespace is 'Content'. (h, ':' : r) -> case words h of- [h] -> pure $ [Header l h] ++ [Content l s | let s = trim r, not (null s)]+ [h] -> pure $ [Header l h] ++ [Content l r' | let r' = ltrim r, not (null r')] [] -> throwError $ show l ++ ": Missing field name" hs -> throwError $ show l ++ ": Bad field name " ++ show h- _ -> throwError $ show l ++ ": Missing ':' for field " ++ show (trim s)+ _ -> throwError $ show l ++ ": Missing ':' for field " ++ show (ltrim s) +-- | Collect 'Header' and subsequent 'Content's into 'GenericEntry'.+--+-- Tailing 'Content's? That's an error.+-- groupLines :: [GenericLine] -> P GenericFile groupLines [] = pure [] groupLines (Content l c : _) = throwError $ show l ++ ": Missing field"-groupLines (Header _ h : ls) = ((h, [ c | Content _ c <- cs ]) :) <$> groupLines ls1+groupLines (Header _ h : ls) = (GenericEntry h [ c | Content _ c <- cs ] :) <$> groupLines ls1 where (cs, ls1) = span isContent ls isContent Content{} = True isContent Header{} = False -trim :: String -> String-trim = stripComments . dropWhile isSpace+-- | Remove leading whitespace and line comment.+trimLineComment :: String -> String+trimLineComment = stripComments . ltrim +-- | Break a comma-separated string. Result strings are @trim@med. splitCommas :: String -> [String] splitCommas s = words $ map (\c -> if c == ',' then ' ' else c) s @@ -124,4 +220,3 @@ where cons c "" | isSpace c = "" cons c s = c : s-
src/full/Agda/Interaction/MakeCase.hs view
@@ -36,6 +36,7 @@ import Agda.Interaction.Options import Agda.Interaction.BasicOps +import Agda.Utils.Function import Agda.Utils.Functor import Agda.Utils.Lens import Agda.Utils.List@@ -124,11 +125,14 @@ -- If s is a variable name in scope, get its de Bruijn index -- via the type checker.- VarName x -> do+ VarName x _ -> do (v, _) <- getVarInfo x case ignoreSharing v of Var i [] -> done $ i - nlocals- _ -> failNotVar+ _ -> typeError . GenericDocError =<< sep+ [ text $ "Cannot split on variable " ++ s ++ ", because it is bound to"+ , prettyTCM v+ ] -- If s is not a name, compare it to the printed variable representation. -- This fallback is to enable splitting on hidden variables.@@ -162,7 +166,7 @@ -- | Entry point for case splitting tactic. -makeCase :: InteractionId -> Range -> String -> TCM (QName, CaseContext , [A.Clause])+makeCase :: InteractionId -> Range -> String -> TCM (QName, CaseContext, [A.Clause]) makeCase hole rng s = withInteractionId hole $ do -- Get function clause which contains the interaction point.@@ -181,8 +185,8 @@ [ text "splitting clause:" , nest 2 $ vcat [ text "f =" <+> prettyTCM f- , text "context =" <+> (prettyTCM =<< getContextTelescope)- , text "tel =" <+> prettyTCM tel+ , text "context =" <+> ((inTopContext . prettyTCM) =<< getContextTelescope)+ , text "tel =" <+> (inTopContext . prettyTCM) tel , text "perm =" <+> text (show perm) , text "ps =" <+> text (show ps) ]@@ -192,9 +196,21 @@ let vars = words s + -- If the user just entered ".", do nothing.+ -- This will expand an ellipsis, if present.++ if concat vars == "." then do+ cl <- makeAbstractClause f rhs $ clauseToSplitClause clause+ return (f, casectxt, [cl])+ -- If we have no split variables, split on result. - if null vars then do+ else if null vars then do+ -- Andreas, 2017-07-24, issue #2654:+ -- When we introduce projection patterns in an extended lambda,+ -- we need to print them postfix.+ let postProjInExtLam = applyWhen (isJust casectxt) $+ withPragmaOptions $ \ opt -> opt { optPostfixProjections = True } (piTel, sc) <- fixTarget $ clauseToSplitClause clause -- Andreas, 2015-05-05 If we introduced new function arguments -- do not split on result. This might be more what the user wants.@@ -207,7 +223,7 @@ -- if any of them is shown by the printer imp <- optShowImplicit <$> pragmaOptions return $ imp || any visible (telToList piTel)- scs <- if newPats then return [sc] else do+ scs <- if newPats then return [sc] else postProjInExtLam $ do res <- splitResult f sc case res of Nothing -> typeError $ GenericError $ "Cannot split on result here"@@ -247,7 +263,7 @@ split :: QName -> [Nat] -> SplitClause -> TCM [(SplitClause, Bool)] split f [] clause = return [(clause,False)] split f (var : vars) clause = do- z <- splitClauseWithAbsurd clause var+ z <- dontAssignMetas $ splitClauseWithAbsurd clause var case z of Left err -> typeError $ SplitError err Right (Left cl) -> return [(cl,True)]@@ -265,7 +281,7 @@ -- In this case, we refuse to split, as this might lose the refinements. checkClauseIsClean :: IPClause -> TCM () checkClauseIsClean ipCl = do- sips <- Map.elems <$> use stSolvedInteractionPoints+ sips <- filter ipSolved . Map.elems <$> use stInteractionPoints when (List.any ((== ipCl) . ipClause) sips) $ typeError $ GenericError $ "Cannot split as clause rhs has been refined. Please reload" @@ -282,7 +298,7 @@ -- We could introduce extra consistency checks, like -- if visible ai then __IMPOSSIBLE__ else -- or passing the parsed name along and comparing it with @x@- setOrigin UserWritten nx+ setOrigin CaseSplit nx | otherwise = nx -- | Make clause with no rhs (because of absurd match).@@ -292,9 +308,9 @@ reportSDoc "interaction.case" 10 $ vcat [ text "Interaction.MakeCase.makeAbsurdClause: split clause:" , nest 2 $ vcat- [ text "context =" <+> (prettyTCM =<< getContextTelescope)- , text "tel =" <+> prettyTCM tel- , text "ps =" <+> text (show ps)+ [ text "context =" <+> do (inTopContext . prettyTCM) =<< getContextTelescope+ , text "tel =" <+> do inTopContext $ prettyTCM tel+ , text "ps =" <+> do inTopContext $ addContext tel $ prettyTCMPatternList ps -- P.sep <$> prettyTCMPatterns ps ] ] withCurrentModule (qnameModule f) $ do@@ -302,7 +318,7 @@ -- Contract implicit record patterns before printing. -- c <- translateRecordPatterns $ Clause noRange tel perm ps NoBody t False -- Jesper, 2015-09-19 Don't contract, since we do on-demand splitting- let c = Clause noRange tel ps Nothing t False+ let c = Clause noRange noRange tel ps Nothing t False Nothing -- Normalise the dot patterns ps <- addContext tel $ normalise $ namedClausePats c reportSDoc "interaction.case" 60 $ text "normalized patterns: " <+> text (show ps)@@ -314,9 +330,9 @@ makeAbstractClause :: QName -> A.RHS -> SplitClause -> TCM A.Clause makeAbstractClause f rhs cl = do - A.Clause lhs _ _ _ _ <- makeAbsurdClause f cl+ lhs <- A.clauseLHS <$> makeAbsurdClause f cl reportSDoc "interaction.case" 60 $ text "reified lhs: " <+> text (show lhs)- return $ A.Clause lhs [] rhs [] False+ return $ A.Clause lhs [] [] rhs [] False -- let ii = InteractionId (-1) -- Dummy interaction point since we never type check this. -- -- Can end up in verbose output though (#1842), hence not __IMPOSSIBLE__. -- let info = A.emptyMetaInfo -- metaNumber = Nothing in order to print as ?, not ?n
src/full/Agda/Interaction/Options.hs view
@@ -1,12 +1,17 @@ {-# LANGUAGE CPP #-} +#if __GLASGOW_HASKELL__ <= 708+{-# LANGUAGE DeriveDataTypeable #-}+#endif+ module Agda.Interaction.Options ( CommandLineOptions(..) , IgnoreFlags(..) , PragmaOptions(..) , OptionsPragma- , Flag, OptM, runOptM+ , Flag, OptM, runOptM, OptDescr(..), ArgDescr(..) , Verbosity+ , WarningMode(..) , checkOpts , parseStandardOptions, parseStandardOptions' , parsePragmaOptions@@ -32,14 +37,14 @@ import Control.Monad ( (>=>), when ) import Control.Monad.Trans --- base-4.7 defines the Functor instances for OptDescr and ArgDescr-#if !(MIN_VERSION_base(4,7,0))-import Data.Orphans ()-#endif- import Data.Either import Data.Maybe import Data.List ( isSuffixOf , intercalate )++#if __GLASGOW_HASKELL__ <= 708+import Data.Typeable ( Typeable )+#endif+ import System.Console.GetOpt ( getOpt', usageInfo, ArgOrder(ReturnInOrder) , OptDescr(..), ArgDescr(..) )@@ -82,6 +87,26 @@ data IgnoreFlags = IgnoreFlags | RespectFlags deriving Eq +-- Potentially turn harmless warnings into nothing, or errors+-- (does not apply to non-fatal errors)+data WarningMode = LeaveAlone | TurnIntoErrors | IgnoreAllWarnings+ deriving (Show, Eq+#if __GLASGOW_HASKELL__ <= 708+ , Typeable+#endif+ )++warningModes :: [ (String, WarningMode) ]+warningModes =+ [ (defaultWarningMode, LeaveAlone)+ , ("ignore" , IgnoreAllWarnings)+ , ("error" , TurnIntoErrors)+ ]++-- Don't forget to update+-- doc/user-manual/tools/command-line-options.rst+-- if you make changes to the command-line options!+ data CommandLineOptions = Options { optProgramName :: String , optInputFile :: Maybe FilePath@@ -98,18 +123,6 @@ , optShowHelp :: Bool , optInteractive :: Bool , optGHCiInteraction :: Bool- , optCompileNoMain :: Bool- , optGhcCompile :: Bool- , optGhcCallGhc :: Bool- , optGhcFlags :: [String]- , optEpicCompile :: Bool- , optJSCompile :: Bool- , optUHCCompile :: Bool- , optUHCBin :: Maybe FilePath- , optUHCTextualCore :: Bool- , optUHCCallUHC :: Bool- , optUHCTraceLevel :: Int- , optUHCFlags :: [String] , optOptimSmashing :: Bool , optCompileDir :: Maybe FilePath -- ^ In the absence of a path the project root is used.@@ -118,15 +131,19 @@ , optGenerateHTML :: Bool , optDependencyGraph :: Maybe FilePath , optLaTeXDir :: FilePath+ , optCountClusters :: Bool+ -- ^ Count extended grapheme clusters rather than code points when+ -- generating LaTeX. , optHTMLDir :: FilePath , optCSSFile :: Maybe FilePath , optIgnoreInterfaces :: Bool , optForcing :: Bool , optPragmaOptions :: PragmaOptions- , optEpicFlags :: [String]- , optSafe :: Bool , optSharing :: Bool , optCaching :: Bool+ , optOnlyScopeChecking :: Bool+ -- ^ Should the top-level module only be scope-checked, and not+ -- type-checked? } deriving Show @@ -160,8 +177,16 @@ -- ^ Should system generated projections 'ProjSystem' be printed -- postfix (True) or prefix (False). , optInstanceSearchDepth :: Int+ , optSafe :: Bool+ , optWarningMode :: WarningMode+ , optCompileNoMain :: Bool }- deriving (Show,Eq)+ deriving ( Show+ , Eq+#if __GLASGOW_HASKELL__ <= 708+ , Typeable+#endif+ ) -- | The options from an @OPTIONS@ pragma. --@@ -195,18 +220,6 @@ , optShowHelp = False , optInteractive = False , optGHCiInteraction = False- , optCompileNoMain = False- , optGhcCompile = False- , optGhcCallGhc = True- , optGhcFlags = []- , optEpicCompile = False- , optJSCompile = False- , optUHCCompile = False- , optUHCBin = Nothing- , optUHCTextualCore = False- , optUHCCallUHC = True- , optUHCTraceLevel = 0- , optUHCFlags = [] , optOptimSmashing = True , optCompileDir = Nothing , optGenerateVimFile = False@@ -214,15 +227,15 @@ , optGenerateHTML = False , optDependencyGraph = Nothing , optLaTeXDir = defaultLaTeXDir+ , optCountClusters = False , optHTMLDir = defaultHTMLDir , optCSSFile = Nothing , optIgnoreInterfaces = False , optForcing = True , optPragmaOptions = defaultPragmaOptions- , optEpicFlags = []- , optSafe = False , optSharing = False , optCaching = False+ , optOnlyScopeChecking = False } defaultPragmaOptions :: PragmaOptions@@ -251,6 +264,9 @@ , optRewriting = False , optPostfixProjections = False , optInstanceSearchDepth = 500+ , optSafe = False+ , optWarningMode = fromJust $ lookup defaultWarningMode warningModes+ , optCompileNoMain = False } -- | The default termination depth.@@ -268,6 +284,12 @@ defaultHTMLDir :: String defaultHTMLDir = "html" +-- | The default warning mode.++defaultWarningMode :: String+defaultWarningMode = "warn"++ type OptM = ExceptT String IO runOptM :: OptM a -> IO (Either String a)@@ -283,37 +305,43 @@ checkOpts :: Flag CommandLineOptions checkOpts opts- | not (atMostOne [optAllowUnsolved . p, \x -> optGhcCompile x]) = throwError- "Unsolved meta variables are not allowed when compiling.\n"- | optCompileNoMain opts && (not (optGhcCompile opts || optUHCCompile opts)) = throwError- "--no-main only allowed in combination with --compile.\n"- | not (atMostOne [optGHCiInteraction, isJust . optInputFile]) =+ | not (matches [optGHCiInteraction, isJust . optInputFile] <= 1) = throwError "Choose at most one: input file or --interaction.\n"- | not (atMostOne $ interactive ++ [\x -> optGhcCompile x, optEpicCompile, optJSCompile]) =- throwError "Choose at most one: compilers/--interactive/--interaction.\n"- | not (atMostOne $ interactive ++ [optGenerateHTML]) =- throwError "Choose at most one: --html/--interactive/--interaction.\n"- | not (atMostOne $ interactive ++ [isJust . optDependencyGraph]) =- throwError "Choose at most one: --dependency-graph/--interactive/--interaction.\n"- | not (atMostOne $ interactive ++ [optGenerateLaTeX]) =- throwError "Choose at most one: --latex/--interactive/--interaction.\n"- | (not . null . optEpicFlags $ opts)- && not (optEpicCompile opts) =- throwError "Cannot set Epic flags without using the Epic backend.\n"- | (isJust $ optUHCBin opts)- && not (optUHCCompile opts) =- throwError "Cannot set uhc binary without using UHC backend.\n"- | (optUHCTextualCore opts)- && not (optUHCCompile opts) =- throwError "Cannot set --uhc-textual-core without using UHC backend.\n"+ | or [ p opts && matches ps > 1 | (p, ps) <- exclusive ] =+ throwError exclusiveMessage | otherwise = return opts where- atMostOne bs = length (filter ($ opts) bs) <= 1+ matches = length . filter ($ opts) - p = optPragmaOptions+ atMostOne =+ [ optGenerateHTML+ , isJust . optDependencyGraph+ ] +++ map fst exclusive - interactive = [optInteractive, optGHCiInteraction]+ exclusive =+ [ ( optOnlyScopeChecking+ , optSafe . optPragmaOptions :+ optGenerateVimFile :+ atMostOne+ )+ , ( optInteractive+ , optGenerateLaTeX : atMostOne+ )+ , ( optGHCiInteraction+ , optGenerateLaTeX : atMostOne+ )+ ] + exclusiveMessage = unlines $+ [ "The options --interactive, --interaction and"+ , "--only-scope-checking cannot be combined with each other or"+ , "with --html or --dependency-graph. Furthermore"+ , "--interactive and --interaction cannot be combined with"+ , "--latex, and --only-scope-checking cannot be combined with"+ , "--safe or --vim."+ ]+ -- | Check for unsafe pramas. Gives a list of used unsafe flags. unsafePragmaOptions :: PragmaOptions -> [String]@@ -341,7 +369,7 @@ helpFlag :: Flag CommandLineOptions helpFlag o = return $ o { optShowHelp = True } -safeFlag :: Flag CommandLineOptions+safeFlag :: Flag PragmaOptions safeFlag o = return $ o { optSafe = True } sharingFlag :: Bool -> Flag CommandLineOptions@@ -380,6 +408,18 @@ latexFlag :: Flag CommandLineOptions latexFlag o = return $ o { optGenerateLaTeX = True } +onlyScopeCheckingFlag :: Flag CommandLineOptions+onlyScopeCheckingFlag o = return $ o { optOnlyScopeChecking = True }++countClustersFlag :: Flag CommandLineOptions+countClustersFlag o =+#ifdef COUNT_CLUSTERS+ return $ o { optCountClusters = True }+#else+ throwError+ "Cluster counting has not been enabled in this build of Agda."+#endif+ latexDirFlag :: FilePath -> Flag CommandLineOptions latexDirFlag d o = return $ o { optLaTeXDir = d } @@ -462,55 +502,12 @@ { optAllowUnsolved = True } } -compileFlagNoMain :: Flag CommandLineOptions+compileFlagNoMain :: Flag PragmaOptions compileFlagNoMain o = return $ o { optCompileNoMain = True } -compileGhcFlag :: Flag CommandLineOptions-compileGhcFlag o = return $ o { optGhcCompile = True }--ghcDontCallGhcFlag :: Flag CommandLineOptions-ghcDontCallGhcFlag o = return $ o { optGhcCallGhc = False }---- NOTE: Quadratic in number of flags.-ghcFlag :: String -> Flag CommandLineOptions-ghcFlag f o = return $ o { optGhcFlags = optGhcFlags o ++ [f] }---- The Epic backend has been removed. See Issue 1481.-compileEpicFlag :: Flag CommandLineOptions--- compileEpicFlag o = return $ o { optEpicCompile = True}-compileEpicFlag o = throwError "the Epic backend has been disabled"--compileJSFlag :: Flag CommandLineOptions-compileJSFlag o = return $ o { optJSCompile = True }--compileUHCFlag :: Flag CommandLineOptions-compileUHCFlag o = return $ o { optUHCCompile = True}- compileDirFlag :: FilePath -> Flag CommandLineOptions compileDirFlag f o = return $ o { optCompileDir = Just f } --- NOTE: Quadratic in number of flags.--- The Epic backend has been removed. See Issue 1481.-epicFlagsFlag :: String -> Flag CommandLineOptions--- epicFlagsFlag s o = return $ o { optEpicFlags = optEpicFlags o ++ [s] }-epicFlagsFlag s o = throwError "the Epic backend has been disabled"--uhcBinFlag :: String -> Flag CommandLineOptions-uhcBinFlag s o = return $ o { optUHCBin = Just s }--uhcTextualCoreFlag :: Flag CommandLineOptions-uhcTextualCoreFlag o = return $ o { optUHCTextualCore = True }--uhcDontCallUHCFlag :: Flag CommandLineOptions-uhcDontCallUHCFlag o = return $ o { optUHCCallUHC = False }--uhcTraceLevelFlag :: String -> Flag CommandLineOptions--- TODO proper parsing and error handling-uhcTraceLevelFlag i o = return $ o { optUHCTraceLevel = read i }--uhcFlagsFlag :: String -> Flag CommandLineOptions-uhcFlagsFlag s o = return $ o { optUHCFlags = optUHCFlags o ++ [s] }- htmlFlag :: Flag CommandLineOptions htmlFlag o = return $ o { optGenerateHTML = True } @@ -553,6 +550,15 @@ return (init ss, n) usage = throwError "argument to verbose should be on the form x.y.z:N or N" +warningModeFlag :: String -> Flag PragmaOptions+warningModeFlag s o =+ case lookup s warningModes of+ Just m -> return $ o { optWarningMode = m }+ Nothing -> usage+ where+ usage = throwError $ "unknown warning mode (available: " +++ intercalate ", " (map fst warningModes) ++ ")"+ terminationDepthFlag :: String -> Flag PragmaOptions terminationDepthFlag s o = do k <- readM s `catchError` \_ -> usage@@ -573,35 +579,10 @@ "start in interactive mode" , Option [] ["interaction"] (NoArg ghciInteractionFlag) "for use with the Emacs mode"- , Option ['c'] ["compile", "ghc"] (NoArg compileGhcFlag)- "compile program using the GHC backend"- , Option [] ["ghc-dont-call-ghc"] (NoArg ghcDontCallGhcFlag) "Don't call ghc, just write the GHC Haskell files."- , Option [] ["ghc-flag"] (ReqArg ghcFlag "GHC-FLAG")- "give the flag GHC-FLAG to GHC when compiling using the GHC backend"- , Option [] ["no-main"] (NoArg compileFlagNoMain)- "when compiling using the GHC backend or the UHC backend (experimental), do not treat the requested module as the main module of a program" - -- The Epic backend has been removed. See Issue 1481.- , Option [] ["epic"] (NoArg compileEpicFlag)- -- "compile program using the Epic backend"- "the Epic backend has been removed"-- , Option [] ["js"] (NoArg compileJSFlag) "compile program using the JS backend"- , Option [] ["uhc"] (NoArg compileUHCFlag) "compile program using the UHC backend"- , Option [] ["uhc-bin"] (ReqArg uhcBinFlag "UHC") "The uhc binary to use when compiling with the UHC backend."- , Option [] ["uhc-textual-core"] (NoArg uhcTextualCoreFlag) "Use textual core as intermediate representation instead of binary core."- , Option [] ["uhc-dont-call-uhc"] (NoArg uhcDontCallUHCFlag) "Don't call uhc, just write the UHC Core files."- , Option [] ["uhc-gen-trace"] (ReqArg uhcTraceLevelFlag "TRACE") "Add tracing code to generated executable."- , Option [] ["uhc-flag"] (ReqArg uhcFlagsFlag "UHC-FLAG")- "give the flag UHC-FLAG to UHC when compiling using the UHC backend" , Option [] ["compile-dir"] (ReqArg compileDirFlag "DIR") ("directory for compiler output (default: the project root)") - -- The Epic backend has been removed. See Issue 1481.- , Option [] ["epic-flag"] (ReqArg epicFlagsFlag "EPIC-FLAG")- -- "give the flag EPIC-FLAG to Epic when compiling using Epic"- "the Epic backend has been removed"- , Option [] ["vim"] (NoArg vimFlag) "generate Vim highlighting files" , Option [] ["latex"] (NoArg latexFlag)@@ -609,15 +590,24 @@ , Option [] ["latex-dir"] (ReqArg latexDirFlag "DIR") ("directory in which LaTeX files are placed (default: " ++ defaultLaTeXDir ++ ")")+ , Option [] ["count-clusters"] (NoArg countClustersFlag)+ ("count extended grapheme clusters when " +++ "generating LaTeX (note that this flag " +++#ifdef COUNT_CLUSTERS+ "is not enabled in all builds of Agda)"+#else+ "has not been enabled in this build of Agda)"+#endif+ ) , Option [] ["html"] (NoArg htmlFlag) "generate HTML files with highlighted source code"- , Option [] ["dependency-graph"] (ReqArg dependencyGraphFlag "FILE")- "generate a Dot file with a module dependency graph" , Option [] ["html-dir"] (ReqArg htmlDirFlag "DIR") ("directory in which HTML files are placed (default: " ++ defaultHTMLDir ++ ")") , Option [] ["css"] (ReqArg cssFlag "URL") "the CSS file used by the HTML files (can be relative)"+ , Option [] ["dependency-graph"] (ReqArg dependencyGraphFlag "FILE")+ "generate a Dot file with a module dependency graph" , Option [] ["ignore-interfaces"] (NoArg ignoreInterfacesFlag) "ignore interface files (re-type check everything)" , Option ['i'] ["include-path"] (ReqArg includeFlag "DIR")@@ -632,8 +622,6 @@ "don't use default libraries" , Option [] ["no-forcing"] (NoArg noForcingFlag) "disable the forcing optimisation"- , Option [] ["safe"] (NoArg safeFlag)- "disable postulates, unsafe OPTION pragmas and primTrustMe" , Option [] ["sharing"] (NoArg $ sharingFlag True) "enable sharing and call-by-need evaluation (experimental) (default: OFF)" , Option [] ["no-sharing"] (NoArg $ sharingFlag False)@@ -642,6 +630,8 @@ "enable caching of typechecking (experimental) (default: OFF)" , Option [] ["no-caching"] (NoArg $ cachingFlag False) "disable caching of typechecking"+ , Option [] ["only-scope-checking"] (NoArg onlyScopeCheckingFlag)+ "only scope-check the top-level module, do not type-check it" ] ++ map (fmap lift) pragmaOptions where lift :: Flag PragmaOptions -> Flag CommandLineOptions@@ -660,7 +650,7 @@ -- , Option [] ["proof-irrelevance"] (NoArg proofIrrelevanceFlag) -- "enable proof irrelevance (experimental feature)" , Option [] ["allow-unsolved-metas"] (NoArg allowUnsolvedFlag)- "allow unsolved meta variables (only needed in batch mode)"+ "succeed and create interface file regardless of unsolved meta variables" , Option [] ["no-positivity-check"] (NoArg noPositivityFlag) "do not warn about not strictly positive data types" , Option [] ["no-termination-check"] (NoArg dontTerminationCheckFlag)@@ -698,17 +688,25 @@ , Option [] ["no-pattern-matching"] (NoArg noPatternMatchingFlag) "disable pattern matching completely" , Option [] ["exact-split"] (NoArg exactSplitFlag)- "require all clauses in a definition by pattern matching to hold as definitional equalities (except those marked as CATCHALL)"+ "require all clauses in a definition to hold as definitional equalities (unless marked CATCHALL)" , Option [] ["no-exact-split"] (NoArg noExactSplitFlag)- "do not require all clauses in a definition by pattern matching to hold as definitional equalities (ignore those marked as CATCHALL)"+ "do not require all clauses in a definition to hold as definitional equalities (default)" , Option [] ["no-eta-equality"] (NoArg noEtaFlag)- "disable eta rules for records"+ "default records to no-eta-equality" , Option [] ["rewriting"] (NoArg rewritingFlag) "enable declaration and use of REWRITE rules" , Option [] ["postfix-projections"] (NoArg postfixProjectionsFlag) "make postfix projection notation the default" , Option [] ["instance-search-depth"] (ReqArg instanceDepthFlag "N") "set instance search depth to N (default: 500)"+ , Option [] ["safe"] (NoArg safeFlag)+ "disable postulates, unsafe OPTION pragmas and primTrustMe"+ , Option ['W'] ["warning"] (ReqArg warningModeFlag "MODE")+ ("set warning mode to MODE (available: "+ ++ intercalate ", " (map fst warningModes)+ ++ ". Default: " ++ defaultWarningMode ++ ")")+ , Option [] ["no-main"] (NoArg compileFlagNoMain)+ "do not treat the requested module as the main module of a program when compiling" ] -- | Used for printing usage info.
src/full/Agda/Interaction/Options/Lenses.hs view
@@ -105,9 +105,13 @@ setSafeMode = mapSafeMode . const mapSafeMode f a = setSafeMode (f $ getSafeMode a) a -instance LensSafeMode CommandLineOptions where+instance LensSafeMode PragmaOptions where getSafeMode = optSafe setSafeMode is opts = opts { optSafe = is }++instance LensSafeMode CommandLineOptions where+ getSafeMode = getSafeMode . getPragmaOptions+ mapSafeMode = mapPragmaOptions . mapSafeMode instance LensSafeMode PersistentTCState where getSafeMode = getSafeMode . getCommandLineOptions
src/full/Agda/Interaction/Response.hs view
@@ -33,7 +33,7 @@ -- so the user can have timely response even during long computations. data Response- = Resp_HighlightingInfo HighlightingInfo ModuleToSource+ = Resp_HighlightingInfo HighlightingInfo HighlightingMethod ModuleToSource | Resp_Status Status | Resp_JumpToError FilePath Int32 | Resp_InteractionPoints [InteractionId]@@ -46,6 +46,9 @@ -- ^ The integer is the message's debug level. | Resp_ClearRunningInfo | Resp_ClearHighlighting+ | Resp_DoneAborting+ -- ^ A command sent when an abort command has completed+ -- successfully. -- | There are two kinds of \"make case\" commands. @@ -54,7 +57,8 @@ -- | Info to display at the end of an interactive command data DisplayInfo- = Info_CompilationOk+ = Info_CompilationOk String String+ -- ^ Strings are the warnings and the (non-fatal) errors | Info_Constraints String | Info_AllGoalsWarnings String String String -- ^ Strings are the goals, the warnings and the (non-fatal) errors@@ -119,7 +123,7 @@ -- closure of the 'InteractionOutputCallback' function. -- (suitable for intra-process communication). -type InteractionOutputCallback = Response -> TCM ()+type InteractionOutputCallback = Response -> IO () -- | The default 'InteractionOutputCallback' function prints certain -- things to stdout (other things generate internal errors).@@ -139,3 +143,4 @@ hFlush stdout Resp_ClearRunningInfo {} -> __IMPOSSIBLE__ Resp_ClearHighlighting {} -> __IMPOSSIBLE__+ Resp_DoneAborting {} -> __IMPOSSIBLE__
src/full/Agda/Interaction/SearchAbout.hs view
@@ -2,64 +2,65 @@ import Control.Applicative import Control.Monad-import Control.Monad.State+ import qualified Data.Map as Map+import qualified Data.Set as Set import Data.List (isInfixOf) import Data.Either (partitionEithers) import Agda.Syntax.Position (Range) import Agda.Syntax.Scope.Base import Agda.Syntax.Scope.Monad-import Agda.TypeChecking.Monad-import qualified Agda.Syntax.Common as Com-import Agda.Syntax.Internal-import Agda.Interaction.BasicOps (normalForm)-import qualified Agda.Syntax.Translation.ConcreteToAbstract as TCA-import qualified Agda.Syntax.Abstract as A+import Agda.TypeChecking.Monad.Signature+import Agda.TypeChecking.Monad.Env+import Agda.Syntax.Internal.Names (namesIn)+import Agda.Interaction.BasicOps (normalForm, Rewrite, parseName)+ import qualified Agda.Syntax.Concrete as C+import qualified Agda.Syntax.Abstract as A+import qualified Agda.Syntax.Internal as I -import Agda.Interaction.BasicOps-import Debug.Trace+import Agda.Utils.Pretty ( prettyShow ) -collectNamesInType :: Type -> [A.QName]-collectNamesInType = collectNamesInTerm . unEl+findMentions :: Rewrite -> Range -> String -> ScopeM [(C.Name, I.Type)]+findMentions norm rg nm = do+ -- We start by dealing with the user's input -collectNamesInTerm :: Term -> [A.QName]-collectNamesInTerm (Var _ els) = collectNamesInElims els-collectNamesInTerm (Lam ty t) = collectNamesInTerm $ unAbs t-collectNamesInTerm (Def n els) = n : collectNamesInElims els-collectNamesInTerm (Con n _ args) = conName n : collectNamesInArgs args-collectNamesInTerm (Pi dom cod) = collectNamesInType (Com.unDom dom) ++ collectNamesInType (unAbs cod)-collectNamesInTerm (Shared t) = collectNamesInTerm $ ignoreSharing $ derefPtr t-collectNamesInTerm _ = []+ -- The users passes in `nm`, a list of identifiers and strings+ -- to match against definitions in scope. `findMentions` will+ -- select all of the definitions such that:+ -- - all of the specified identifiers appear in their type+ -- (which has been normalised according to `norm`)+ -- - all of the specified strings are substrings of their name -collectNamesInElims :: Elims -> [A.QName]-collectNamesInElims = concatMap collectNamesInElim+ -- We separate the strings from the names by a rough analysis+ -- and then parse and resolve the names in the current scope+ let (userSubStrings, nms) = partitionEithers $ isString <$> words nm+ rnms <- mapM (parseName rg >=> resolveName) nms+ let userIdentifiers = fmap (fmap anameName . anames) rnms -collectNamesInElim :: Elim -> [A.QName]-collectNamesInElim (Apply a) = collectNamesInTerm $ Com.unArg a-collectNamesInElim (Proj _ n)= [n]+ -- We then collect all the things in scope, by name.+ -- Issue #2381: We explicitly filter out pattern synonyms because they+ -- don't have a type. Looking it up makes Agda panic!+ snms <- fmap (nsNames . allThingsInScope) $ currentModule >>= getNamedScope+ let namesInScope = filter ((PatternSynName /=) . anameKind . snd)+ $ concatMap (uncurry $ map . (,)) $ Map.toList snms -collectNamesInArgs :: Args -> [A.QName]-collectNamesInArgs = concatMap (collectNamesInTerm . Com.unArg)+ -- Once we have the user-provided names and the names of all the+ -- thing in scope we can start the search: for each name in scope,+ -- we grab its type, normalise it according to `norm` and collect+ -- the identifiers in it. We then check whether it meets the user's+ -- criteria.+ ress <- forM namesInScope $ \ (x, n) -> do+ t <- normalForm norm =<< typeOfConst (anameName n)+ let namesInT = Set.toList $ namesIn t+ let defName = prettyShow x+ return $ do+ guard $ all (`isInfixOf` defName) userSubStrings+ guard $ all (any (`elem` namesInT)) userIdentifiers+ return (x, t)+ return $ concat ress -findMentions :: Rewrite -> Range -> String -> TCM [(C.Name, Type)]-findMentions norm rg nm = do- let (strs, nms) = partitionEithers $ fmap isString $ words nm- cnms <- mapM (parseName rg) nms- rnms <- mapM resolveName cnms- let defs = fmap (fmap anameName . anames) rnms- scp <- getNamedScope =<< currentModule- let names = nsNames $ allThingsInScope scp- concat <$> mapM (\ (x, n) -> do- t <- normalForm norm =<< typeOfConst (anameName n)- let defName = show x- let namesInT = collectNamesInType t- return $ do- guard (all (`isInfixOf` defName) strs)- guard (all (any (`elem` namesInT)) defs)- return (x, t)- ) (concatMap (\ (x, ns) -> map ((,) x) ns) $ Map.toList names) where isString str | not (null str)@@ -70,5 +71,4 @@ anames (DefinedName _ an) = [an] anames (FieldName ans) = ans anames (ConstructorName ans) = ans- anames (PatternSynResName an) = [an] anames _ = []
src/full/Agda/Main.hs view
@@ -11,6 +11,7 @@ import System.Environment import System.Exit+import System.Console.GetOpt import Agda.Syntax.Position (Range) import Agda.Syntax.Concrete.Pretty ()@@ -29,14 +30,15 @@ import Agda.TypeChecking.Monad import qualified Agda.TypeChecking.Monad.Benchmark as Bench import Agda.TypeChecking.Errors+import Agda.TypeChecking.Warnings import Agda.TypeChecking.Pretty import Agda.Compiler.Common (IsMain (..))-import Agda.Compiler.MAlonzo.Compiler as MAlonzo-import Agda.Compiler.Epic.Compiler as Epic-import Agda.Compiler.JS.Compiler as JS-import Agda.Compiler.UHC.Compiler as UHC+import Agda.Compiler.MAlonzo.Compiler (ghcBackend)+import Agda.Compiler.JS.Compiler (jsBackend) +import Agda.Compiler.Backend+ import Agda.Utils.Lens import Agda.Utils.Monad import Agda.Utils.String@@ -46,78 +48,79 @@ import qualified Agda.Utils.Benchmark as UtilsBench import Agda.Utils.Except ( MonadError(catchError, throwError) ) import Agda.Utils.Impossible+import Agda.Utils.Lens #include "undefined.h" +builtinBackends :: [Backend]+builtinBackends = [ ghcBackend, jsBackend ]+ -- | The main function-runAgda :: TCM ()-runAgda = do+runAgda :: [Backend] -> IO ()+runAgda backends = runAgda' $ builtinBackends ++ backends++runAgda' :: [Backend] -> IO ()+runAgda' backends = runTCMPrettyErrors $ do progName <- liftIO getProgName argv <- liftIO getArgs- opts <- liftIO $ runOptM $ parseStandardOptions argv+ opts <- liftIO $ runOptM $ parseBackendOptions backends argv case opts of- Left err -> liftIO $ optionError err- Right opts -> runAgdaWithOptions generateHTML progName opts+ Left err -> liftIO $ optionError err+ Right (bs, opts) -> do+ stBackends .= bs+ let enabled (Backend b) = isEnabled b (options b)+ bs' = filter enabled bs+ () <$ runAgdaWithOptions backends generateHTML (interaction bs') progName opts+ where+ interaction bs = backendInteraction bs $ defaultInteraction opts +defaultInteraction :: CommandLineOptions -> TCM (Maybe Interface) -> TCM ()+defaultInteraction opts+ | i = runIM . interactionLoop+ | ghci = mimicGHCi . (failIfInt =<<)+ | otherwise = (() <$)+ where+ i = optInteractive opts+ ghci = optGHCiInteraction opts++ failIfInt Nothing = return ()+ failIfInt (Just _) = __IMPOSSIBLE__++ -- | Run Agda with parsed command line options and with a custom HTML generator runAgdaWithOptions- :: TCM () -- ^ HTML generating action+ :: [Backend] -- ^ Backends only for printing usage and version information+ -> TCM () -- ^ HTML generating action+ -> (TCM (Maybe Interface) -> TCM a) -- ^ Backend interaction -> String -- ^ program name -> CommandLineOptions -- ^ parsed command line options- -> TCM ()-runAgdaWithOptions generateHTML progName opts- | optShowHelp opts = liftIO printUsage- | optShowVersion opts = liftIO printVersion+ -> TCM (Maybe a)+runAgdaWithOptions backends generateHTML interaction progName opts+ | optShowHelp opts = Nothing <$ liftIO (printUsage backends)+ | optShowVersion opts = Nothing <$ liftIO (printVersion backends) | isNothing (optInputFile opts) && not (optInteractive opts) && not (optGHCiInteraction opts)- = liftIO printUsage+ = Nothing <$ liftIO (printUsage backends) | otherwise = do -- Main function. -- Bill everything to root of Benchmark trie.- UtilsBench.setBenchmarking True+ UtilsBench.setBenchmarking UtilsBench.BenchmarkOn -- Andreas, Nisse, 2016-10-11 AIM XXIV -- Turn benchmarking on provisionally, otherwise we lose track of time spent -- on e.g. LaTeX-code generation. -- Benchmarking might be turned off later by setCommandlineOptions Bench.billTo [] checkFile `finally_` do+ -- Print benchmarks. Bench.print -- Print accumulated statistics. printStatistics 20 Nothing =<< use lensAccumStatistics where- checkFile :: TCM ()- checkFile = do- let i = optInteractive opts- ghci = optGHCiInteraction opts- ghc = optGhcCompile opts- compileNoMain = optCompileNoMain opts- epic = optEpicCompile opts- js = optJSCompile opts- uhc = optUHCCompile opts- when i $ liftIO $ putStr splashScreen- let failIfNoInt (Just i) = return i- -- The allowed combinations of command-line- -- options should rule out Nothing here.- failIfNoInt Nothing = __IMPOSSIBLE__-- failIfInt Nothing = return ()- failIfInt (Just _) = __IMPOSSIBLE__-- interaction :: TCM (Maybe Interface) -> TCM ()- interaction | i = runIM . interactionLoop- | ghci = mimicGHCi . (failIfInt =<<)- | ghc && compileNoMain- = (MAlonzo.compilerMain NotMain =<<) . (failIfNoInt =<<)- | ghc = (MAlonzo.compilerMain IsMain =<<) . (failIfNoInt =<<)- | epic = (Epic.compilerMain =<<) . (failIfNoInt =<<)- | js = (JS.compilerMain =<<) . (failIfNoInt =<<)- | uhc && compileNoMain- = (UHC.compilerMain NotMain =<<) . (failIfNoInt =<<)- | uhc = (UHC.compilerMain IsMain =<<) . (failIfNoInt =<<)- | otherwise = (() <$)+ checkFile = Just <$> do+ when (optInteractive opts) $ liftIO $ putStr splashScreen interaction $ do setCommandLineOptions opts hasFile <- hasInputFile@@ -127,17 +130,23 @@ -- thus, I am removing it. -- resetState if not hasFile then return Nothing else do+ let mode = if optOnlyScopeChecking opts+ then Imp.ScopeCheck+ else Imp.TypeCheck+ file <- getInputFile- (i, mw) <- Imp.typeCheckMain file+ (i, mw) <- Imp.typeCheckMain file mode - -- An interface is only generated if NoWarnings.- result <- case mw of- SomeWarnings ws -> do+ -- An interface is only generated if the mode is+ -- Imp.TypeCheck and there are no warnings.+ result <- case (mode, mw) of+ (Imp.ScopeCheck, _) -> return Nothing+ (_, NoWarnings) -> return $ Just i+ (_, SomeWarnings ws) -> do ws' <- applyFlagsToTCWarnings RespectFlags ws case ws' of [] -> return Nothing cuws -> tcWarningsToError cuws- NoWarnings -> return $ Just i reportSDoc "main" 50 $ pretty i @@ -150,31 +159,52 @@ whenM (optGenerateLaTeX <$> commandLineOptions) $ LaTeX.generateLaTeX i + -- Print accumulated warnings+ ws <- (snd . classifyWarnings) <$> Imp.getAllWarnings' AllWarnings RespectFlags+ unless (null ws) $ do+ let banner = text $ "\n" ++ delimiter "All done; warnings encountered"+ reportSDoc "warning" 1 $+ vcat $ punctuate (text "\n") $ banner : (prettyTCM <$> ws)+ return result ++ -- | Print usage information.-printUsage :: IO ()-printUsage = do+printUsage :: [Backend] -> IO ()+printUsage backends = do progName <- getProgName putStr $ usage standardOptions_ progName+ mapM_ (putStr . backendUsage) backends +backendUsage :: Backend -> String+backendUsage (Backend b) =+ usageInfo ("\n" ++ backendName b ++ " backend options") $+ map (fmap $ const ()) (commandLineFlags b)+ -- | Print version information.-printVersion :: IO ()-printVersion = do+printVersion :: [Backend] -> IO ()+printVersion backends = do putStrLn $ "Agda version " ++ versionWithCommitInfo+ mapM_ putStrLn+ [ " - " ++ name ++ " backend version " ++ ver+ | Backend Backend'{ backendName = name, backendVersion = Just ver } <- backends ] -- | What to do for bad options. optionError :: String -> IO () optionError err = do- putStrLn $ "Error: " ++ err ++ "\nRun 'agda --help' for help on command line options."+ prog <- getProgName+ putStrLn $ "Error: " ++ err ++ "\nRun '" ++ prog ++ " --help' for help on command line options." exitFailure -- | Run a TCM action in IO; catch and pretty print errors. runTCMPrettyErrors :: TCM () -> IO () runTCMPrettyErrors tcm = do r <- runTCMTop $ tcm `catchError` \err -> do- s <- prettyError err- unless (null s) (liftIO $ putStrLn s)+ s2s <- prettyTCWarnings' =<< Imp.errorWarningsOfTCErr err+ s1 <- prettyError err+ let ss = filter (not . null) $ s2s ++ [s1]+ unless (null s1) (liftIO $ putStr $ unlines ss) throwError err case r of Right _ -> exitSuccess@@ -185,4 +215,4 @@ -- | Main main :: IO ()-main = runTCMPrettyErrors runAgda+main = runAgda []
src/full/Agda/Syntax/Abstract.hs view
@@ -22,9 +22,11 @@ import Data.Sequence (Seq, (<|), (><)) import qualified Data.Sequence as Seq import Data.Traversable-import Data.Typeable (Typeable) import Data.Void +import Data.Data (Data)+import Data.Typeable (Typeable)+ import Agda.Syntax.Concrete.Name (NumHoles(..)) import Agda.Syntax.Concrete (FieldAssignment'(..), exprFieldA) import qualified Agda.Syntax.Concrete as C@@ -71,9 +73,9 @@ | Dot ExprInfo Expr -- ^ @.e@, for postfix projection. | App ExprInfo Expr (NamedArg Expr) -- ^ Ordinary (binary) application. | WithApp ExprInfo Expr [Expr] -- ^ With application.- | Lam ExprInfo LamBinding Expr -- ^ @λ bs → e@.- | AbsurdLam ExprInfo Hiding -- ^ @λ()@ or @λ{}@.- | ExtendedLam ExprInfo DefInfo QName [Clause]+ | Lam LamInfo LamBinding Expr -- ^ @λ bs → e@.+ | AbsurdLam LamInfo Hiding -- ^ @λ()@ or @λ{}@.+ | ExtendedLam LamInfo DefInfo QName [Clause] | Pi ExprInfo Telescope Expr -- ^ Dependent function space @Γ → A@. | Fun ExprInfo (Arg Expr) Expr -- ^ Non-dependent function space. | Set ExprInfo Integer -- ^ @Set@, @Set1@, @Set2@, ...@@ -91,7 +93,7 @@ | Tactic ExprInfo Expr [NamedArg Expr] [NamedArg Expr] -- ^ @tactic e x1 .. xn | y1 | .. | yn@ | DontCare Expr -- ^ For printing @DontCare@ from @Syntax.Internal@.- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) -- | Record field assignment @f = e@. type Assign = FieldAssignment' Expr@@ -104,7 +106,7 @@ = FunSig -- ^ A function signature. | NoFunSig -- ^ Not a function signature, i.e., a postulate (in user input) -- or another (e.g. data/record) type signature (internally).- deriving (Typeable, Eq, Ord, Show)+ deriving (Typeable, Data, Eq, Ord, Show) -- | Renaming (generic). type Ren a = [(a, a)]@@ -112,7 +114,7 @@ data ScopeCopyInfo = ScopeCopyInfo { renModules :: Ren ModuleName , renNames :: Ren QName }- deriving (Eq, Show)+ deriving (Eq, Show, Typeable, Data) initCopyInfo :: ScopeCopyInfo initCopyInfo = ScopeCopyInfo@@ -146,19 +148,19 @@ -- ^ only retained for highlighting purposes | FunDef DefInfo QName Delayed [Clause] -- ^ sequence of function clauses | DataSig DefInfo QName Telescope Expr -- ^ lone data signature- -- ^ the 'LamBinding's are 'DomainFree' and binds the parameters of the datatype. | DataDef DefInfo QName [LamBinding] [Constructor]- -- ^ the 'LamBinding's are 'DomainFree' and binds the parameters of the datatype.+ -- ^ the 'LamBinding's are 'DomainFree' and bind the parameters of the datatype. | RecSig DefInfo QName Telescope Expr -- ^ lone record signature | RecDef DefInfo QName (Maybe (Ranged Induction)) (Maybe Bool) (Maybe QName) [LamBinding] Expr [Declaration]- -- ^ The 'Expr' gives the constructor type telescope, @(x1 : A1)..(xn : An) -> Prop@,+ -- ^ The 'LamBinding's are 'DomainFree' and bind the parameters of the datatype.+ -- The 'Expr' gives the constructor type telescope, @(x1 : A1)..(xn : An) -> Prop@, -- and the optional name is the constructor's name. | PatternSynDef QName [Arg Name] (Pattern' Void) -- ^ Only for highlighting purposes | UnquoteDecl MutualInfo [DefInfo] [QName] Expr | UnquoteDef [DefInfo] [QName] Expr | ScopedDecl ScopeInfo [Declaration] -- ^ scope annotation- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) class GetDefInfo a where getDefInfo :: a -> Maybe DefInfo@@ -184,7 +186,7 @@ -- ^ @tel. M args@: applies @M@ to @args@ and abstracts @tel@. | RecordModuleIFS ModuleName -- ^ @M {{...}}@- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) data Pragma = OptionsPragma [String]@@ -193,19 +195,22 @@ -- ^ Builtins that do not come with a definition, -- but declare a name for an Agda concept. | RewritePragma QName+ | CompilePragma String QName String | CompiledPragma QName String | CompiledExportPragma QName String- | CompiledDeclareDataPragma QName String | CompiledTypePragma QName String | CompiledDataPragma QName String [String]- | CompiledEpicPragma QName String | CompiledJSPragma QName String | CompiledUHCPragma QName String | CompiledDataUHCPragma QName String [String] | StaticPragma QName+ | EtaPragma QName+ -- ^ For coinductive records, use pragma instead of regular+ -- @eta-equality@ definition (as it is might make Agda loop).+ | InjectivePragma QName | InlinePragma QName | DisplayPragma QName [NamedArg Pattern] Expr- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) -- | Bindings that are valid in a @let@. data LetBinding@@ -221,7 +226,7 @@ | LetDeclaredVariable Name -- ^ Only used for highlighting. Refers to the first occurrence of -- @x@ in @let x : A; x = e@.- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) -- | Only 'Axiom's. type TypeSignature = Declaration@@ -232,12 +237,12 @@ data LamBinding = DomainFree ArgInfo Name -- ^ . @x@ or @{x}@ or @.x@ or @.{x}@ | DomainFull TypedBindings -- ^ . @(xs:e)@ or @{xs:e}@ or @(let Ds)@- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) -- | Typed bindings with hiding information. data TypedBindings = TypedBindings Range (Arg TypedBinding) -- ^ . @(xs : e)@ or @{xs : e}@- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) -- | A typed binding. Appears in dependent function spaces, typed lambdas, and -- telescopes. It might be tempting to simplify this to only bind a single@@ -258,16 +263,20 @@ -- ^ As in telescope @(x y z : A)@ or type @(x y z : A) -> B@. | TLet Range [LetBinding] -- ^ E.g. @(let x = e)@ or @(let open M)@.- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) type Telescope = [TypedBindings] data NamedDotPattern = NamedDot Name I.Term I.Type- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) -instance Eq NamedDotPattern where- _ == _ = True -- These are not relevant for caching purposes+data StrippedDotPattern = StrippedDot Expr I.Term I.Type+ deriving (Typeable, Data, Show) +-- These are not relevant for caching purposes+instance Eq NamedDotPattern where _ == _ = True+instance Eq StrippedDotPattern where _ == _ = True+ -- | We could throw away @where@ clauses at this point and translate them to -- @let@. It's not obvious how to remember that the @let@ was really a -- @where@ clause though, so for the time being we keep it here.@@ -276,10 +285,14 @@ , clauseNamedDots :: [NamedDotPattern] -- ^ Only in with-clauses where we inherit some already checked dot patterns from the parent. -- These live in the context of the parent clause left-hand side.+ , clauseStrippedDots :: [StrippedDotPattern]+ -- ^ In with-clauses where a dot pattern from the parent clause is+ -- repeated in the with-clause. In this case it's not actually part of+ -- the clause, but it still needs to be checked (Issue 142). , clauseRHS :: RHS , clauseWhereDecls :: [Declaration] , clauseCatchall :: Bool- } deriving (Typeable, Show, Functor, Foldable, Traversable, Eq)+ } deriving (Typeable, Data, Show, Functor, Foldable, Traversable, Eq) type Clause = Clause' LHS type SpineClause = Clause' SpineLHS@@ -305,7 +318,7 @@ -- ^ The where clauses are attached to the @RewriteRHS@ by --- the scope checker (instead of to the clause). }- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) instance Eq RHS where RHS e _ == RHS e' _ = e == e'@@ -323,7 +336,7 @@ , spLhsPats :: [NamedArg Pattern] -- ^ Function parameters (patterns). , spLhsWithPats :: [Pattern] -- ^ @with@ patterns (after @|@). }- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) instance Eq LHS where@@ -336,7 +349,7 @@ , lhsCore :: LHSCore -- ^ Copatterns. , lhsWithPats :: [Pattern] -- ^ @with@ patterns (after @|@). }- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) -- | The lhs minus @with@-patterns in projection-application view. -- Parameterised over the type @e@ of dot patterns.@@ -353,7 +366,7 @@ , lhsPatsRight :: [NamedArg (Pattern' e)] -- ^ Further applied to patterns. }- deriving (Typeable, Show, Functor, Foldable, Traversable, Eq)+ deriving (Typeable, Data, Show, Functor, Foldable, Traversable, Eq) type LHSCore = LHSCore' Expr @@ -444,11 +457,14 @@ -- Or generated at type checking for implicit arguments. | AsP PatInfo Name (Pattern' e) | DotP PatInfo Origin e+ -- ^ Dot pattern @.e@: the Origin keeps track whether this dot pattern was+ -- written by the user or inserted by the system (e.g. while expanding+ -- the ellipsis in a with clause). | AbsurdP PatInfo | LitP Literal | PatternSynP PatInfo QName [NamedArg (Pattern' e)] | RecP PatInfo [FieldAssignment' (Pattern' e)]- deriving (Typeable, Show, Functor, Foldable, Traversable, Eq)+ deriving (Typeable, Data, Show, Functor, Foldable, Traversable, Eq) type Pattern = Pattern' Expr type Patterns = [NamedArg Pattern]@@ -646,7 +662,7 @@ getRange (LHSProj d lhscore ps) = d `fuseRange` lhscore `fuseRange` ps instance HasRange a => HasRange (Clause' a) where- getRange (Clause lhs _ rhs ds catchall) = getRange (lhs,rhs,ds)+ getRange (Clause lhs _ _ rhs ds catchall) = getRange (lhs, rhs, ds) instance HasRange RHS where getRange AbsurdRHS = noRange@@ -770,11 +786,14 @@ killRange (LHSProj a b c) = killRange3 LHSProj a b c instance KillRange a => KillRange (Clause' a) where- killRange (Clause lhs dots rhs ds catchall) = killRange5 Clause lhs dots rhs ds catchall+ killRange (Clause lhs dots sdots rhs ds catchall) = killRange6 Clause lhs dots sdots rhs ds catchall instance KillRange NamedDotPattern where killRange (NamedDot a b c) = killRange3 NamedDot a b c +instance KillRange StrippedDotPattern where+ killRange (StrippedDot a b c) = killRange3 StrippedDot a b c+ instance KillRange RHS where killRange AbsurdRHS = AbsurdRHS killRange (RHS e c) = killRange2 RHS e c@@ -856,7 +875,7 @@ allNames (ScopedDecl _ decls) = allNames decls instance AllNames Clause where- allNames (Clause _ _ rhs decls _) = allNames rhs >< allNames decls+ allNames cl = allNames (clauseRHS cl, clauseWhereDecls cl) instance AllNames RHS where allNames (RHS e _) = allNames e@@ -990,7 +1009,7 @@ lambdaLiftExpr :: [Name] -> Expr -> Expr lambdaLiftExpr [] e = e-lambdaLiftExpr (n:ns) e = Lam (ExprRange noRange) (DomainFree defaultArgInfo n) $+lambdaLiftExpr (n:ns) e = Lam defaultLamInfo_ (DomainFree defaultArgInfo n) $ lambdaLiftExpr ns e substPattern :: [(Name, Pattern)] -> Pattern -> Pattern@@ -1090,19 +1109,19 @@ insertImplicitPatSynArgs wild r ns as = matchArgs r ns as where matchNextArg r n as@(~(a : as'))- | matchNext n as = return (namedArg a, as')- | getHiding n == NotHidden = Nothing- | otherwise = return (wild r, as)+ | matchNext n as = return (namedArg a, as')+ | visible n = Nothing+ | otherwise = return (wild r, as) matchNext _ [] = False- matchNext n (a:as) = getHiding n == getHiding a && matchName+ matchNext n (a:as) = sameHiding n a && matchName where x = unranged $ C.nameToRawName $ nameConcrete $ unArg n matchName = maybe True (== x) (nameOf $ unArg a) matchArgs r [] [] = return ([], []) matchArgs r [] as = Nothing- matchArgs r (n:ns) [] | getHiding n == NotHidden = return ([], n : ns) -- under-applied+ matchArgs r (n:ns) [] | visible n = return ([], n : ns) -- under-applied matchArgs r (n:ns) as = do (p, as) <- matchNextArg r n as first ((unArg n, p) :) <$> matchArgs (getRange p) ns as
src/full/Agda/Syntax/Abstract/Copatterns.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-} module Agda.Syntax.Abstract.Copatterns (translateCopatternClauses) where @@ -180,10 +179,10 @@ rhsExpr _ = __IMPOSSIBLE__ clauseToPath :: Clause -> ScopeM (ProjPath Clause)-clauseToPath (Clause (LHS i lhs wps) dots (RHS e c) [] catchall) =- fmap (\ lhs -> Clause (LHS i lhs wps) dots (RHS e c) [] catchall) <$> lhsToPath [] lhs-clauseToPath (Clause lhs _ (RHS e _) (_:_) _) = typeError $ NotImplemented $ "copattern clauses with where declarations"-clauseToPath (Clause lhs _ _ wheredecls _) = typeError $ NotImplemented $ "copattern clauses with absurd, with or rewrite right hand side"+clauseToPath (Clause (LHS i lhs wps) dots sdots (RHS e c) [] catchall) =+ fmap (\ lhs -> Clause (LHS i lhs wps) dots sdots (RHS e c) [] catchall) <$> lhsToPath [] lhs+clauseToPath (Clause lhs _ _ (RHS e _) (_:_) _) = typeError $ NotImplemented $ "copattern clauses with where declarations"+clauseToPath (Clause lhs _ _ _ wheredecls _) = typeError $ NotImplemented $ "copattern clauses with absurd, with or rewrite right hand side" lhsToPath :: [ProjEntry] -> LHSCore -> ScopeM (ProjPath LHSCore) lhsToPath acc lhs@LHSHead{} = return $ Path acc lhs@@ -214,7 +213,7 @@ abstract :: NamedArg Name -> ScopeM Expr -> ScopeM Expr abstract (Arg info (Named Nothing x)) me =- Lam (ExprRange noRange) (DomainFree info x) <$> me+ Lam defaultLamInfo_ (DomainFree info x) <$> me abstract (Arg _ (Named Just{} _)) me = typeError $ NotImplemented $ "named arguments in projection patterns" @@ -322,11 +321,14 @@ rename rho (TLet r lbs) = TLet r (rename rho lbs) instance Rename Clause where- rename rho (Clause lhs dots rhs wheredecls catchall) =- Clause (rename rho lhs) (rename rho dots) (rename rho rhs) (rename rho wheredecls) catchall+ rename rho (Clause lhs dots sdots rhs wheredecls catchall) =+ Clause (rename rho lhs) (rename rho dots) (rename rho sdots) (rename rho rhs) (rename rho wheredecls) catchall instance Rename NamedDotPattern where rename rho (NamedDot x v t) = NamedDot (rename rho x) v t++instance Rename StrippedDotPattern where+ rename rho (StrippedDot e v t) = StrippedDot (rename rho e) v t instance Rename RHS where rename rho e = case e of
src/full/Agda/Syntax/Abstract/Name.hs view
@@ -13,10 +13,11 @@ import Data.Foldable (Foldable) import Data.Traversable (Traversable)+import Data.Data (Data) import Data.Typeable (Typeable) import Data.List import Data.Function-import Data.Hashable+import Data.Hashable (Hashable(..)) import Agda.Syntax.Position import Agda.Syntax.Common@@ -42,7 +43,7 @@ , nameBindingSite :: Range , nameFixity :: Fixity' }- deriving (Typeable)+ deriving (Typeable, Data) -- | Qualified names are non-empty lists of names. Equality on qualified names -- are just equality on the last name, i.e. the module part is just@@ -53,7 +54,7 @@ data QName = QName { qnameModule :: ModuleName , qnameName :: Name }- deriving (Typeable)+ deriving (Typeable, Data) -- | Something preceeded by a qualified name. data QNamed a = QNamed@@ -67,14 +68,14 @@ -- The 'SetRange' instance for module names sets all individual ranges -- to the given one. newtype ModuleName = MName { mnameToList :: [Name] }- deriving (Eq, Ord, Typeable)+ deriving (Eq, Ord, Typeable, Data) -- | Ambiguous qualified names. Used for overloaded constructors. -- -- Invariant: All the names in the list must have the same concrete, -- unqualified name. (This implies that they all have the same 'Range'). newtype AmbiguousQName = AmbQ { unAmbQ :: [QName] }- deriving (Eq, Ord, Typeable)+ deriving (Eq, Ord, Typeable, Data) -- | Check whether we are a projection pattern. class IsProjP a where@@ -182,7 +183,7 @@ toTopLevelModuleName :: ModuleName -> C.TopLevelModuleName toTopLevelModuleName (MName []) = __IMPOSSIBLE__-toTopLevelModuleName (MName ms) = C.TopLevelModuleName $ map (C.nameToRawName . nameConcrete) ms+toTopLevelModuleName (MName ms) = C.TopLevelModuleName (getRange ms) $ map (C.nameToRawName . nameConcrete) ms qualifyM :: ModuleName -> ModuleName -> ModuleName qualifyM m1 m2 = mnameFromList $ mnameToList m1 ++ mnameToList m2@@ -270,7 +271,9 @@ numHoles (AmbQ qs) = numHoles $ fromMaybe __IMPOSSIBLE__ $ headMaybe qs --------------------------------------------------------------------------- * Show instances+-- * Show instances (only for debug printing!)+--+-- | Use 'prettyShow' to print names to the user. ------------------------------------------------------------------------ -- deriving instance Show Name@@ -284,8 +287,8 @@ instance Show Name where -- Andreas, 2014-10-02: Reverted to nice printing. -- Reason: I do not have time just now to properly fix the- -- use of Show Name for pretty printing everywhere, e.g. in- -- the Epic backend. But I want to push the fix for Issue 836 now.+ -- use of Show Name for pretty printing everywhere.+ -- But I want to push the fix for Issue 836 now. show = prettyShow -- | Only use this @show@ function in debugging! To convert an@@ -350,21 +353,30 @@ } instance SetRange ModuleName where- setRange r (MName ns) = MName (map (setRange r) ns)+ setRange r (MName ns) = MName (zipWith setRange rs ns)+ where+ -- Put the range only on the last name. Otherwise+ -- we get overlapping jump-to-definition links for all+ -- the parts (See #2666).+ rs = replicate (length ns - 1) noRange ++ [r] -- ** KillRange instance KillRange Name where- killRange (Name a b c d) = killRange4 Name a b c d- -- killRange x = x { nameConcrete = killRange $ nameConcrete x- -- -- Andreas, 2014-03-30- -- -- An experiment: what happens if we preserve- -- -- the range of the binding site, but kill all- -- -- other ranges before serialization?- -- -- Andreas, Makoto, 2014-10-18 AIM XX- -- -- Kill all ranges in signature, including nameBindingSite.- -- , nameBindingSite = noRange- -- }+ killRange (Name a b c d) =+ (killRange4 Name a b c d) { nameBindingSite = c }+ -- Andreas, 2017-07-25, issue #2649+ -- Preserve the nameBindingSite for error message.+ --+ -- Older remarks:+ --+ -- Andreas, 2014-03-30+ -- An experiment: what happens if we preserve+ -- the range of the binding site, but kill all+ -- other ranges before serialization?+ --+ -- Andreas, Makoto, 2014-10-18 AIM XX+ -- Kill all ranges in signature, including nameBindingSite. instance KillRange ModuleName where killRange (MName xs) = MName $ killRange xs
+ src/full/Agda/Syntax/Abstract/Pattern.hs view
@@ -0,0 +1,209 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-}++-- | Auxiliary functions to handle patterns in the abstract syntax.+--+-- Generic and specific traversals.++module Agda.Syntax.Abstract.Pattern where++import Control.Monad ((>=>))+import Control.Applicative (Applicative)++import Data.Foldable (Foldable, foldMap)+import Data.Traversable (Traversable, traverse)+import Data.Functor+import Data.Monoid++import Agda.Syntax.Common+import Agda.Syntax.Concrete (FieldAssignment', exprFieldA)+import Agda.Syntax.Abstract as A++#include "undefined.h"+import Agda.Utils.Impossible++-- * Generic traversals++type NAP = NamedArg Pattern++class MapNamedArgPattern a where+ mapNamedArgPattern :: (NAP -> NAP) -> a -> a++ default mapNamedArgPattern+ :: (Functor f, MapNamedArgPattern a', a ~ f a') => (NAP -> NAP) -> a -> a+ mapNamedArgPattern = fmap . mapNamedArgPattern++instance MapNamedArgPattern NAP where+ mapNamedArgPattern f p =+ case namedArg p of+ -- no sub patterns:+ VarP{} -> f p+ WildP{} -> f p+ DotP{} -> f p+ LitP{} -> f p+ AbsurdP{} -> f p+ ProjP{} -> f p+ -- list of NamedArg subpatterns:+ ConP i qs ps -> f $ setNamedArg p $ ConP i qs $ mapNamedArgPattern f ps+ DefP i qs ps -> f $ setNamedArg p $ DefP i qs $ mapNamedArgPattern f ps+ PatternSynP i x ps -> f $ setNamedArg p $ PatternSynP i x $ mapNamedArgPattern f ps+ -- Pattern subpattern(s):+ -- RecP: we copy the NamedArg info to the subpatterns but discard it after recursion+ RecP i fs -> f $ setNamedArg p $ RecP i $ map (fmap namedArg) $ mapNamedArgPattern f $ map (fmap (setNamedArg p)) fs+ -- AsP: we hand the NamedArg info to the subpattern+ AsP i x p0 -> f $ updateNamedArg (AsP i x) $ mapNamedArgPattern f $ setNamedArg p p0++instance MapNamedArgPattern a => MapNamedArgPattern [a] where+instance MapNamedArgPattern a => MapNamedArgPattern (FieldAssignment' a) where+instance MapNamedArgPattern a => MapNamedArgPattern (Maybe a) where++-- | Generic pattern traversal.++class APatternLike a p | p -> a where++ -- | Fold pattern.+ foldrAPattern+ :: Monoid m+ => (Pattern' a -> m -> m)+ -- ^ Combine a pattern and the value computed from its subpatterns.+ -> p -> m++ default foldrAPattern+ :: (Monoid m, Foldable f, APatternLike a b, f b ~ p)+ => (Pattern' a -> m -> m) -> p -> m+ foldrAPattern = foldMap . foldrAPattern++ -- | Traverse pattern.+ traverseAPatternM :: (Monad m+#if __GLASGOW_HASKELL__ <= 708+ , Applicative m, Functor m+#endif+ ) => (Pattern' a -> m (Pattern' a)) -- ^ @pre@: Modification before recursion.+ -> (Pattern' a -> m (Pattern' a)) -- ^ @post@: Modification after recursion.+ -> p -> m p++ default traverseAPatternM :: (Traversable f, APatternLike a q, f q ~ p, Monad m+#if __GLASGOW_HASKELL__ <= 708+ , Applicative m, Functor m+#endif+ ) => (Pattern' a -> m (Pattern' a))+ -> (Pattern' a -> m (Pattern' a))+ -> p -> m p+ traverseAPatternM pre post = traverse $ traverseAPatternM pre post++-- | Compute from each subpattern a value and collect them all in a monoid.++foldAPattern :: (APatternLike a p, Monoid m) => (Pattern' a -> m) -> p -> m+foldAPattern f = foldrAPattern $ \ p m -> f p `mappend` m++-- | Traverse pattern(s) with a modification before the recursive descent.++preTraverseAPatternM :: (APatternLike a b, Monad m+#if __GLASGOW_HASKELL__ <= 708+ , Applicative m, Functor m+#endif+ ) => (Pattern' a -> m (Pattern' a)) -- ^ @pre@: Modification before recursion.+ -> b -> m b+preTraverseAPatternM pre p = traverseAPatternM pre return p++-- | Traverse pattern(s) with a modification after the recursive descent.++postTraverseAPatternM :: (APatternLike a b, Monad m+#if __GLASGOW_HASKELL__ <= 708+ , Applicative m, Functor m+#endif+ ) => (Pattern' a -> m (Pattern' a)) -- ^ @post@: Modification after recursion.+ -> b -> m b+postTraverseAPatternM post p = traverseAPatternM return post p++-- Interesting instance:++instance APatternLike a (Pattern' a) where+ foldrAPattern f p = f p $+ case p of+ AsP _ _ p -> foldrAPattern f p+ ConP _ _ ps -> foldrAPattern f ps+ DefP _ _ ps -> foldrAPattern f ps+ RecP _ ps -> foldrAPattern f ps+ PatternSynP _ _ ps -> foldrAPattern f ps+ VarP _ -> mempty+ ProjP _ _ _ -> mempty+ WildP _ -> mempty+ DotP _ _ _ -> mempty+ AbsurdP _ -> mempty+ LitP _ -> mempty++ traverseAPatternM pre post = pre >=> recurse >=> post+ where+ recurse p = case p of+ -- Non-recursive cases:+ A.VarP{} -> return p+ A.WildP{} -> return p+ A.DotP{} -> return p+ A.LitP{} -> return p+ A.AbsurdP{} -> return p+ A.ProjP{} -> return p+ -- Recursive cases:+ A.ConP i ds ps -> A.ConP i ds <$> traverseAPatternM pre post ps+ A.DefP i q ps -> A.DefP i q <$> traverseAPatternM pre post ps+ A.AsP i x p -> A.AsP i x <$> traverseAPatternM pre post p+ A.RecP i ps -> A.RecP i <$> traverseAPatternM pre post ps+ A.PatternSynP i x ps -> A.PatternSynP i x <$> traverseAPatternM pre post ps++-- The following instances need UndecidableInstances+-- for the FunctionalDependency (since injectivity is not taken into account).++instance APatternLike a b => APatternLike a (Arg b) where+instance APatternLike a b => APatternLike a (Named n b) where+instance APatternLike a b => APatternLike a [b] where+instance APatternLike a b => APatternLike a (Maybe b) where+instance APatternLike a b => APatternLike a (FieldAssignment' b) where++-- * Specific folds++-- | Collect pattern variables in left-to-right textual order.++patternVars :: forall a p. APatternLike a p => p -> [A.Name]+patternVars p = foldAPattern f p `appEndo` []+ where+ -- We use difference lists @[A.Name] -> [A.Name]@ to avoid reconcatenation.+ f :: Pattern' a -> Endo [A.Name]+ f = \case+ A.VarP x -> Endo (x :)+ A.AsP _ x _ -> Endo (x :)+ A.LitP {} -> mempty+ A.ConP {} -> mempty+ A.RecP {} -> mempty+ A.DefP {} -> mempty+ A.ProjP {} -> mempty+ A.WildP {} -> mempty+ A.DotP {} -> mempty+ A.AbsurdP {} -> mempty+ A.PatternSynP {} -> mempty++-- | Check if a pattern contains a specific (sub)pattern.++containsAPattern :: APatternLike a p => (Pattern' a -> Bool) -> p -> Bool+containsAPattern f = getAny . foldAPattern (Any . f)++-- | Check if a pattern contains an absurd pattern.+-- For instance, @suc ()@, does so.+--+-- Precondition: contains no pattern synonyms.++containsAbsurdPattern :: APatternLike a p => p -> Bool+containsAbsurdPattern = containsAPattern $ \case+ A.PatternSynP{} -> __IMPOSSIBLE__+ A.AbsurdP{} -> True+ _ -> False++-- | Check if a pattern contains an @-pattern.+--+-- Precondition: contains no pattern synonyms.++containsAsPattern :: APatternLike a p => p -> Bool+containsAsPattern = containsAPattern $ \case+ A.PatternSynP{} -> __IMPOSSIBLE__+ A.AsP{} -> True+ _ -> False
src/full/Agda/Syntax/Abstract/Views.hs view
@@ -53,6 +53,15 @@ unAppView (Application h es) = foldl (App (ExprRange noRange)) h es +-- | Collects plain lambdas.+data LamView = LamView [(LamInfo, LamBinding)] Expr++lamView :: Expr -> LamView+lamView (Lam i b e) = cons (i, b) $ lamView e+ where cons b (LamView bs e) = LamView (b : bs) e+lamView (ScopedExpr _ e) = lamView e+lamView e = LamView [] e+ -- | Gather top-level 'AsP'atterns to expose underlying pattern. asView :: A.Pattern -> ([Name], A.Pattern) asView (A.AsP _ x p) = first (x :) $ asView p@@ -311,7 +320,7 @@ instance ExprLike a => ExprLike (Pattern' a) where instance ExprLike a => ExprLike (Clause' a) where- recurseExpr f (Clause lhs dots rhs ds ca) = Clause <$> rec lhs <*> pure dots <*> rec rhs <*> rec ds <*> pure ca+ recurseExpr f (Clause lhs dots sdots rhs ds ca) = Clause <$> rec lhs <*> pure dots <*> pure sdots <*> rec rhs <*> rec ds <*> pure ca where rec = recurseExpr f instance ExprLike RHS where@@ -337,17 +346,18 @@ OptionsPragma{} -> pure p BuiltinNoDefPragma{} -> pure p RewritePragma{} -> pure p+ CompilePragma{} -> pure p CompiledPragma{} -> pure p CompiledExportPragma{} -> pure p- CompiledDeclareDataPragma{} -> pure p CompiledTypePragma{} -> pure p CompiledDataPragma{} -> pure p- CompiledEpicPragma{} -> pure p CompiledJSPragma{} -> pure p CompiledUHCPragma{} -> pure p CompiledDataUHCPragma{} -> pure p StaticPragma{} -> pure p+ InjectivePragma{} -> pure p InlinePragma{} -> pure p+ EtaPragma{} -> pure p DisplayPragma f xs e -> DisplayPragma f <$> rec xs <*> rec e where rec e = recurseExpr f e
src/full/Agda/Syntax/Common.hs view
@@ -13,10 +13,11 @@ import Data.ByteString.Char8 (ByteString) import qualified Data.ByteString.Char8 as ByteString import Data.Foldable-import Data.Hashable+import Data.Hashable (Hashable(..)) import qualified Data.Strict.Maybe as Strict import Data.Semigroup hiding (Arg) import Data.Traversable+import Data.Data (Data) import Data.Typeable (Typeable) import Data.Word @@ -36,7 +37,7 @@ -- | Used to specify whether something should be delayed. data Delayed = Delayed | NotDelayed- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) instance KillRange Delayed where killRange = id@@ -46,7 +47,7 @@ --------------------------------------------------------------------------- data Induction = Inductive | CoInductive- deriving (Typeable, Eq, Ord)+ deriving (Typeable, Data, Eq, Ord) instance Show Induction where show Inductive = "inductive"@@ -66,18 +67,32 @@ -- * Hiding --------------------------------------------------------------------------- -data Hiding = Hidden | Instance | NotHidden- deriving (Typeable, Show, Eq, Ord)+data Overlappable = YesOverlap | NoOverlap+ deriving (Typeable, Data, Show, Eq, Ord) +data Hiding = Hidden | Instance Overlappable | NotHidden+ deriving (Typeable, Data, Show, Eq, Ord)++-- | Just for the 'Hiding' instance. Should never combine different+-- overlapping.+instance Semigroup Overlappable where+ NoOverlap <> NoOverlap = NoOverlap+ YesOverlap <> YesOverlap = YesOverlap+ _ <> _ = __IMPOSSIBLE__+ -- | 'Hiding' is an idempotent partial monoid, with unit 'NotHidden'. -- 'Instance' and 'NotHidden' are incompatible. instance Semigroup Hiding where- NotHidden <> h = h- h <> NotHidden = h- Hidden <> Hidden = Hidden- Instance <> Instance = Instance- _ <> _ = __IMPOSSIBLE__+ NotHidden <> h = h+ h <> NotHidden = h+ Hidden <> Hidden = Hidden+ Instance o <> Instance o' = Instance (o <> o')+ _ <> _ = __IMPOSSIBLE__ +instance Monoid Overlappable where+ mempty = NoOverlap+ mappend = (<>)+ instance Monoid Hiding where mempty = NotHidden mappend = (<>)@@ -85,14 +100,21 @@ instance KillRange Hiding where killRange = id +instance NFData Overlappable where+ rnf NoOverlap = ()+ rnf YesOverlap = ()+ instance NFData Hiding where- rnf Hidden = ()- rnf Instance = ()- rnf NotHidden = ()+ rnf Hidden = ()+ rnf (Instance o) = rnf o+ rnf NotHidden = () -- | Decorating something with 'Hiding' information.-data WithHiding a = WithHiding !Hiding a- deriving (Typeable, Eq, Ord, Show, Functor, Foldable, Traversable)+data WithHiding a = WithHiding+ { whHiding :: !Hiding+ , whThing :: a+ }+ deriving (Typeable, Data, Eq, Ord, Show, Functor, Foldable, Traversable) instance Decoration WithHiding where traverseF f (WithHiding h a) = WithHiding h <$> f a@@ -139,10 +161,6 @@ mergeHiding :: LensHiding a => WithHiding a -> a mergeHiding (WithHiding h a) = mapHiding (mappend h) a --- | Visible ('NotHidden') arguments are @notHidden@. (DEPRECATED, use 'visible'.)-notHidden :: LensHiding a => a -> Bool-notHidden a = getHiding a == NotHidden- -- | 'NotHidden' arguments are @visible@. visible :: LensHiding a => a -> Bool visible a = getHiding a == NotHidden@@ -151,19 +169,45 @@ notVisible :: LensHiding a => a -> Bool notVisible a = getHiding a /= NotHidden +-- | 'Hidden' arguments are @hidden@.+hidden :: LensHiding a => a -> Bool+hidden a = getHiding a == Hidden+ hide :: LensHiding a => a -> a hide = setHiding Hidden hideOrKeepInstance :: LensHiding a => a -> a hideOrKeepInstance x = case getHiding x of- Hidden -> x- Instance -> x- NotHidden -> setHiding Hidden x+ Hidden -> x+ Instance{} -> x+ NotHidden -> setHiding Hidden x makeInstance :: LensHiding a => a -> a-makeInstance = setHiding Instance+makeInstance = makeInstance' NoOverlap +makeInstance' :: LensHiding a => Overlappable -> a -> a+makeInstance' o = setHiding (Instance o)++isOverlappable :: LensHiding a => a -> Bool+isOverlappable x =+ case getHiding x of+ Instance YesOverlap -> True+ _ -> False++isInstance :: LensHiding a => a -> Bool+isInstance x =+ case getHiding x of+ Instance{} -> True+ _ -> False++-- | Ignores 'Overlappable'.+sameHiding :: (LensHiding a, LensHiding b) => a -> b -> Bool+sameHiding x y =+ case (getHiding x, getHiding y) of+ (Instance{}, Instance{}) -> True+ (hx, hy) -> hx == hy+ --------------------------------------------------------------------------- -- * Relevance ---------------------------------------------------------------------------@@ -178,7 +222,7 @@ -- @A@ is big in constructor @nil@ as the sort @Set1@ of its type @Set@ -- is bigger than the sort @Set@ of the data type @List@. data Big = Big | Small- deriving (Typeable, Show, Eq, Enum, Bounded)+ deriving (Typeable, Data, Show, Eq, Enum, Bounded) instance Ord Big where Big <= Small = False@@ -200,11 +244,7 @@ -- because its value is already determined by the type. -- If a constructor argument is big, it has to be regarded -- absent, otherwise we get into paradoxes.- | UnusedArg -- ^ The polarity checker has determined that this argument- -- is unused in the definition. It can be skipped during- -- equality checking but should be mined for solutions- -- of meta-variables with relevance 'UnusedArg'- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) allRelevances :: [Relevance] allRelevances =@@ -213,7 +253,6 @@ , Irrelevant , Forced Small , Forced Big- , UnusedArg ] instance KillRange Relevance where@@ -227,7 +266,6 @@ rnf NonStrict = () rnf Irrelevant = () rnf (Forced a) = rnf a- rnf UnusedArg = () -- | A lens to access the 'Relevance' attribute in data structures. -- Minimal implementation: @getRelevance@ and one of @setRelevance@ or @mapRelevance@.@@ -254,7 +292,6 @@ -- | Information ordering. -- @Relevant \`moreRelevant\`--- UnusedArg \`moreRelevant\` -- Forced \`moreRelevant\` -- NonStrict \`moreRelevant\` -- Irrelevant@@@ -268,26 +305,26 @@ (Relevant, _) -> True (_, Relevant) -> False -- second bottom- (UnusedArg, _) -> True- (_, UnusedArg) -> False- -- third bottom (Forced{}, _) -> True (_, Forced{}) -> False -- remaining case (NonStrict,NonStrict) -> True -irrelevantOrUnused :: Relevance -> Bool-irrelevantOrUnused r =+irrelevant :: Relevance -> Bool+irrelevant r = case r of Irrelevant -> True- UnusedArg -> True NonStrict -> False Relevant -> False Forced{} -> False -- | @unusableRelevance rel == True@ iff we cannot use a variable of @rel@.-unusableRelevance :: Relevance -> Bool-unusableRelevance rel = NonStrict `moreRelevant` rel+unusableRelevance :: LensRelevance a => a -> Bool+unusableRelevance a = case getRelevance a of+ Irrelevant -> True+ NonStrict -> True+ Forced{} -> False -- @Forced@ has no semantic relevance+ Relevant -> False -- | 'Relevance' composition. -- 'Irrelevant' is dominant, 'Relevant' is neutral.@@ -301,8 +338,6 @@ (Forced b, Forced b') -> Forced (max b b') -- prefer Big over Small (Forced b, _) -> Forced b (_, Forced b) -> Forced b- (UnusedArg, _) -> UnusedArg- (_, UnusedArg) -> UnusedArg (Relevant, Relevant) -> Relevant -- | @inverseComposeRelevance r x@ returns the most irrelevant @y@@@ -316,17 +351,14 @@ (Relevant, x) -> x -- going to relevant arg.: nothing changes _ | r == x -> Relevant -- because Relevant is comp.-neutral (Forced{}, Forced{}) -> Relevant -- same, but (==) does not ignore Big- (UnusedArg, x) -> x- (Forced{}, UnusedArg) -> Relevant (Forced{}, x) -> x (Irrelevant, x) -> Relevant -- going irrelevant: every thing usable (_, Irrelevant) -> Irrelevant -- otherwise: irrelevant things remain unusable (NonStrict, _) -> Relevant -- but @NonStrict@s become usable --- | For comparing @Relevance@ ignoring @Forced@ and @UnusedArg@.+-- | For comparing @Relevance@ ignoring @Forced@. ignoreForced :: Relevance -> Relevance ignoreForced Forced{} = Relevant-ignoreForced UnusedArg = Relevant ignoreForced Relevant = Relevant ignoreForced NonStrict = NonStrict ignoreForced Irrelevant = Irrelevant@@ -350,8 +382,13 @@ -- * Origin of arguments (user-written, inserted or reflected) --------------------------------------------------------------------------- -data Origin = UserWritten | Inserted | Reflected- deriving (Typeable, Show, Eq, Ord)+-- | Origin of arguments.+data Origin+ = UserWritten -- ^ From the source file / user input. (Preserve!)+ | Inserted -- ^ E.g. inserted hidden arguments.+ | Reflected -- ^ Produced by the reflection machinery.+ | CaseSplit -- ^ Produced by an interactive case split.+ deriving (Typeable, Data, Show, Eq, Ord) instance KillRange Origin where killRange = id@@ -360,7 +397,33 @@ rnf UserWritten = () rnf Inserted = () rnf Reflected = ()+ rnf CaseSplit = () +-- | Decorating something with 'Origin' information.+data WithOrigin a = WithOrigin+ { woOrigin :: !Origin+ , woThing :: a+ }+ deriving (Typeable, Data, Eq, Ord, Show, Functor, Foldable, Traversable)++instance Decoration WithOrigin where+ traverseF f (WithOrigin h a) = WithOrigin h <$> f a++instance HasRange a => HasRange (WithOrigin a) where+ getRange = getRange . dget++instance SetRange a => SetRange (WithOrigin a) where+ setRange = fmap . setRange++instance KillRange a => KillRange (WithOrigin a) where+ killRange = fmap killRange++instance NFData a => NFData (WithOrigin a) where+ rnf (WithOrigin _ a) = rnf a++-- | A lens to access the 'Origin' attribute in data structures.+-- Minimal implementation: @getOrigin@ and one of @setOrigin@ or @mapOrigin@.+ class LensOrigin a where getOrigin :: a -> Origin@@ -376,6 +439,11 @@ setOrigin = const mapOrigin = id +instance LensOrigin (WithOrigin a) where+ getOrigin (WithOrigin h _) = h+ setOrigin h (WithOrigin _ a) = WithOrigin h a+ mapOrigin f (WithOrigin h a) = WithOrigin (f h) a+ --------------------------------------------------------------------------- -- * Argument decoration ---------------------------------------------------------------------------@@ -386,11 +454,10 @@ { argInfoHiding :: Hiding , argInfoRelevance :: Relevance , argInfoOrigin :: Origin- , argInfoOverlappable :: Bool- } deriving (Typeable, Eq, Ord, Show)+ } deriving (Typeable, Data, Eq, Ord, Show) instance KillRange ArgInfo where- killRange (ArgInfo h r o v) = killRange3 ArgInfo h r o v+ killRange (ArgInfo h r o) = killRange3 ArgInfo h r o class LensArgInfo a where getArgInfo :: a -> ArgInfo@@ -405,7 +472,7 @@ mapArgInfo = id instance NFData ArgInfo where- rnf (ArgInfo a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d+ rnf (ArgInfo a b c) = rnf a `seq` rnf b `seq` rnf c instance LensHiding ArgInfo where getHiding = argInfoHiding@@ -425,8 +492,7 @@ defaultArgInfo :: ArgInfo defaultArgInfo = ArgInfo { argInfoHiding = NotHidden , argInfoRelevance = Relevant- , argInfoOrigin = UserWritten- , argInfoOverlappable = False }+ , argInfoOrigin = UserWritten } ---------------------------------------------------------------------------@@ -436,7 +502,7 @@ data Arg e = Arg { argInfo :: ArgInfo , unArg :: e- } deriving (Typeable, Ord, Functor, Foldable, Traversable)+ } deriving (Data, Typeable, Ord, Functor, Foldable, Traversable) instance Decoration Arg where traverseF f (Arg ai a) = Arg ai <$> f a@@ -451,25 +517,27 @@ killRange (Arg info a) = killRange2 Arg info a instance Eq a => Eq (Arg a) where- Arg (ArgInfo h1 _ _ _) x1 == Arg (ArgInfo h2 _ _ _) x2 = (h1, x1) == (h2, x2)+ Arg (ArgInfo h1 _ _) x1 == Arg (ArgInfo h2 _ _) x2 = (h1, x1) == (h2, x2) instance Show a => Show (Arg a) where- show (Arg (ArgInfo h r o v) x) = showR r $ showO o $ showH h $ show x+ show (Arg (ArgInfo h r o) a) = showR r $ showO o $ showH h $ show a where- showH Hidden s = "{" ++ s ++ "}"- showH NotHidden s = "(" ++ s ++ ")"- showH Instance s = (if v then "overlap " else "") ++ "{{" ++ s ++ "}}"+ showH Hidden s = "{" ++ s ++ "}"+ showH NotHidden s = "(" ++ s ++ ")"+ showH (Instance o) s = showOv o ++ "{{" ++ s ++ "}}"+ where showOv YesOverlap = "overlap "+ showOv NoOverlap = "" showR r s = case r of Irrelevant -> "." ++ s NonStrict -> "?" ++ s Forced Big -> "!b" ++ s Forced Small -> "!" ++ s- UnusedArg -> "k" ++ s -- constant Relevant -> "r" ++ s -- Andreas: I want to see it explicitly showO o s = case o of UserWritten -> "u" ++ s Inserted -> "i" ++ s Reflected -> "g" ++ s -- generated by reflection+ CaseSplit -> "c" ++ s -- generated by case split instance NFData e => NFData (Arg e) where rnf (Arg a b) = rnf a `seq` rnf b@@ -539,7 +607,7 @@ data Dom e = Dom { domInfo :: ArgInfo , unDom :: e- } deriving (Typeable, Ord, Functor, Foldable, Traversable)+ } deriving (Typeable, Data, Ord, Functor, Foldable, Traversable) instance Decoration Dom where traverseF f (Dom ai a) = Dom ai <$> f a@@ -551,7 +619,7 @@ killRange (Dom info a) = killRange2 Dom info a instance Eq a => Eq (Dom a) where- Dom (ArgInfo h1 r1 _ _) x1 == Dom (ArgInfo h2 r2 _ _) x2 =+ Dom (ArgInfo h1 r1 _) x1 == Dom (ArgInfo h2 r2 _) x2 = (h1, ignoreForced r1, x1) == (h2, ignoreForced r2, x2) instance Show a => Show (Dom a) where@@ -569,6 +637,10 @@ getArgInfo = domInfo mapArgInfo f arg = arg { domInfo = f $ domInfo arg } +instance LensOrigin (Dom e) where+ getOrigin = getOrigin . getArgInfo+ mapOrigin = mapArgInfo . mapOrigin+ argFromDom :: Dom a -> Arg a argFromDom (Dom i a) = Arg i a @@ -587,7 +659,7 @@ Named { nameOf :: Maybe name , namedThing :: a }- deriving (Eq, Ord, Typeable, Functor, Foldable, Traversable)+ deriving (Eq, Ord, Typeable, Data, Functor, Foldable, Traversable) -- | Standard naming. type Named_ = Named RString@@ -611,8 +683,8 @@ killRange (Named n a) = Named (killRange n) (killRange a) instance Show a => Show (Named_ a) where- show (Named Nothing x) = show x- show (Named (Just n) x) = rawNameToString (rangedThing n) ++ " = " ++ show x+ show (Named Nothing a) = show a+ show (Named (Just n) a) = rawNameToString (rangedThing n) ++ " = " ++ show a instance (NFData name, NFData a) => NFData (Named name a) where rnf (Named a b) = rnf a `seq` rnf b@@ -632,6 +704,10 @@ updateNamedArg :: (a -> b) -> NamedArg a -> NamedArg b updateNamedArg = fmap . fmap +-- | @setNamedArg a b = updateNamedArg (const b) a@+setNamedArg :: NamedArg a -> b -> NamedArg b+setNamedArg a b = (b <$) <$> a+ --------------------------------------------------------------------------- -- * Range decoration. ---------------------------------------------------------------------------@@ -641,7 +717,7 @@ { rangeOf :: Range , rangedThing :: a }- deriving (Typeable, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Functor, Foldable, Traversable) -- | Thing with no range info. unranged :: a -> Ranged a@@ -695,7 +771,8 @@ = ConOSystem -- ^ Inserted by system or expanded from an implicit pattern. | ConOCon -- ^ User wrote a constructor (pattern). | ConORec -- ^ User wrote a record (pattern).- deriving (Typeable, Show, Eq, Ord, Enum, Bounded)+ | ConOSplit -- ^ Generated by interactive case splitting.+ deriving (Typeable, Data, Show, Eq, Ord, Enum, Bounded) instance KillRange ConOrigin where killRange = id@@ -710,11 +787,14 @@ = ProjPrefix -- ^ User wrote a prefix projection. | ProjPostfix -- ^ User wrote a postfix projection. | ProjSystem -- ^ Projection was generated by the system.- deriving (Typeable, Show, Eq, Ord, Enum, Bounded)+ deriving (Typeable, Data, Show, Eq, Ord, Enum, Bounded) instance KillRange ProjOrigin where killRange = id +data DataOrRecord = IsData | IsRecord+ deriving (Typeable, Data, Eq, Ord, Show)+ --------------------------------------------------------------------------- -- * Infixity, access, abstract, etc. ---------------------------------------------------------------------------@@ -722,7 +802,7 @@ -- | Functions can be defined in both infix and prefix style. See -- 'Agda.Syntax.Concrete.LHS'. data IsInfix = InfixDef | PrefixDef- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) -- | Access modifier. data Access@@ -732,8 +812,14 @@ | PublicAccess | OnlyQualified -- ^ Visible from outside, but not exported when opening the module -- Used for qualified constructors.- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) +instance Pretty Access where+ pretty = text . \case+ PrivateAccess _ -> "private"+ PublicAccess -> "public"+ OnlyQualified -> "only-qualified"+ instance NFData Access where rnf _ = () @@ -745,14 +831,14 @@ -- | Abstract or concrete data IsAbstract = AbstractDef | ConcreteDef- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) instance KillRange IsAbstract where killRange = id -- | Is this definition eligible for instance search? data IsInstance = InstanceDef | NotInstanceDef- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) instance KillRange IsInstance where killRange = id@@ -766,7 +852,7 @@ -- | Is this a macro definition? data IsMacro = MacroDef | NotMacroDef- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) instance KillRange IsMacro where killRange = id instance HasRange IsMacro where getRange _ = noRange@@ -781,13 +867,13 @@ -- | The unique identifier of a name. Second argument is the top-level module -- identifier. data NameId = NameId {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64- deriving (Eq, Ord, Typeable, Generic)+ deriving (Eq, Ord, Typeable, Data, Generic) instance KillRange NameId where killRange = id instance Show NameId where- show (NameId x i) = show x ++ "@" ++ show i+ show (NameId n m) = show n ++ "@" ++ show m instance Enum NameId where succ (NameId n m) = NameId (n + 1) m@@ -809,7 +895,7 @@ -- | A meta variable identifier is just a natural number. -- newtype MetaId = MetaId { metaId :: Nat }- deriving (Eq, Ord, Num, Real, Enum, Integral, Typeable)+ deriving (Eq, Ord, Num, Real, Enum, Integral, Typeable, Data) instance Pretty MetaId where pretty (MetaId n) = text $ "_" ++ show n@@ -839,7 +925,7 @@ -- @foo_bar@. | End -- ^ The following underscore is at the end of the name: @foo_@.- deriving (Show, Eq, Ord)+ deriving (Show, Eq, Ord, Typeable, Data) -- | Placeholders are used to represent the underscores in a section. @@ -848,7 +934,7 @@ | NoPlaceholder !(Strict.Maybe PositionInName) e -- ^ The second argument is used only (but not always) for name -- parts other than underscores.- deriving (Typeable, Eq, Ord, Functor, Foldable, Traversable, Show)+ deriving (Typeable, Data, Eq, Ord, Functor, Foldable, Traversable, Show) -- | An abbreviation: @noPlaceholder = 'NoPlaceholder' -- 'Strict.Nothing'@.@@ -873,10 +959,20 @@ --------------------------------------------------------------------------- newtype InteractionId = InteractionId { interactionId :: Nat }- deriving (Eq,Ord,Num,Integral,Real,Enum)+ deriving ( Eq+ , Ord+ , Num+ , Integral+ , Real+ , Enum+ , Data+#if __GLASGOW_HASKELL__ <= 708+ , Typeable+#endif+ ) instance Show InteractionId where- show (InteractionId x) = "?" ++ show x+ show (InteractionId i) = "?" ++ show i instance KillRange InteractionId where killRange = id @@ -893,18 +989,18 @@ , impRenaming :: [Renaming' a b] , publicOpen :: Bool -- ^ Only for @open@. Exports the opened names from the current module. }- deriving (Typeable, Eq)+ deriving (Typeable, Data, Eq) data Using' a b = UseEverything | Using [ImportedName' a b]- deriving (Typeable, Eq)+ deriving (Typeable, Data, Eq) instance Semigroup (Using' a b) where- UseEverything <> u = u- u <> UseEverything = u- Using xs <> Using ys = Using (xs ++ ys)+ UseEverything <> u = u+ u <> UseEverything = u+ Using xs <> Using ys = Using (xs ++ ys) instance Monoid (Using' a b) where- mempty = UseEverything+ mempty = UseEverything mappend = (<>) -- | Default is directive is @private@ (use everything, but do not export).@@ -919,15 +1015,15 @@ data ImportedName' a b = ImportedModule b | ImportedName a- deriving (Typeable, Eq, Ord)+ deriving (Typeable, Data, Eq, Ord) setImportedName :: ImportedName' a a -> a -> ImportedName' a a setImportedName (ImportedName x) y = ImportedName y setImportedName (ImportedModule x) y = ImportedModule y instance (Show a, Show b) => Show (ImportedName' a b) where- show (ImportedModule x) = "module " ++ show x- show (ImportedName x) = show x+ show (ImportedModule b) = "module " ++ show b+ show (ImportedName a) = show a data Renaming' a b = Renaming { renFrom :: ImportedName' a b@@ -937,7 +1033,7 @@ , renToRange :: Range -- ^ The range of the \"to\" keyword. Retained for highlighting purposes. }- deriving (Typeable, Eq)+ deriving (Typeable, Data, Eq) -- ** HasRange instances @@ -1008,7 +1104,7 @@ -- ^ Treat as terminating (unsafe). Same effect as 'NoTerminationCheck'. | TerminationMeasure Range m -- ^ Skip termination checking but use measure instead.- deriving (Typeable, Show, Eq, Functor)+ deriving (Typeable, Data, Show, Eq, Functor) instance KillRange m => KillRange (TerminationCheck m) where killRange (TerminationMeasure _ m) = TerminationMeasure noRange (killRange m)
src/full/Agda/Syntax/Concrete.hs view
@@ -52,13 +52,15 @@ import Prelude hiding (null) import Control.DeepSeq-import Data.Typeable (Typeable) import Data.Foldable (Foldable) import Data.Traversable (Traversable) import Data.List hiding (null) import Data.Set (Set) import Data.Monoid +import Data.Typeable (Typeable)+import Data.Data (Data)+ import Agda.Syntax.Position import Agda.Syntax.Common import Agda.Syntax.Fixity@@ -81,14 +83,14 @@ -- ^ An abstraction inside a special syntax declaration -- (see Issue 358 why we introduce this). | Ordinary e- deriving (Typeable, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Functor, Foldable, Traversable) fromOrdinary :: e -> OpApp e -> e fromOrdinary d (Ordinary e) = e fromOrdinary d _ = d data FieldAssignment' a = FieldAssignment { _nameFieldA :: Name, _exprFieldA :: a }- deriving (Typeable, Functor, Foldable, Traversable, Show, Eq)+ deriving (Typeable, Data, Functor, Foldable, Traversable, Show, Eq) type FieldAssignment = FieldAssignment' Expr @@ -97,7 +99,7 @@ , _exprModA :: [Expr] , _importDirModA :: ImportDirective }- deriving (Typeable)+ deriving (Typeable, Data) type RecordAssignment = Either FieldAssignment ModuleAssignment type RecordAssignments = [RecordAssignment] @@ -161,7 +163,7 @@ | Unquote Range -- ^ ex: @unquote@, should be applied to a term of type @Term@ | DontCare Expr -- ^ to print irrelevant things | Equal Range Expr Expr -- ^ ex: @a = b@, used internally in the parser- deriving (Typeable)+ deriving (Typeable, Data) -- | Concrete patterns. No literals in patterns at the moment. data Pattern@@ -181,17 +183,20 @@ | WildP Range -- ^ @_@ | AbsurdP Range -- ^ @()@ | AsP Range Name Pattern -- ^ @x\@p@ unused- | DotP Range Origin Expr -- ^ @.e@+ | DotP Range Origin Expr -- ^ @.e@ (the Origin keeps track+ -- whether this dot pattern was+ -- written by the user or inserted+ -- by the system) | LitP Literal -- ^ @0@, @1@, etc. | RecP Range [FieldAssignment' Pattern] -- ^ @record {x = p; y = q}@- deriving (Typeable)+ deriving (Typeable, Data) -- | A lambda binding is either domain free or typed. type LamBinding = LamBinding' TypedBindings data LamBinding' a = DomainFree ArgInfo BoundName -- ^ . @x@ or @{x}@ or @.x@ or @.{x}@ or @{.x}@ | DomainFull a -- ^ . @(xs : e)@ or @{xs : e}@- deriving (Typeable, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Functor, Foldable, Traversable) -- | A sequence of typed bindings with hiding information. Appears in dependent@@ -204,14 +209,14 @@ data TypedBindings' a = TypedBindings Range (Arg a) -- ^ . @(xs : e)@ or @{xs : e}@ or something like @(x {y} _ : e)@.- deriving (Typeable, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Functor, Foldable, Traversable) data BoundName = BName { boundName :: Name , boundLabel :: Name -- ^ for implicit function types the label matters and can't be alpha-renamed , bnameFixity :: Fixity' }- deriving (Typeable)+ deriving (Typeable, Data, Eq, Show) mkBoundName_ :: Name -> BoundName mkBoundName_ x = mkBoundName x noFixity'@@ -226,7 +231,7 @@ data TypedBinding' e = TBind Range [WithHiding BoundName] e -- ^ Binding @(x1 ... xn : A)@. | TLet Range [Declaration] -- ^ Let binding @(let Ds)@ or @(open M args)@.- deriving (Typeable, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Functor, Foldable, Traversable) -- | A telescope is a sequence of typed bindings. Bound variables are in scope -- in later types.@@ -255,7 +260,7 @@ -- ^ original pattern, with-patterns, rewrite equations and with-expressions | Ellipsis Range [Pattern] [RewriteEqn] [WithExpr] -- ^ new with-patterns, rewrite equations and with-expressions- deriving (Typeable)+ deriving (Typeable, Data) type RewriteEqn = Expr type WithExpr = Expr@@ -277,7 +282,7 @@ data RHS' e = AbsurdRHS -- ^ No right hand side because of absurd match. | RHS e- deriving (Typeable, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Functor, Foldable, Traversable) type WhereClause = WhereClause' [Declaration]@@ -288,7 +293,7 @@ -- ^ Named where: @module M where@. -- The 'Access' flag applies to the 'Name' (not the module contents!) -- and is propagated from the parent function.- deriving (Typeable, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Functor, Foldable, Traversable) -- | An expression followed by a where clause. -- Currently only used to give better a better error message in interaction.@@ -309,7 +314,7 @@ , asRange :: Range -- ^ The range of the \"as\" keyword. Retained for highlighting purposes. }- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) {-------------------------------------------------------------------------- Declarations@@ -355,17 +360,17 @@ | UnquoteDecl Range [Name] Expr | UnquoteDef Range [Name] Expr | Pragma Pragma- deriving (Typeable)+ deriving (Typeable, Data) data ModuleApplication = SectionApp Range [TypedBindings] Expr -- ^ @tel. M args@ | RecordModuleIFS Range QName -- ^ @M {{...}}@- deriving (Typeable)+ deriving (Typeable, Data) data OpenShortHand = DoOpen | DontOpen- deriving (Typeable, Eq, Show)+ deriving (Typeable, Data, Eq, Show) -- Pragmas ---------------------------------------------------------------- @@ -374,28 +379,32 @@ | BuiltinPragma Range String Expr | RewritePragma Range [QName] | CompiledDataPragma Range QName String [String]- | CompiledDeclareDataPragma Range QName String | CompiledTypePragma Range QName String | CompiledPragma Range QName String | CompiledExportPragma Range QName String- | CompiledEpicPragma Range QName String | CompiledJSPragma Range QName String | CompiledUHCPragma Range QName String | CompiledDataUHCPragma Range QName String [String] | HaskellCodePragma Range String+ | ForeignPragma Range String String -- ^ first string is backend name+ | CompilePragma Range String QName String -- ^ first string is backend name | StaticPragma Range QName+ | InjectivePragma Range QName | InlinePragma Range QName | ImportPragma Range String -- ^ Invariant: The string must be a valid Haskell module name. | ImportUHCPragma Range String -- ^ same as above, but for the UHC backend | ImpossiblePragma Range+ | EtaPragma Range QName+ -- ^ For coinductive records, use pragma instead of regular+ -- @eta-equality@ definition (as it is might make Agda loop). | TerminationCheckPragma Range (TerminationCheck Name) | CatchallPragma Range | DisplayPragma Range Pattern Expr | NoPositivityCheckPragma Range | PolarityPragma Range Name [Occurrence]- deriving (Typeable)+ deriving (Typeable, Data) --------------------------------------------------------------------------- @@ -455,8 +464,8 @@ where vApp (AppView e es) arg = AppView e (es ++ [arg]) - arg (HiddenArg _ e) = setHiding Hidden $ defaultArg e- arg (InstanceArg _ e) = setHiding Instance $ defaultArg e+ arg (HiddenArg _ e) = hide $ defaultArg e+ arg (InstanceArg _ e) = makeInstance $ defaultArg e arg e = defaultArg (unnamed e) {--------------------------------------------------------------------------@@ -642,20 +651,22 @@ getRange (BuiltinPragma r _ _) = r getRange (RewritePragma r _) = r getRange (CompiledDataPragma r _ _ _) = r- getRange (CompiledDeclareDataPragma r _ _) = r getRange (CompiledTypePragma r _ _) = r getRange (CompiledPragma r _ _) = r getRange (CompiledExportPragma r _ _) = r- getRange (CompiledEpicPragma r _ _) = r getRange (CompiledJSPragma r _ _) = r getRange (CompiledUHCPragma r _ _) = r getRange (CompiledDataUHCPragma r _ _ _) = r getRange (HaskellCodePragma r _) = r+ getRange (CompilePragma r _ _ _) = r+ getRange (ForeignPragma r _ _) = r getRange (StaticPragma r _) = r+ getRange (InjectivePragma r _) = r getRange (InlinePragma r _) = r getRange (ImportPragma r _) = r getRange (ImportUHCPragma r _) = r getRange (ImpossiblePragma r) = r+ getRange (EtaPragma r _) = r getRange (TerminationCheckPragma r _) = r getRange (CatchallPragma r) = r getRange (DisplayPragma r _ _) = r@@ -818,23 +829,25 @@ killRange (BuiltinPragma _ s e) = killRange1 (BuiltinPragma noRange s) e killRange (RewritePragma _ qs) = killRange1 (RewritePragma noRange) qs killRange (CompiledDataPragma _ q s ss) = killRange1 (\q -> CompiledDataPragma noRange q s ss) q- killRange (CompiledDeclareDataPragma _ q s) = killRange1 (\q -> CompiledDeclareDataPragma noRange q s) q killRange (CompiledTypePragma _ q s) = killRange1 (\q -> CompiledTypePragma noRange q s) q killRange (CompiledPragma _ q s) = killRange1 (\q -> CompiledPragma noRange q s) q killRange (CompiledExportPragma _ q s) = killRange1 (\q -> CompiledExportPragma noRange q s) q- killRange (CompiledEpicPragma _ q s) = killRange1 (\q -> CompiledEpicPragma noRange q s) q killRange (CompiledJSPragma _ q s) = killRange1 (\q -> CompiledJSPragma noRange q s) q killRange (CompiledUHCPragma _ q s) = killRange1 (\q -> CompiledUHCPragma noRange q s) q killRange (CompiledDataUHCPragma _ q s ss) = killRange1 (\q -> CompiledDataUHCPragma noRange q s ss) q killRange (HaskellCodePragma _ s) = HaskellCodePragma noRange s killRange (StaticPragma _ q) = killRange1 (StaticPragma noRange) q+ killRange (InjectivePragma _ q) = killRange1 (InjectivePragma noRange) q killRange (InlinePragma _ q) = killRange1 (InlinePragma noRange) q killRange (ImportPragma _ s) = ImportPragma noRange s killRange (ImportUHCPragma _ s) = ImportUHCPragma noRange s+ killRange (CompilePragma _ b q s) = killRange1 (\ q -> CompilePragma noRange b q s) q+ killRange (ForeignPragma _ b s) = ForeignPragma noRange b s killRange (ImpossiblePragma _) = ImpossiblePragma noRange killRange (TerminationCheckPragma _ t) = TerminationCheckPragma noRange (killRange t) killRange (CatchallPragma _) = CatchallPragma noRange killRange (DisplayPragma _ lhs rhs) = killRange2 (DisplayPragma noRange) lhs rhs+ killRange (EtaPragma _ q) = killRange1 (EtaPragma noRange) q killRange (NoPositivityCheckPragma _) = NoPositivityCheckPragma noRange killRange (PolarityPragma _ q occs) = killRange1 (\q -> PolarityPragma noRange q occs) q @@ -949,20 +962,22 @@ rnf (BuiltinPragma _ a b) = rnf a `seq` rnf b rnf (RewritePragma _ a) = rnf a rnf (CompiledDataPragma _ a b c) = rnf a `seq` rnf b `seq` rnf c- rnf (CompiledDeclareDataPragma _ a b) = rnf a `seq` rnf b rnf (CompiledTypePragma _ a b) = rnf a `seq` rnf b rnf (CompiledPragma _ a b) = rnf a `seq` rnf b rnf (CompiledExportPragma _ a b) = rnf a `seq` rnf b- rnf (CompiledEpicPragma _ a b) = rnf a `seq` rnf b rnf (CompiledJSPragma _ a b) = rnf a `seq` rnf b rnf (CompiledUHCPragma _ a b) = rnf a `seq` rnf b rnf (CompiledDataUHCPragma _ a b c) = rnf a `seq` rnf b `seq` rnf c rnf (HaskellCodePragma _ s) = rnf s+ rnf (CompilePragma _ a b c) = rnf a `seq` rnf b `seq` rnf c+ rnf (ForeignPragma _ b s) = rnf b `seq` rnf s rnf (StaticPragma _ a) = rnf a+ rnf (InjectivePragma _ a) = rnf a rnf (InlinePragma _ a) = rnf a rnf (ImportPragma _ a) = rnf a rnf (ImportUHCPragma _ a) = rnf a rnf (ImpossiblePragma _) = ()+ rnf (EtaPragma _ a) = rnf a rnf (TerminationCheckPragma _ a) = rnf a rnf (CatchallPragma _) = () rnf (DisplayPragma _ a b) = rnf a `seq` rnf b
src/full/Agda/Syntax/Concrete/Definitions.hs view
@@ -1,7 +1,6 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE GADTs #-} -- | Preprocess 'Agda.Syntax.Concrete.Declaration's, producing 'NiceDeclaration's. --@@ -31,6 +30,7 @@ , NiceConstructor, NiceTypeSignature , Clause(..) , DeclarationException(..)+ , DeclarationWarning(..) , Nice, runNice , niceDeclarations , notSoNiceDeclarations@@ -40,7 +40,7 @@ import Prelude hiding (null) -import Control.Arrow ((***))+import Control.Arrow ((***), first, second) import Control.Applicative hiding (empty) import Control.Monad.State @@ -52,9 +52,12 @@ import Data.Map (Map) import Data.Maybe import Data.Semigroup ( Semigroup, Monoid, (<>), mempty, mappend )-import Data.List as List hiding (null)+import qualified Data.List as List import qualified Data.Set as Set import Data.Traversable (Traversable, traverse)+import qualified Data.Traversable as Trav++import Data.Data (Data) import Data.Typeable (Typeable) import Agda.Syntax.Concrete@@ -67,10 +70,12 @@ import Agda.TypeChecking.Positivity.Occurrence -import Agda.Utils.Except ( Error(strMsg), MonadError(throwError) )+import Agda.Utils.Except ( MonadError(throwError,catchError) )+import Agda.Utils.Function import Agda.Utils.Functor import Agda.Utils.Lens import Agda.Utils.List (caseList, headMaybe, isSublistOf)+import Agda.Utils.Maybe import Agda.Utils.Monad import Agda.Utils.Null import qualified Agda.Utils.Pretty as Pretty@@ -130,16 +135,18 @@ -- without type signature or a pattern lhs (e.g. for irrefutable let). -- The 'Declaration' is the actual 'FunClause'. | FunSig Range Fixity' Access IsAbstract IsInstance IsMacro ArgInfo TerminationCheck Name Expr- | FunDef Range [Declaration] Fixity' IsAbstract TerminationCheck Name [Clause]+ | FunDef Range [Declaration] Fixity' IsAbstract IsInstance TerminationCheck Name [Clause] -- ^ Block of function clauses (we have seen the type signature before). -- The 'Declaration's are the original declarations that were processed -- into this 'FunDef' and are only used in 'notSoNiceDeclaration'.+ -- Andreas, 2017-01-01: Because of issue #2372, we add 'IsInstance' here.+ -- An alias should know that it is an instance. | DataDef Range Fixity' IsAbstract PositivityCheck Name [LamBinding] [NiceConstructor] | RecDef Range Fixity' IsAbstract PositivityCheck Name (Maybe (Ranged Induction)) (Maybe Bool) (Maybe (ThingWithFixity Name, IsInstance)) [LamBinding] [NiceDeclaration] | NicePatternSyn Range Fixity' Name [Arg Name] Pattern | NiceUnquoteDecl Range [Fixity'] Access IsAbstract IsInstance TerminationCheck [Name] Expr | NiceUnquoteDef Range [Fixity'] Access IsAbstract TerminationCheck [Name] Expr- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) type TerminationCheck = Common.TerminationCheck Measure @@ -157,7 +164,7 @@ -- | One clause in a function definition. There is no guarantee that the 'LHS' -- actually declares the 'Name'. We will have to check that later. data Clause = Clause Name Catchall LHS RHS WhereClause [Clause]- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) -- | The exception type. data DeclarationException@@ -170,16 +177,11 @@ | MissingTypeSignature LHS -- Andreas 2012-06-02: currently unused, remove after a while -- Fredrik 2012-09-20: now used, can we keep it? | MissingDataSignature Name | WrongDefinition Name DataRecOrFun DataRecOrFun- | WrongParameters Name+ | WrongParameters Name Params Params+ -- ^ 'Name' of symbol, 'Params' of signature, 'Params' of definition. | NotAllowedInMutual NiceDeclaration- | UnknownNamesInFixityDecl [Name]- | UnknownNamesInPolarityPragmas [Name]- | PolarityPragmasButNotPostulates [Name] | Codata Range | DeclarationPanic String- | UselessPrivate Range- | UselessAbstract Range- | UselessInstance Range | WrongContentBlock KindOfBlock Range | AmbiguousFunClauses LHS [Name] -- ^ in a mutual block, a clause could belong to any of the @[Name]@ type signatures | InvalidTerminationCheckPragma Range@@ -194,8 +196,18 @@ | BadMacroDef NiceDeclaration | InvalidNoPositivityCheckPragma Range - deriving (Typeable)+ deriving (Typeable, Data, Show) +-- | Non-fatal errors encountered in the Nicifier+data DeclarationWarning+ = UnknownNamesInFixityDecl [Name]+ | UnknownNamesInPolarityPragmas [Name]+ | PolarityPragmasButNotPostulates [Name]+ | UselessPrivate Range+ | UselessAbstract Range+ | UselessInstance Range+ deriving (Typeable, Data, Show)+ -- | Several declarations expect only type signatures as sub-declarations. These are: data KindOfBlock = PostulateBlock -- ^ @postulate@@@ -203,7 +215,7 @@ | InstanceBlock -- ^ @instance@. Actually, here all kinds of sub-declarations are allowed a priori. | FieldBlock -- ^ @field@. Ensured by parser. | DataBlock -- ^ @data ... where@. Here we got a bad error message for Agda-2.5 (Issue 1698).- deriving (Typeable, Eq, Ord, Show)+ deriving (Typeable, Data, Eq, Ord, Show) instance HasRange DeclarationException where@@ -216,17 +228,11 @@ getRange (MissingTypeSignature x) = getRange x getRange (MissingDataSignature x) = getRange x getRange (WrongDefinition x k k') = getRange x- getRange (WrongParameters x) = getRange x+ getRange (WrongParameters x _ _) = getRange x getRange (AmbiguousFunClauses lhs xs) = getRange lhs getRange (NotAllowedInMutual x) = getRange x- getRange (UnknownNamesInFixityDecl xs) = getRange . head $ xs- getRange (UnknownNamesInPolarityPragmas xs) = getRange . head $ xs- getRange (PolarityPragmasButNotPostulates xs) = getRange . head $ xs getRange (Codata r) = r getRange (DeclarationPanic _) = noRange- getRange (UselessPrivate r) = r- getRange (UselessAbstract r) = r- getRange (UselessInstance r) = r getRange (WrongContentBlock _ r) = r getRange (InvalidTerminationCheckPragma r) = r getRange (InvalidMeasureMutual r) = r@@ -236,6 +242,14 @@ getRange (BadMacroDef d) = getRange d getRange (InvalidNoPositivityCheckPragma r) = r +instance HasRange DeclarationWarning where+ getRange (UnknownNamesInFixityDecl xs) = getRange . head $ xs+ getRange (UnknownNamesInPolarityPragmas xs) = getRange . head $ xs+ getRange (PolarityPragmasButNotPostulates xs) = getRange . head $ xs+ getRange (UselessPrivate r) = r+ getRange (UselessAbstract r) = r+ getRange (UselessInstance r) = r+ instance HasRange NiceDeclaration where getRange (Axiom r _ _ _ _ _ _ _ _) = r getRange (NiceField r _ _ _ _ _ _) = r@@ -247,7 +261,7 @@ getRange (NicePragma r _) = r getRange (PrimitiveFunction r _ _ _ _ _) = r getRange (FunSig r _ _ _ _ _ _ _ _ _) = r- getRange (FunDef r _ _ _ _ _ _) = r+ getRange (FunDef r _ _ _ _ _ _ _) = r getRange (DataDef r _ _ _ _ _ _) = r getRange (RecDef r _ _ _ _ _ _ _ _ _) = r getRange (NiceRecSig r _ _ _ _ _ _ _) = r@@ -257,9 +271,6 @@ getRange (NiceUnquoteDecl r _ _ _ _ _ _ _) = r getRange (NiceUnquoteDef r _ _ _ _ _ _) = r -instance Error DeclarationException where- strMsg = DeclarationPanic- -- These error messages can (should) be terminated by a dot ".", -- there is no error context printed after them. instance Pretty DeclarationException where@@ -286,31 +297,21 @@ pretty (WrongDefinition x k k') = fsep $ pretty x : pwords ("has been declared as a " ++ show k ++ ", but is being defined as a " ++ show k')- pretty (WrongParameters x) = fsep $- pwords "List of parameters does not match previous signature for" ++ [pretty x]+ pretty (WrongParameters x sig def) = fsep $+ pwords "List of parameters " ++ map pretty def +++ pwords " does not match parameters " ++ map pretty sig +++ pwords " of previous signature for " ++ [pretty x] pretty (AmbiguousFunClauses lhs xs) = sep [ fsep $ pwords "More than one matching type signature for left hand side " ++ [pretty lhs] ++ pwords "it could belong to any of:" , vcat $ map (pretty . PrintRange) xs ]- pretty (UnknownNamesInFixityDecl xs) = fsep $- pwords "The following names are not declared in the same scope as their syntax or fixity declaration (i.e., either not in scope at all, imported from another module, or declared in a super module):" ++ map pretty xs- pretty (UnknownNamesInPolarityPragmas xs) = fsep $- pwords "The following names are not declared in the same scope as their polarity pragmas (they could for instance be out of scope, imported from another module, or declared in a super module):" ++ map pretty xs- pretty (PolarityPragmasButNotPostulates xs) = fsep $- pwords "Polarity pragmas have been given for the following identifiers which are not postulates:" ++ map pretty xs- pretty (UselessPrivate _) = fsep $- pwords "Using private here has no effect. Private applies only to declarations that introduce new identifiers into the module, like type signatures and data, record, and module declarations."- pretty (UselessAbstract _) = fsep $- pwords "Using abstract here has no effect. Abstract applies only definitions like data definitions, record type definitions and function clauses."- pretty (UselessInstance _) = fsep $- pwords "Using instance here has no effect. Instance applies only to declarations that introduce new identifiers into the module, like type signatures and axioms." pretty (WrongContentBlock b _) = fsep . pwords $ case b of PostulateBlock -> "A postulate block can only contain type signatures, possibly under keyword instance" DataBlock -> "A data definition can only contain type signatures, possibly under keyword instance"- _ -> __IMPOSSIBLE__+ _ -> "Unexpected declaration" pretty (PragmaNoTerminationCheck _) = fsep $ pwords "Pragma {-# NO_TERMINATION_CHECK #-} has been removed. To skip the termination check, label your definitions either as {-# TERMINATING #-} or {-# NON_TERMINATING #-}." pretty (InvalidTerminationCheckPragma _) = fsep $@@ -332,6 +333,20 @@ pretty (InvalidNoPositivityCheckPragma _) = fsep $ pwords "No positivity checking pragmas can only precede a mutual block or a data/record definition." +instance Pretty DeclarationWarning where+ pretty (UnknownNamesInFixityDecl xs) = fsep $+ pwords "The following names are not declared in the same scope as their syntax or fixity declaration (i.e., either not in scope at all, imported from another module, or declared in a super module):" ++ map pretty xs+ pretty (UnknownNamesInPolarityPragmas xs) = fsep $+ pwords "The following names are not declared in the same scope as their polarity pragmas (they could for instance be out of scope, imported from another module, or declared in a super module):" ++ map pretty xs+ pretty (PolarityPragmasButNotPostulates xs) = fsep $+ pwords "Polarity pragmas have been given for the following identifiers which are not postulates:" ++ map pretty xs+ pretty (UselessPrivate _) = fsep $+ pwords "Using private here has no effect. Private applies only to declarations that introduce new identifiers into the module, like type signatures and data, record, and module declarations."+ pretty (UselessAbstract _) = fsep $+ pwords "Using abstract here has no effect. Abstract applies to only definitions like data definitions, record type definitions and function clauses."+ pretty (UselessInstance _) = fsep $+ pwords "Using instance here has no effect. Instance applies only to declarations that introduce new identifiers into the module, like type signatures and axioms."+ declName :: NiceDeclaration -> String declName Axiom{} = "Postulates" declName NiceField{} = "Fields"@@ -365,9 +380,13 @@ -- | The kind of the forward declaration, remembering the parameters. data DataRecOrFun- = DataName PositivityCheck Params -- ^ name of a data with parameters- | RecName PositivityCheck Params -- ^ name of a record with parameters- | FunName TerminationCheck -- ^ name of a function+ = DataName { kindPosCheck :: PositivityCheck, kindParams :: Params }+ -- ^ Name of a data type with parameters.+ | RecName { kindPosCheck :: PositivityCheck, kindParams :: Params }+ -- ^ Name of a record type with parameters.+ | FunName TerminationCheck+ -- ^ Name of a function.+ deriving (Typeable, Data) -- Ignore pragmas when checking equality instance Eq DataRecOrFun where@@ -376,7 +395,7 @@ FunName _ == FunName _ = True _ == _ = False -type Params = [Hiding]+type Params = [Arg BoundName] instance Show DataRecOrFun where show (DataName _ n) = "data type" -- "with " ++ show n ++ " visible parameters"@@ -407,6 +426,7 @@ -- NO_TERMINATION_CHECK pragma. combineTermChecks :: Range -> [TerminationCheck] -> Nice TerminationCheck combineTermChecks r tcs = loop tcs where+ loop :: [TerminationCheck] -> Nice TerminationCheck loop [] = return TerminationCheck loop (tc : tcs) = do let failure r = throwError $ InvalidMeasureMutual r@@ -431,11 +451,76 @@ (NonTerminating , NoTerminationCheck ) -> failure r (NonTerminating , Terminating ) -> failure r +-- | Check that the parameters of the data/record definition+-- match the parameters of the corresponding signature.+--+-- The definition may omit some hidden parameters.+-- The names need to match.+-- The types are not checked here.+--+-- Precondition: the signature and definition have the same kind (data/record/fun).+--+matchParameters+ :: Name -- ^ The data/record name.+ -> DataRecOrFun -- ^ The data/record signature.+ -> DataRecOrFun -- ^ The parameters as given in the data/record definition.+ -> Nice ()+matchParameters _ FunName{} FunName{} = return ()+matchParameters x sig def = loop (kindParams sig) (kindParams def)+ where+ failure = throwError $ WrongParameters x (kindParams sig) (kindParams def)+ loop hs [] = unless (all notVisible hs) failure+ loop [] (_:_) = failure+ loop (h:hs) (j:js)+ | h == j = loop hs js+ | notVisible h, visible j = loop hs (j:js)+ | otherwise = failure -- | Nicifier monad.+-- Preserve the state when throwing an exception. -type Nice = StateT NiceEnv (Either DeclarationException)+newtype Nice a = Nice { unNice :: NiceEnv -> (Either DeclarationException a, NiceEnv) } +-- We have to hand-roll the instances ourselves, since the automagic does not+-- work for @Nice a = State s (Except e a)@, only for the usual+-- @Nice a = StateT s (Except e) a@.++instance Functor Nice where+ fmap f m = Nice $ \ s ->+ let (r, s') = unNice m s in+ case r of+ Left e -> (Left e, s')+ Right a -> (Right (f a), s')++instance Applicative Nice where+ pure a = Nice $ \ s -> (Right a, s)+ (<*>) = ap++instance Monad Nice where+ return = pure+ m >>= k = Nice $ \ s ->+ let (r, s') = unNice m s in+ case r of+ Left e -> (Left e, s')+ Right a -> unNice (k a) s'++instance MonadState NiceEnv Nice where+ state f = Nice $ \ s -> first Right $ f s+ -- get = Nice $ \ s -> (Right s, s) -- Subsumed by state++instance MonadError DeclarationException Nice where+ throwError e = Nice $ \ s -> (Left e, s)+ catchError m h = Nice $ \ s ->+ let (r, s') = unNice m s in+ case r of+ Left e -> unNice (h e) s'+ Right a -> (Right a, s')++-- | Run a Nicifier computation, return result and warnings+-- (in chronological order).+runNice :: Nice a -> (Either DeclarationException a, NiceWarnings)+runNice m = second (reverse . niceWarn) $ unNice m initNiceEnv+ -- | Nicifier state. data NiceEnv = NiceEnv@@ -449,11 +534,15 @@ -- ^ Catchall pragma waiting for a function clause. , fixs :: Fixities , pols :: Polarities+ , niceWarn :: NiceWarnings+ -- ^ Stack of warnings. Head is last warning. } type LoneSigs = Map Name DataRecOrFun type Fixities = Map Name Fixity' type Polarities = Map Name [Occurrence]+type NiceWarnings = [DeclarationWarning]+ -- ^ Stack of warnings. Head is last warning. -- | Initial nicifier state. @@ -465,6 +554,7 @@ , _catchall = False , fixs = empty , pols = empty+ , niceWarn = [] } -- * Handling the lone signatures, stored to infer mutual blocks.@@ -553,6 +643,10 @@ catchallPragma .= ca_old return result +-- | Add a new warning.+niceWarning :: DeclarationWarning -> Nice ()+niceWarning w = modify $ \ st -> st { niceWarn = w : niceWarn st }+ -- | Check whether name is not "_" and return its fixity. getFixity :: Name -> Nice Fixity' getFixity x = Map.findWithDefault noFixity' x <$> gets fixs -- WAS: defaultFixity'@@ -565,9 +659,6 @@ modify (\s -> s { pols = Map.delete x (pols s) }) return p -runNice :: Nice a -> Either DeclarationException a-runNice nice = nice `evalStateT` initNiceEnv- data DeclKind = LoneSig DataRecOrFun Name | LoneDefs DataRecOrFun [Name]@@ -578,7 +669,7 @@ declKind (FunSig _ _ _ _ _ _ _ tc x _) = LoneSig (FunName tc) x declKind (NiceRecSig _ _ _ _ pc x pars _) = LoneSig (RecName pc $ parameters pars) x declKind (NiceDataSig _ _ _ _ pc x pars _)= LoneSig (DataName pc $ parameters pars) x-declKind (FunDef _ _ _ _ tc x _) = LoneDefs (FunName tc) [x]+declKind (FunDef _ _ _ _ _ tc x _) = LoneDefs (FunName tc) [x] declKind (DataDef _ _ _ pc x pars _) = LoneDefs (DataName pc $ parameters pars) [x] declKind (RecDef _ _ _ pc x _ _ _ pars _) = LoneDefs (RecName pc $ parameters pars) [x] declKind (NiceUnquoteDef _ _ _ _ tc xs _) = LoneDefs (FunName tc) xs@@ -595,43 +686,61 @@ declKind NicePatternSyn{} = OtherDecl declKind NiceUnquoteDecl{} = OtherDecl --- | Compute visible parameters of a data or record signature or definition.+-- | Compute parameters of a data or record signature or definition. parameters :: [LamBinding] -> Params-parameters = List.concat . List.map numP where- numP (DomainFree i _) = [argInfoHiding i]- numP (DomainFull (TypedBindings _ (Arg i (TBind _ xs _)))) = List.replicate (length xs) $ argInfoHiding i- numP (DomainFull (TypedBindings _ (Arg _ TLet{}))) = []+parameters = List.concatMap $ \case+ DomainFree i x -> [Arg i x]+ DomainFull (TypedBindings _ (Arg _ TLet{})) -> []+ DomainFull (TypedBindings _ (Arg i (TBind _ xs _))) -> for xs $ \ (WithHiding h x) ->+ mergeHiding $ WithHiding h $ Arg i x -- | Main. niceDeclarations :: [Declaration] -> Nice [NiceDeclaration] niceDeclarations ds = do+ -- Get fixity and syntax declarations. (fixs, polarities) <- fixitiesAndPolarities ds let declared = Set.fromList (concatMap declaredNames ds)- unknownFixs = Map.keysSet fixs Set.\\ declared- unknownPols = Map.keysSet polarities Set.\\ declared- case (Set.null unknownFixs, Set.null unknownPols) of- -- If we have fixity/syntax decls for names not declared- -- in the current scope, fail.- (False, _) -> throwError $ UnknownNamesInFixityDecl- (Set.toList unknownFixs)- -- Fail if there are polarity pragmas with undeclared names.- (_, False) -> throwError $ UnknownNamesInPolarityPragmas- (Set.toList unknownPols)- (True, True) -> localState $ do- -- Run the nicifier in an initial environment of fixity decls- -- and polarities.- put $ initNiceEnv { fixs = fixs, pols = polarities }- ds <- nice ds- -- Check that every polarity pragma was used.- unusedPolarities <- gets (Map.keys . pols)- unless (null unusedPolarities) $ do- throwError $ PolarityPragmasButNotPostulates unusedPolarities- -- Check that every signature got its definition.- checkLoneSigs . Map.toList =<< use loneSigs- -- Note that loneSigs is ensured to be empty.- -- (Important, since inferMutualBlocks also uses loneSigs state).- inferMutualBlocks ds++ -- If we have names in fixity declarations+ -- which are not defined in the appropriate scope,+ -- raise a warning and delete them from fixs.+ fixs <- ifNull (Map.keysSet fixs Set.\\ declared) (return fixs) $ \ unknownFixs -> do+ niceWarning $ UnknownNamesInFixityDecl $ Set.toList unknownFixs+ -- Note: Data.Map.restrictKeys requires containers >= 0.5.8.2+ -- return $ Map.restrictKeys fixs declared+ return $ Map.filterWithKey (\ k _ -> Set.member k declared) fixs++ -- Same for undefined names in polarity declarations.+ polarities <- ifNull (Map.keysSet polarities Set.\\ declared) (return polarities) $+ \ unknownPols -> do+ niceWarning $ UnknownNamesInPolarityPragmas $ Set.toList unknownPols+ -- Note: Data.Map.restrictKeys requires containers >= 0.5.8.2+ -- return $ Map.restrictKeys polarities declared+ return $ Map.filterWithKey (\ k _ -> Set.member k declared) polarities++ -- Run the nicifier in an initial environment of fixity decls+ -- and polarities. But keep the warnings.+ st <- get+ put $ initNiceEnv { fixs = fixs, pols = polarities, niceWarn = niceWarn st }+ ds <- nice ds++ -- Check that every polarity pragma was used.+ unlessNullM (Map.keys <$> gets pols) $ \ unusedPolarities -> do+ niceWarning $ PolarityPragmasButNotPostulates unusedPolarities++ -- Check that every signature got its definition.+ checkLoneSigs . Map.toList =<< use loneSigs++ -- Note that loneSigs is ensured to be empty.+ -- (Important, since inferMutualBlocks also uses loneSigs state).+ res <- inferMutualBlocks ds++ -- Restore the old state, but keep the warnings.+ warns <- gets niceWarn+ put $ st { niceWarn = warns }+ return res+ where -- Compute the names defined in a declaration. -- We stay in the current scope, i.e., do not go into modules.@@ -767,7 +876,7 @@ removeLoneSig x cs <- mkClauses x (expandEllipsis fits) False fx <- getFixity x- return ([FunDef (getRange fits) fits fx ConcreteDef termCheck x cs] , rest)+ return ([FunDef (getRange fits) fits fx ConcreteDef NotInstanceDef termCheck x cs] , rest) -- case: clauses match more than one sigs (ambiguity) l -> throwError $ AmbiguousFunClauses lhs $ reverse $ map fst l -- "ambiguous function clause; cannot assign it uniquely to one type signature"@@ -779,13 +888,13 @@ (DataSig r Inductive x tel t) -> do pc <- use positivityCheckPragma addLoneSig x (DataName pc $ parameters tel)- (,) <$> dataOrRec pc DataDef NiceDataSig (niceAxioms DataBlock) r x tel (Just t) Nothing+ (,) <$> dataOrRec pc DataDef NiceDataSig (niceAxioms DataBlock) r x (Just (tel, t)) Nothing <*> return ds - (Data r Inductive x tel t cs) -> do+ (Data r Inductive x tel mt cs) -> do pc <- use positivityCheckPragma- t <- defaultTypeSig (DataName pc $ parameters tel) x t- (,) <$> dataOrRec pc DataDef NiceDataSig (niceAxioms DataBlock) r x tel t (Just cs)+ mt <- defaultTypeSig (DataName pc $ parameters tel) x mt+ (,) <$> dataOrRec pc DataDef NiceDataSig (niceAxioms DataBlock) r x ((tel,) <$> mt) (Just (tel, cs)) <*> return ds (RecordSig r x tel t) -> do@@ -794,12 +903,12 @@ fx <- getFixity x return ([NiceRecSig r fx PublicAccess ConcreteDef pc x tel t] , ds) - (Record r x i e c tel t cs) -> do+ (Record r x i e c tel mt cs) -> do pc <- use positivityCheckPragma- t <- defaultTypeSig (RecName pc $ parameters tel) x t+ mt <- defaultTypeSig (RecName pc $ parameters tel) x mt c <- traverse (\(cname, cinst) -> do fix <- getFixity cname; return (ThingWithFixity cname fix, cinst)) c (,) <$> dataOrRec pc (\ r f a pc x tel cs -> RecDef r f a pc x i e c tel cs) NiceRecSig- niceDeclarations r x tel t (Just cs)+ niceDeclarations r x ((tel,) <$> mt) (Just (tel, cs)) <*> return ds Mutual r ds' ->@@ -942,34 +1051,36 @@ defaultTypeSig :: DataRecOrFun -> Name -> Maybe Expr -> Nice (Maybe Expr) defaultTypeSig k x t@Just{} = return t defaultTypeSig k x Nothing = do- mk <- getSig x- case mk of- Nothing -> throwError $ MissingDataSignature x- Just k' | k == k' -> Nothing <$ removeLoneSig x- | sameKind k k' -> throwError $ WrongParameters x- | otherwise -> throwError $ WrongDefinition x k' k+ caseMaybeM (getSig x) (throwError $ MissingDataSignature x) $ \ k' -> do+ unless (sameKind k k') $ throwError $ WrongDefinition x k' k+ unless (k == k') $ matchParameters x k' k+ Nothing <$ removeLoneSig x - dataOrRec :: forall a .- PositivityCheck ->- (Range -> Fixity' -> IsAbstract -> PositivityCheck -> Name -> [LamBinding] ->- [NiceConstructor] -> NiceDeclaration) ->- (Range -> Fixity' -> Access -> IsAbstract -> PositivityCheck -> Name -> [LamBinding] -> Expr ->- NiceDeclaration) ->- ([a] -> Nice [NiceDeclaration]) ->- Range ->- Name ->- [LamBinding] ->- Maybe Expr ->- Maybe [a] ->- Nice [NiceDeclaration]- dataOrRec pc mkDef mkSig niceD r x tel mt mcs = do- mds <- traverse niceD mcs+ dataOrRec+ :: forall a+ . PositivityCheck+ -> (Range -> Fixity' -> IsAbstract -> PositivityCheck -> Name -> [LamBinding] -> [NiceConstructor] -> NiceDeclaration)+ -- ^ Construct definition.+ -> (Range -> Fixity' -> Access -> IsAbstract -> PositivityCheck -> Name -> [LamBinding] -> Expr -> NiceDeclaration)+ -- ^ Construct signature.+ -> ([a] -> Nice [NiceDeclaration])+ -- ^ Constructor checking.+ -> Range+ -> Name -- ^ Data/record type name.+ -> Maybe ([LamBinding], Expr) -- ^ Parameters and type. If not @Nothing@ a signature is created.+ -> Maybe ([LamBinding], [a]) -- ^ Parameters and constructors. If not @Nothing@, a definition body is created.+ -> Nice [NiceDeclaration]+ dataOrRec pc mkDef mkSig niceD r x mt mcs = do+ mds <- Trav.forM mcs $ \ (tel, cs) -> (tel,) <$> niceD cs f <- getFixity x return $ catMaybes $- [ mt <&> \ t -> mkSig (fuseRange x t) f PublicAccess ConcreteDef pc x tel t- , mkDef r f ConcreteDef pc x (concatMap dropType tel) <$> mds+ [ mt <&> \ (tel, t) -> mkSig (fuseRange x t) f PublicAccess ConcreteDef pc x tel t+ , mds <&> \ (tel, ds) -> mkDef r f ConcreteDef pc x (caseMaybe mt tel $ const $ concatMap dropType tel) ds+ -- If a type is given (mt /= Nothing), we have to delete the types in @tel@+ -- for the data definition, lest we duplicate them. ] where+ -- | Drop type annotations and lets from bindings. dropType :: LamBinding -> [LamBinding] dropType (DomainFull (TypedBindings _r (Arg ai (TBind _ xs _)))) = map (mergeHiding . fmap (DomainFree ai)) xs@@ -985,7 +1096,7 @@ TypeSig rel x t -> do fx <- getFixity x return [ Axiom (getRange d) fx PublicAccess ConcreteDef NotInstanceDef rel Nothing x t ]- Field i x argt -> do+ Field i x argt | b == FieldBlock -> do fx <- getFixity x return [ NiceField (getRange d) fx PublicAccess ConcreteDef i x argt ] InstanceB r decls -> do@@ -1003,7 +1114,7 @@ cs <- mkClauses x (expandEllipsis ds0) False f <- getFixity x return [ FunSig (fuseRange x t) f PublicAccess ConcreteDef NotInstanceDef NotMacroDef info termCheck x t- , FunDef (getRange ds0) ds0 f ConcreteDef termCheck x cs ]+ , FunDef (getRange ds0) ds0 f ConcreteDef NotInstanceDef termCheck x cs ] where t = case mt of Just t -> t@@ -1017,21 +1128,32 @@ expandEllipsis (d@(FunClause Ellipsis{} _ _ _) : ds) = d : expandEllipsis ds expandEllipsis (d@(FunClause lhs@(LHS p ps _ _) _ _ _) : ds) =- d : expand (setInserted p) (map setInserted ps) ds+ d : expand (wipe p) (map wipe ps) ds where expand _ _ [] = [] expand p ps (d@(Pragma (CatchallPragma r)) : ds) = d : expand p ps ds- expand p ps (FunClause (Ellipsis r ps' eqs []) rhs wh ca : ds) =- FunClause (LHS (setRange r p) ((setRange r ps) ++ ps') eqs []) rhs wh ca : expand p ps ds expand p ps (FunClause (Ellipsis r ps' eqs es) rhs wh ca : ds) =- FunClause (LHS (setRange r p) ((setRange r ps) ++ ps') eqs es) rhs wh ca : expand p (ps ++ ps') ds+ FunClause (LHS (setRange r p) ((setRange r ps) ++ ps') eqs es) rhs wh ca+ : expand p (applyUnless (null es) (++ (map wipe ps')) ps) ds+ -- If we have with-expressions (es /= []) then the following+ -- ellipses also get the additional with patterns ps'+ -- We can have ellipses after a fun clause.+ -- They refer to the last clause that introduced new with-expressions. expand p ps (d@(FunClause (LHS _ _ _ []) _ _ _) : ds) = d : expand p ps ds- expand _ _ (d@(FunClause (LHS p ps _ (_ : _)) _ _ _) : ds) =- d : expand p ps ds+ -- Same here: If we have new with-expressions, the next ellipses will+ -- refer to us.+ expand _ _ (d@(FunClause (LHS p' ps' _ (_ : _)) _ _ _) : ds) =+ d : expand (wipe p') (map wipe ps') ds+ -- Andreas, Jesper, 2017-05-13, issue #2578+ -- Need to update the range also on the next with-patterns. expand _ _ (_ : ds) = __IMPOSSIBLE__ expandEllipsis (_ : ds) = __IMPOSSIBLE__ + -- Before copying a pattern, remove traces to its origin.+ wipe :: Pattern -> Pattern+ wipe = killRange . setInserted+ setInserted :: Pattern -> Pattern setInserted p = case p of IdentP{} -> p@@ -1093,14 +1215,14 @@ xStrings = nameStringParts x patStrings = concatMap nameStringParts pns in--- trace ("x = " ++ show x) $+-- trace ("x = " ++ prettyShow x) $ -- trace ("pns = " ++ show pns) $ -- trace ("xStrings = " ++ show xStrings) $ -- trace ("patStrings = " ++ show patStrings) $ -- trace ("mFixity = " ++ show mFixity) $ case (headMaybe pns, mFixity) of -- first identifier in the patterns is the fun.symbol?- (Just y, _) | x == y -> True -- trace ("couldBe since y = " ++ show y) $ True+ (Just y, _) | x == y -> True -- trace ("couldBe since y = " ++ prettyShow y) $ True -- are the parts of x contained in p _ | xStrings `isSublistOf` patStrings -> True -- trace ("couldBe since isSublistOf") $ True -- looking for a mixfix fun.symb@@ -1163,7 +1285,7 @@ notAllowedInMutual Axiom{} = False notAllowedInMutual d = declKind d == OtherDecl -- Pull type signatures to the top- (sigs, other) = partition isTypeSig ds+ (sigs, other) = List.partition isTypeSig ds isTypeSig Axiom{} = True isTypeSig d | LoneSig{} <- declKind d = True isTypeSig _ = False@@ -1177,7 +1299,7 @@ -- do not termination check a mutual block if any of its -- inner declarations comes with a {-# NO_TERMINATION_CHECK #-} termCheck (FunSig _ _ _ _ _ _ _ tc _ _) = tc- termCheck (FunDef _ _ _ _ tc _ _) = tc+ termCheck (FunDef _ _ _ _ _ tc _ _) = tc -- ASR (28 December 2015): Is this equation necessary? termCheck (NiceMutual _ tc _ _) = __IMPOSSIBLE__ termCheck (NiceUnquoteDecl _ _ _ _ _ tc _ _) = tc@@ -1215,19 +1337,24 @@ abstractBlock r ds = do let (ds', anyChange) = runChange $ mkAbstract ds inherited = r == noRange- -- hack to avoid failing on inherited abstract blocks in where clauses- if anyChange || inherited then return ds' else throwError $ UselessAbstract r+ if anyChange then return ds' else do+ -- hack to avoid failing on inherited abstract blocks in where clauses+ unless inherited $ niceWarning $ UselessAbstract r+ return ds -- no change! privateBlock _ _ [] = return [] privateBlock r o ds = do let (ds', anyChange) = runChange $ mkPrivate o ds- if anyChange then return ds' else- if o == UserWritten then throwError $ UselessPrivate r else return ds -- no change!+ if anyChange then return ds' else do+ when (o == UserWritten) $ niceWarning $ UselessPrivate r+ return ds -- no change! instanceBlock _ [] = return [] instanceBlock r ds = do let (ds', anyChange) = runChange $ mapM mkInstance ds- if anyChange then return ds' else throwError $ UselessInstance r+ if anyChange then return ds' else do+ niceWarning $ UselessInstance r+ return ds -- no change! -- Make a declaration eligible for instance search. mkInstance :: Updater NiceDeclaration@@ -1238,7 +1365,7 @@ NiceUnquoteDecl r f p a i tc x e -> (\ i -> NiceUnquoteDecl r f p a i tc x e) <$> setInstance i NiceMutual{} -> return d NiceFunClause{} -> return d- FunDef{} -> return d+ FunDef r ds f a i tc x cs -> (\ i -> FunDef r ds f a i tc x cs) <$> setInstance i NiceField{} -> return d -- Field instance are handled by the parser PrimitiveFunction{} -> return d NiceUnquoteDef{} -> return d@@ -1297,7 +1424,7 @@ mkAbstract d = case d of NiceMutual r termCheck pc ds -> NiceMutual r termCheck pc <$> mkAbstract ds- FunDef r ds f a tc x cs -> (\ a -> FunDef r ds f a tc x) <$> mkAbstract a <*> mkAbstract cs+ FunDef r ds f a i tc x cs -> (\ a -> FunDef r ds f a i tc x) <$> mkAbstract a <*> mkAbstract cs DataDef r f a pc x ps cs -> (\ a -> DataDef r f a pc x ps) <$> mkAbstract a <*> mkAbstract cs RecDef r f a pc x i e c ps cs -> (\ a -> RecDef r f a pc x i e c ps) <$> mkAbstract a <*> mkAbstract cs NiceFunClause r p a termCheck catchall d -> (\ a -> NiceFunClause r p a termCheck catchall d) <$> mkAbstract a@@ -1379,7 +1506,7 @@ NiceImport _ _ _ _ _ -> return $ d -- Andreas, 2016-07-08, issue #2089 -- we need to propagate 'private' to the named where modules- FunDef r ds f a tc x cls -> FunDef r ds f a tc x <$> mkPrivate o cls+ FunDef r ds f a i tc x cls -> FunDef r ds f a i tc x <$> mkPrivate o cls DataDef{} -> return $ d RecDef{} -> return $ d NicePatternSyn _ _ _ _ _ -> return $ d@@ -1517,7 +1644,7 @@ NiceDataSig r _ _ _ _ x bs e -> [DataSig r Inductive x bs e] NiceFunClause _ _ _ _ _ d -> [d] FunSig _ _ _ _ i _ rel tc x e -> inst i [TypeSig rel x e]- FunDef _r ds _ _ _ _ _ -> ds+ FunDef _r ds _ _ _ _ _ _ -> ds DataDef r _ _ _ x bs cs -> [Data r Inductive x bs Nothing $ concatMap notSoNiceDeclarations cs] RecDef r _ _ _ x i e c bs ds -> [Record r x i e (unThing <$> c) bs Nothing $ concatMap notSoNiceDeclarations ds] where unThing (ThingWithFixity c _, inst) = (c, inst)@@ -1545,7 +1672,7 @@ NiceDataSig{} -> Nothing NiceFunClause _ _ a _ _ _ -> Just a FunSig{} -> Nothing- FunDef _ _ _ a _ _ _ -> Just a+ FunDef _ _ _ a _ _ _ _ -> Just a DataDef _ _ a _ _ _ _ -> Just a RecDef _ _ a _ _ _ _ _ _ _ -> Just a NicePatternSyn{} -> Nothing
src/full/Agda/Syntax/Concrete/Name.hs view
@@ -12,7 +12,10 @@ import Control.Applicative import Data.ByteString.Char8 (ByteString)-import Data.List+import Data.Function+import qualified Data.List as List++import Data.Data (Data) import Data.Typeable (Typeable) import GHC.Generics (Generic)@@ -40,7 +43,7 @@ data Name = Name Range [NamePart] -- ^ A (mixfix) identifier. | NoName Range NameId -- ^ @_@.- deriving (Typeable)+ deriving (Typeable, Data) instance Underscore Name where underscore = NoName noRange __IMPOSSIBLE__@@ -53,7 +56,7 @@ data NamePart = Hole -- ^ @_@ part. | Id RawName -- ^ Identifier part.- deriving (Typeable, Generic)+ deriving (Typeable, Data, Generic) -- | Define equality on @Name@ to ignore range so same names in different -- locations are equal.@@ -96,7 +99,7 @@ data QName = Qual Name QName -- ^ @A.rest@. | QName Name -- ^ @x@.- deriving (Typeable, Eq, Ord)+ deriving (Typeable, Data, Eq, Ord) instance Underscore QName where underscore = QName underscore@@ -107,10 +110,16 @@ -- -- Invariant: The list must not be empty. -newtype TopLevelModuleName- = TopLevelModuleName { moduleNameParts :: [String] }- deriving (Show, Eq, Ord, Typeable, Sized)+data TopLevelModuleName = TopLevelModuleName+ { moduleNameRange :: Range+ , moduleNameParts :: [String]+ }+ deriving (Show, Typeable, Data) +instance Eq TopLevelModuleName where (==) = (==) `on` moduleNameParts+instance Ord TopLevelModuleName where compare = compare `on` moduleNameParts+instance Sized TopLevelModuleName where size = size . moduleNameParts+ ------------------------------------------------------------------------ -- * Operations on 'Name' and 'NamePart' ------------------------------------------------------------------------@@ -190,6 +199,12 @@ qnameParts (Qual x q) = x : qnameParts q qnameParts (QName x) = [x] +-- | Is the name qualified?++isQualified :: QName -> Bool+isQualified Qual{} = True+isQualified QName{} = False+ ------------------------------------------------------------------------ -- * Operations on 'TopLevelModuleName' ------------------------------------------------------------------------@@ -198,25 +213,26 @@ -- name is assumed to represent a top-level module name. toTopLevelModuleName :: QName -> TopLevelModuleName-toTopLevelModuleName = TopLevelModuleName . map prettyShow . qnameParts+toTopLevelModuleName q = TopLevelModuleName (getRange q) $ map prettyShow $ qnameParts q --- | Turns a top level module into a qualified name with 'noRange'.+-- UNUSED+-- -- | Turns a top level module into a qualified name with 'noRange'. -fromTopLevelModuleName :: TopLevelModuleName -> QName-fromTopLevelModuleName (TopLevelModuleName []) = __IMPOSSIBLE__-fromTopLevelModuleName (TopLevelModuleName (x:xs)) = loop x xs- where- loop x [] = QName (mk x)- loop x (y : ys) = Qual (mk x) $ loop y ys- mk :: String -> Name- mk x = Name noRange [Id x]+-- fromTopLevelModuleName :: TopLevelModuleName -> QName+-- fromTopLevelModuleName (TopLevelModuleName _ []) = __IMPOSSIBLE__+-- fromTopLevelModuleName (TopLevelModuleName _ (x:xs)) = loop x xs+-- where+-- loop x [] = QName (mk x)+-- loop x (y : ys) = Qual (mk x) $ loop y ys+-- mk :: String -> Name+-- mk x = Name noRange [Id x] -- | Turns a top-level module name into a file name with the given -- suffix. moduleNameToFileName :: TopLevelModuleName -> String -> FilePath-moduleNameToFileName (TopLevelModuleName []) ext = __IMPOSSIBLE__-moduleNameToFileName (TopLevelModuleName ms) ext =+moduleNameToFileName (TopLevelModuleName _ []) ext = __IMPOSSIBLE__+moduleNameToFileName (TopLevelModuleName _ ms) ext = joinPath (init ms) </> last ms <.> ext -- | Finds the current project's \"root\" directory, given a project@@ -228,7 +244,7 @@ -- Precondition: The module name must be well-formed. projectRoot :: AbsolutePath -> TopLevelModuleName -> AbsolutePath-projectRoot file (TopLevelModuleName m) =+projectRoot file (TopLevelModuleName _ m) = mkAbsolute $ foldr (.) id (replicate (length m - 1) takeDirectory) $ takeDirectory $@@ -308,7 +324,7 @@ pretty (QName x) = pretty x instance Pretty TopLevelModuleName where- pretty (TopLevelModuleName ms) = text $ intercalate "." ms+ pretty (TopLevelModuleName _ ms) = text $ List.intercalate "." ms ------------------------------------------------------------------------ -- * Range instances@@ -322,6 +338,9 @@ getRange (QName x) = getRange x getRange (Qual n x) = fuseRange n x +instance HasRange TopLevelModuleName where+ getRange = moduleNameRange+ instance SetRange Name where setRange r (Name _ ps) = Name r ps setRange r (NoName _ i) = NoName r i@@ -330,6 +349,9 @@ setRange r (QName x) = QName (setRange r x) setRange r (Qual n x) = Qual (setRange r n) (setRange r x) +instance SetRange TopLevelModuleName where+ setRange r (TopLevelModuleName _ x) = TopLevelModuleName r x+ instance KillRange QName where killRange (QName x) = QName $ killRange x killRange (Qual n x) = killRange n `Qual` killRange x@@ -337,6 +359,9 @@ instance KillRange Name where killRange (Name r ps) = Name (killRange r) ps killRange (NoName r i) = NoName (killRange r) i++instance KillRange TopLevelModuleName where+ killRange (TopLevelModuleName _ x) = TopLevelModuleName noRange x ------------------------------------------------------------------------ -- * NFData instances
src/full/Agda/Syntax/Concrete/Operators.hs view
@@ -1,6 +1,5 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE GADTs #-} {-| The parser doesn't know about operators and parses everything as normal function application. This module contains the functions that parses the@@ -26,7 +25,7 @@ import Data.Either (partitionEithers) import qualified Data.Foldable as Fold import Data.Function-import Data.List+import qualified Data.List as List import Data.Maybe import Data.Map (Map) import qualified Data.Map as Map@@ -49,16 +48,13 @@ import Agda.TypeChecking.Monad.Base (typeError, TypeError(..), LHSOrPatSyn(..)) import qualified Agda.TypeChecking.Monad.Benchmark as Bench+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.State (getScope) import Agda.TypeChecking.Monad.Options import Agda.Utils.Either import Agda.Utils.Pretty-#if MIN_VERSION_base(4,8,0)-import Agda.Utils.List hiding ( uncons )-#else import Agda.Utils.List-#endif import Agda.Utils.Trie (Trie) import qualified Agda.Utils.Trie as Trie @@ -71,8 +67,13 @@ -- | Bills the operator parser. -billToParser :: ScopeM a -> ScopeM a-billToParser = Bench.billTo [Bench.Parsing, Bench.Operators]+billToParser :: ExprKind -> ScopeM a -> ScopeM a+billToParser k = Bench.billTo+ [ Bench.Parsing+ , case k of+ IsExpr -> Bench.OperatorsExpr+ IsPattern -> Bench.OperatorsPattern+ ] --------------------------------------------------------------------------- -- * Building the parser@@ -138,9 +139,9 @@ -- and function symbols in scope. -- -- When parsing a pattern we do not use bound names. The effect is--- that operator parts (that are not constructor parts) can be used as--- atomic names in the pattern (so they can be rebound). See--- @test/succeed/OpBind.agda@ for an example.+-- that unqualified operator parts (that are not constructor parts)+-- can be used as atomic names in the pattern (so they can be+-- rebound). See @test/succeed/OpBind.agda@ for an example. -- -- When parsing a pattern we also disallow the use of sections, mainly -- because there is little need for sections in patterns. Note that@@ -258,7 +259,7 @@ -- resulting in a confusing error message claiming that "if" -- is not in scope. - (non, fix) = partition nonfix (filter (and . partsPresent) ops)+ (non, fix) = List.partition nonfix (filter (and . partsPresent) ops) cons = getDefinedNames [ConName, PatternSynName] flat conNames = Set.fromList $@@ -276,9 +277,11 @@ concatMap notationNames $ filter (or . partsPresent) ops) - isAtom x = case kind of- IsExpr -> not (Set.member x allParts) || Set.member x allNames- IsPattern -> not (Set.member x conParts) || Set.member x conNames+ isAtom x+ | kind == IsPattern && not (isQualified x) =+ not (Set.member x conParts) || Set.member x conNames+ | otherwise =+ not (Set.member x allParts) || Set.member x allNames -- If string is a part of notation, it cannot be used as an identifier, -- unless it is also used as an identifier. See issue 307. @@ -324,8 +327,8 @@ relatedOperators :: [(Integer, [NotationSection])] relatedOperators = map (\((l, ns) : rest) -> (l, ns ++ concat (map snd rest))) .- groupBy ((==) `on` fst) .- sortBy (compare `on` fst) .+ List.groupBy ((==) `on` fst) .+ List.sortBy (compare `on` fst) . mapMaybe (\n -> case level n of Unrelated -> Nothing r@(Related l) ->@@ -600,11 +603,9 @@ [(p,lhs)] -> do reportSDoc "scope.operators" 50 $ return $ text "Parsed lhs:" <+> pretty lhs return (lhs, ops)- [] -> typeError $ OperatorChangeMessage- $ OperatorInformation ops+ [] -> typeError $ OperatorInformation ops $ NoParseForLHS lhsOrPatSyn p- rs -> typeError $ OperatorChangeMessage- $ OperatorInformation ops+ rs -> typeError $ OperatorInformation ops $ AmbiguousParseForLHS lhsOrPatSyn p $ map (fullParen . fst) rs where@@ -663,12 +664,11 @@ -- | Parses a left-hand side, and makes sure that it defined the expected name. parseLHS :: QName -> Pattern -> ScopeM LHSCore-parseLHS top p = billToParser $ do+parseLHS top p = billToParser IsPattern $ do (res, ops) <- parseLHS' IsLHS (Just top) p case res of Right (f, lhs) -> return lhs- _ -> typeError $ OperatorChangeMessage- $ OperatorInformation ops+ _ -> typeError $ OperatorInformation ops $ NoParseForLHS IsLHS p -- | Parses a pattern.@@ -679,12 +679,11 @@ parsePatternSyn = parsePatternOrSyn IsPatSyn parsePatternOrSyn :: LHSOrPatSyn -> Pattern -> ScopeM Pattern-parsePatternOrSyn lhsOrPatSyn p = billToParser $ do+parsePatternOrSyn lhsOrPatSyn p = billToParser IsPattern $ do (res, ops) <- parseLHS' lhsOrPatSyn Nothing p case res of Left p -> return p- _ -> typeError $ OperatorChangeMessage- $ OperatorInformation ops+ _ -> typeError $ OperatorInformation ops $ NoParseForLHS lhsOrPatSyn p -- | Helper function for 'parseLHS' and 'parsePattern'.@@ -715,12 +714,12 @@ -- for @Data.Nat._+_@ we return the list @[Data,Nat]@. qualifierModules :: [QName] -> [[Name]] qualifierModules qs =- nub $ filter (not . null) $ map (init . qnameParts) qs+ List.nub $ filter (not . null) $ map (init . qnameParts) qs -- | Parse a list of expressions into an application. parseApplication :: [Expr] -> ScopeM Expr parseApplication [e] = return e-parseApplication es = billToParser $ do+parseApplication es = billToParser IsExpr $ do -- Build the parser let names = [ q | Ident q <- es ] ms = qualifierModules names@@ -734,11 +733,9 @@ reportSDoc "scope.operators" 50 $ return $ text "Parsed an operator application:" <+> pretty e return e- [] -> typeError $ OperatorChangeMessage- $ OperatorInformation ops+ [] -> typeError $ OperatorInformation ops $ NoParseForApplication es- es' -> typeError $ OperatorChangeMessage- $ OperatorInformation ops+ es' -> typeError $ OperatorInformation ops $ AmbiguousParseForApplication es $ map fullParen es' @@ -747,7 +744,7 @@ parseModuleIdentifier e = typeError $ NotAModuleExpr e parseRawModuleApplication :: [Expr] -> ScopeM (QName, [NamedArg Expr])-parseRawModuleApplication es = billToParser $ do+parseRawModuleApplication es = billToParser IsExpr $ do let e : es_args = es m <- parseModuleIdentifier e @@ -762,13 +759,11 @@ -- TODO: not sure about forcing case {-force $-} parse (parseSections, pArgs p) es_args of [as] -> return (m, as)- [] -> typeError $ OperatorChangeMessage- $ OperatorInformation ops+ [] -> typeError $ OperatorInformation ops $ NoParseForApplication es ass -> do let f = fullParen . foldl (App noRange) (Ident m)- typeError $ OperatorChangeMessage- $ OperatorInformation ops+ typeError $ OperatorInformation ops $ AmbiguousParseForApplication es $ map f ass @@ -803,9 +798,9 @@ AppV e1 (Arg info e2) -> par $ unExprView $ AppV (fullParen' e1) (Arg info e2') where e2' = case argInfoHiding info of- Hidden -> e2- Instance -> e2- NotHidden -> fullParen' <$> e2+ Hidden -> e2+ Instance{} -> e2+ NotHidden -> fullParen' <$> e2 OpAppV x ns es -> par $ unExprView $ OpAppV x ns $ (map . fmap . fmap . fmap . fmap) fullParen' es LamV bs e -> par $ unExprView $ LamV bs (fullParen e) where
src/full/Agda/Syntax/Concrete/Operators/Parser.hs view
@@ -1,7 +1,6 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-} module Agda.Syntax.Concrete.Operators.Parser where @@ -13,8 +12,6 @@ import qualified Data.Strict.Maybe as Strict import Data.Set (Set) -import Text.PrettyPrint.HughesPJ hiding (empty)- import Agda.Syntax.Position import qualified Agda.Syntax.Abstract.Name as A import Agda.Syntax.Common@@ -24,12 +21,14 @@ import Agda.Syntax.Concrete.Operators.Parser.Monad hiding (parse) import qualified Agda.Syntax.Concrete.Operators.Parser.Monad as P +import Agda.Utils.Pretty+ #include "undefined.h" import Agda.Utils.Impossible placeholder :: PositionInName -> Parser e (MaybePlaceholder e) placeholder p =- annotate (const $ text ("_" ++ show p)) $+ doc (text ("_" ++ show p)) $ sat $ \t -> case t of Placeholder p' | p' == p -> True@@ -43,17 +42,11 @@ where p' = noPlaceholder <$> p -notPlaceholder :: Parser e e-notPlaceholder = do- tok <- token+satNoPlaceholder :: (e -> Maybe a) -> Parser e a+satNoPlaceholder p = sat' $ \tok -> case tok of- Placeholder _ -> empty- NoPlaceholder _ e -> return e--sat' :: (e -> Bool) -> Parser e e-sat' p = do- tok <- notPlaceholder- if p tok then return tok else empty+ NoPlaceholder _ e -> p e+ Placeholder _ -> Nothing data ExprView e = LocalV QName@@ -179,16 +172,14 @@ -- | Parse a specific identifier as a NamePart partP :: IsExpr e => [Name] -> RawName -> Parser e Range-partP ms s = annotate (const $ text (show str)) $ do- tok <- notPlaceholder- case isLocal tok of- Just p -> return p- Nothing -> empty- where- str = show (foldr Qual (QName (Name noRange [Id s])) ms)- isLocal e = case exprView e of- LocalV y | str == show y -> Just (getRange y)- _ -> Nothing+partP ms s =+ doc (text (show str)) $+ satNoPlaceholder isLocal+ where+ str = prettyShow $ foldr Qual (QName $ Name noRange [Id s]) ms+ isLocal e = case exprView e of+ LocalV y | str == prettyShow y -> Just $ getRange y+ _ -> Nothing -- | Parses a split-up, unqualified name consisting of at least two -- name parts.@@ -198,27 +189,25 @@ -- first name part that is not an underscore. atLeastTwoParts :: IsExpr e => Parser e Name-atLeastTwoParts = do- (r, ps) <- parts Beginning- case r of- Nothing -> __IMPOSSIBLE__- Just r -> return (Name r ps)+atLeastTwoParts =+ (\p1 ps p2 ->+ let all = p1 : ps ++ [p2] in+ case catMaybes (map fst all) of+ r : _ -> Name r (map snd all)+ [] -> __IMPOSSIBLE__)+ <$> part Beginning+ <*> many (part Middle)+ <*> part End where- parts pos = do- tok <- token- (pos', r, p) <- case tok of- Placeholder pos' -> return (pos', Nothing, Hole)- NoPlaceholder (Strict.Just pos') e -> case exprView e of- LocalV (QName (Name r [Id s])) -> return (pos', Just r, Id s)- _ -> empty- _ -> empty- if pos == Middle && pos' == End then- return (r, [p])- else if pos' == pos then do- (r', ps) <- parts Middle- return (maybe r' Just r, p : ps)- else- empty+ part pos = sat' $ \tok -> case tok of+ Placeholder pos' | pos == pos' -> Just ( Nothing+ , Hole+ )+ NoPlaceholder (Strict.Just pos') e | pos == pos' ->+ case exprView e of+ LocalV (QName (Name r [Id s])) -> Just (Just r, Id s)+ _ -> Nothing+ _ -> Nothing -- | Either a wildcard (@_@), or an unqualified name (possibly -- containing multiple name parts).@@ -227,11 +216,11 @@ wildOrUnqualifiedName = (Nothing <$ partP [] "_") <|>- (do e <- notPlaceholder- case exprView e of- LocalV (QName n) -> return (Just n)- WildV _ -> return Nothing- _ -> empty)+ (satNoPlaceholder $ \e ->+ case exprView e of+ LocalV (QName n) -> Just (Just n)+ WildV _ -> Just Nothing+ _ -> Nothing) <|> Just <$> atLeastTwoParts @@ -310,7 +299,7 @@ [Name] -> Notation -> Parser e (Range, [Either (MaybePlaceholder e, NamedArg Int) (LamBinding, Int)])- worker ms [] = return (noRange, [])+ worker ms [] = pure (noRange, []) worker ms (IdPart x : xs) = (\r1 (r2, es) -> (fuseRanges r1 r2, es)) <$> partP ms x@@ -360,29 +349,12 @@ isPlaceholder Placeholder{} = 1 argsP :: IsExpr e => Parser e e -> Parser e [NamedArg e]-argsP p = many (annotate (const $ text "<argument>") $- nothidden <|> hidden <|> instanceH)- where- isHidden (HiddenArgV _) = True- isHidden _ = False-- isInstance (InstanceArgV _) = True- isInstance _ = False-- nothidden = defaultArg . unnamed <$> do- e <- p- case exprView e of- HiddenArgV _ -> empty- InstanceArgV _ -> empty- _ -> return e-- instanceH = do- InstanceArgV e <- exprView <$> sat' (isInstance . exprView)- return $ makeInstance $ defaultArg e-- hidden = do- HiddenArgV e <- exprView <$> sat' (isHidden . exprView)- return $ hide $ defaultArg e+argsP p = many (mkArg <$> p)+ where+ mkArg e = case exprView e of+ HiddenArgV e -> hide (defaultArg e)+ InstanceArgV e -> makeInstance (defaultArg e)+ _ -> defaultArg (unnamed e) appP :: IsExpr e => Parser e e -> Parser e [NamedArg e] -> Parser e e appP p pa = foldl app <$> p <*> pa@@ -390,8 +362,9 @@ app e = unExprView . AppV e atomP :: IsExpr e => (QName -> Bool) -> Parser e e-atomP p = annotate (const $ text "<atom>") $ do- e <- notPlaceholder- case exprView e of- LocalV x | not (p x) -> empty- _ -> return e+atomP p =+ doc (text "<atom>") $+ satNoPlaceholder $ \e ->+ case exprView e of+ LocalV x | not (p x) -> Nothing+ _ -> Just e
src/full/Agda/Syntax/Concrete/Operators/Parser/Monad.hs view
@@ -2,19 +2,17 @@ -- | The parser monad used by the operator parser ------------------------------------------------------------------------ -{-# LANGUAGE CPP #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE Rank2Types #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE Rank2Types #-} module Agda.Syntax.Concrete.Operators.Parser.Monad ( MemoKey(..) , Parser , parse- , token+ , sat' , sat- , tok- , annotate+ , doc , memoise , memoiseIfPrinting , grammar@@ -54,10 +52,11 @@ parse :: forall tok a. Parser tok a -> [MaybePlaceholder tok] -> [a] parse = Parser.parse --- | Parses a single token.+-- | Parses a token satisfying the given predicate. The computed value+-- is returned. -token :: Parser tok (MaybePlaceholder tok)-token = Parser.token+sat' :: (MaybePlaceholder tok -> Maybe a) -> Parser tok a+sat' = Parser.sat' -- | Parses a token satisfying the given predicate. @@ -65,17 +64,11 @@ Parser tok (MaybePlaceholder tok) sat = Parser.sat --- | Parses a given token.--tok :: (Eq tok, Show tok) =>- MaybePlaceholder tok -> Parser tok (MaybePlaceholder tok)-tok = Parser.tok---- | Uses the given function to modify the printed representation (if--- any) of the given parser.+-- | Uses the given document as the printed representation of the+-- given parser. The document's precedence is taken to be 'atomP'. -annotate :: (Doc -> Doc) -> Parser tok a -> Parser tok a-annotate = Parser.annotate+doc :: Doc -> Parser tok a -> Parser tok a+doc = Parser.doc -- | Memoises the given parser. --
src/full/Agda/Syntax/Concrete/Pretty.hs view
@@ -74,9 +74,9 @@ prettyHiding :: LensHiding a => a -> (Doc -> Doc) -> Doc -> Doc prettyHiding a parens = case getHiding a of- Hidden -> braces'- Instance -> dbraces- NotHidden -> parens+ Hidden -> braces'+ Instance{} -> dbraces+ NotHidden -> parens prettyRelevance :: LensRelevance a => a -> Doc -> Doc prettyRelevance a d =@@ -93,7 +93,6 @@ instance Pretty Relevance where pretty Forced{} = empty- pretty UnusedArg = empty pretty Relevant = empty pretty Irrelevant = text "." pretty NonStrict = text ".."@@ -137,9 +136,9 @@ sep [ lambda <+> fsep (map pretty bs) <+> arrow , nest 2 $ pretty e ]- AbsurdLam _ NotHidden -> lambda <+> text "()"- AbsurdLam _ Instance -> lambda <+> text "{{}}"- AbsurdLam _ Hidden -> lambda <+> text "{}"+ AbsurdLam _ NotHidden -> lambda <+> text "()"+ AbsurdLam _ Instance{} -> lambda <+> text "{{}}"+ AbsurdLam _ Hidden -> lambda <+> text "{}" ExtendedLam _ pes -> lambda <+> bracesAndSemicolons (map (\(x,y,z,_) -> prettyClause x y z) pes) where prettyClause lhs rhs wh = sep [ pretty lhs@@ -286,15 +285,13 @@ pretty d : map (parens . pretty) ps ++ parens (pretty lhscore) : map (parens . pretty) ps' -instance Pretty [Declaration] where- pretty = vcat . map pretty- instance Show ModuleApplication where show = show . pretty instance Pretty ModuleApplication where pretty (SectionApp _ bs e) = fsep (map pretty bs) <+> text "=" <+> pretty e pretty (RecordModuleIFS _ rec) = text "=" <+> pretty rec <+> text "{{...}}" instance Pretty Declaration where+ prettyList = vcat . map pretty pretty d = case d of TypeSig i x e ->@@ -311,8 +308,8 @@ mkInst InstanceDef d = sep [ text "instance", nest 2 d ] mkInst NotInstanceDef d = d - mkOverlap i d | argInfoOverlappable i = text "overlap" <+> d- | otherwise = d+ mkOverlap i d | isOverlappable i = text "overlap" <+> d+ | otherwise = d FunClause lhs rhs wh _ -> sep [ pretty lhs , nest 2 $ pretty rhs@@ -438,12 +435,8 @@ hsep [ text "COMPILED_EXPORT", pretty x, text hs ] pretty (CompiledTypePragma _ x hs) = hsep [ text "COMPILED_TYPE", pretty x, text hs ]- pretty (CompiledDeclareDataPragma _ x hs) =- hsep [ text "COMPILED_DECLARE_DATA", pretty x, text hs ] pretty (CompiledDataPragma _ x hs hcs) = hsep $ [text "COMPILED_DATA", pretty x] ++ map text (hs : hcs)- pretty (CompiledEpicPragma _ x e) =- hsep [ text "COMPILED_EPIC", pretty x, text e ] pretty (CompiledJSPragma _ x e) = hsep [ text "COMPILED_JS", pretty x, text e ] pretty (CompiledUHCPragma _ x e) =@@ -452,8 +445,14 @@ hsep $ [ text "COMPILED_DATA_UHC", pretty x] ++ map text (crd : crcs) pretty (HaskellCodePragma _ s) = vcat (text "HASKELL" : map text (lines s))+ pretty (CompilePragma _ b x e) =+ hsep [ text "COMPILE", text b, pretty x, text e ]+ pretty (ForeignPragma _ b s) =+ vcat $ text ("FOREIGN " ++ b) : map text (lines s) pretty (StaticPragma _ i) = hsep $ [text "STATIC", pretty i]+ pretty (InjectivePragma _ i) =+ hsep $ [text "INJECTIVE", pretty i] pretty (InlinePragma _ i) = hsep $ [text "INLINE", pretty i] pretty (ImportPragma _ i) =@@ -462,6 +461,8 @@ hsep $ [text "IMPORT_UHC", text i] pretty (ImpossiblePragma _) = hsep $ [text "IMPOSSIBLE"]+ pretty (EtaPragma _ x) =+ hsep $ [text "ETA", pretty x] pretty (TerminationCheckPragma _ tc) = case tc of TerminationCheck -> __IMPOSSIBLE__@@ -473,7 +474,7 @@ pretty (DisplayPragma _ lhs rhs) = text "DISPLAY" <+> sep [ pretty lhs <+> text "=", nest 2 $ pretty rhs ] pretty (NoPositivityCheckPragma _) = text "NO_POSITIVITY_CHECK" pretty (PolarityPragma _ q occs) =- hsep (text "NO_POSITIVITY_CHECK" : pretty q : map pretty occs)+ hsep (text "POLARITY" : pretty q : map pretty occs) instance Pretty Fixity where pretty (Fixity _ Unrelated _) = __IMPOSSIBLE__@@ -484,25 +485,13 @@ RightAssoc -> "infixr" NonAssoc -> "infix" -instance Pretty Occurrence where- pretty Unused = text "_"- pretty Mixed = text "*"- pretty JustNeg = text "-"- pretty JustPos = text "+"- pretty StrictPos = text "++"-- -- No syntax has been assigned to GuardPos.-- pretty GuardPos = __IMPOSSIBLE__- instance Pretty GenPart where pretty (IdPart x) = text x pretty BindHole{} = underscore pretty NormalHole{} = underscore pretty WildHole{} = underscore -instance Pretty Notation where- pretty = hcat . map pretty+ prettyList = hcat . map pretty instance Pretty Fixity' where pretty (Fixity' fix nota _)@@ -513,17 +502,15 @@ -- Andreas 2010-09-24: and in record fields instance Pretty a => Pretty (Arg a) where prettyPrec p (Arg ai e) = prettyHiding ai id $ prettyPrec p' e- where p' | getHiding ai == NotHidden = p- | otherwise = 0+ where p' | visible ai = p+ | otherwise = 0 instance Pretty e => Pretty (Named_ e) where prettyPrec p (Named Nothing e) = prettyPrec p e prettyPrec p (Named (Just s) e) = mparens (p > 0) $ sep [ text (rawNameToString $ rangedThing s) <+> text "=", pretty e ] -instance Pretty [Pattern] where- pretty = fsep . map pretty- instance Pretty Pattern where+ prettyList = fsep . map pretty pretty p = case p of IdentP x -> pretty x@@ -541,15 +528,18 @@ QuoteP _ -> text "quote" RecP _ fs -> sep [ text "record", bracesAndSemicolons (map pretty fs) ] -prettyOpApp ::+prettyOpApp :: forall a . Pretty a => QName -> [NamedArg (MaybePlaceholder a)] -> [Doc] prettyOpApp q es = merge [] $ prOp ms xs es where+ -- ms: the module part of the name. ms = init (qnameParts q)+ -- xs: the concrete name (alternation of @Id@ and @Hole@) xs = case unqualify q of Name _ xs -> xs NoName{} -> __IMPOSSIBLE__ + prOp :: [Name] -> [NamePart] -> [NamedArg (MaybePlaceholder a)] -> [(Doc, Maybe PositionInName)] prOp ms (Hole : xs) (e : es) = (pretty e, case namedArg e of Placeholder p -> Just p _ -> Nothing) :@@ -558,7 +548,9 @@ prOp ms (Id x : xs) es = ( pretty (foldr Qual (QName (Name noRange $ [Id x])) ms) , Nothing ) : prOp [] xs es- prOp _ [] [] = []+ -- Qualify the name part with the module.+ -- We then clear @ms@ such that the following name parts will not be qualified.+ prOp _ [] es = map (\e -> (pretty e, Nothing)) es -- Section underscores should be printed without surrounding
src/full/Agda/Syntax/Fixity.hs view
@@ -16,6 +16,8 @@ import Data.Set (Set) import qualified Data.Set as Set import Data.Traversable++import Data.Data (Data) import Data.Typeable (Typeable) import Agda.Syntax.Position@@ -26,6 +28,7 @@ import Agda.Utils.Lens import Agda.Utils.List+import Agda.Utils.Pretty #include "undefined.h" import Agda.Utils.Impossible@@ -41,14 +44,14 @@ -- ^ Range of the name in the fixity declaration -- (used for correct highlighting, see issue #2140). }- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) instance Eq Fixity' where Fixity' f n _ == Fixity' f' n' _ = f == f' && n == n' -- | Decorating something with @Fixity'@. data ThingWithFixity x = ThingWithFixity x Fixity'- deriving (Functor, Foldable, Traversable, Typeable, Show)+ deriving (Functor, Foldable, Traversable, Typeable, Data, Show) -- | All the notation information related to a name. data NewNotation = NewNotation@@ -215,12 +218,12 @@ -- ^ No fixity declared. | Related !Integer -- ^ Fixity level declared as the @Integer@.- deriving (Eq, Ord, Show, Typeable)+ deriving (Eq, Ord, Show, Typeable, Data) -- | Associativity. data Associativity = NonAssoc | LeftAssoc | RightAssoc- deriving (Eq, Ord, Show, Typeable)+ deriving (Eq, Ord, Show, Typeable, Data) -- | Fixity of operators. @@ -230,7 +233,7 @@ , fixityLevel :: !PrecedenceLevel , fixityAssoc :: !Associativity }- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) instance Eq Fixity where f1 == f2 = compare f1 f2 == EQ@@ -253,70 +256,114 @@ | LeftOperandCtx Fixity | RightOperandCtx Fixity | FunctionCtx | ArgumentCtx | InsideOperandCtx | WithFunCtx | WithArgCtx | DotPatternCtx- deriving (Show, Typeable, Eq)+ deriving (Show, Typeable, Data, Eq) +instance Pretty Precedence where+ pretty = text . show++-- | When printing we keep track of a stack of precedences in order to be able+-- to decide whether it's safe to leave out parens around lambdas. An empty+-- stack is equivalent to `TopCtx`. Invariant: `notElem TopCtx`.+type PrecedenceStack = [Precedence]++pushPrecedence :: Precedence -> PrecedenceStack -> PrecedenceStack+pushPrecedence TopCtx _ = []+pushPrecedence p ps = p : ps++headPrecedence :: PrecedenceStack -> Precedence+headPrecedence [] = TopCtx+headPrecedence (p : _) = p+ -- | The precedence corresponding to a possibly hidden argument. hiddenArgumentCtx :: Hiding -> Precedence-hiddenArgumentCtx NotHidden = ArgumentCtx-hiddenArgumentCtx Hidden = TopCtx-hiddenArgumentCtx Instance = TopCtx+hiddenArgumentCtx NotHidden = ArgumentCtx+hiddenArgumentCtx Hidden = TopCtx+hiddenArgumentCtx Instance{} = TopCtx -- | Do we need to bracket an operator application of the given fixity -- in a context with the given precedence.-opBrackets :: Fixity -> Precedence -> Bool-opBrackets (Fixity _ (Related n1) LeftAssoc)- (LeftOperandCtx (Fixity _ (Related n2) LeftAssoc)) | n1 >= n2 = False-opBrackets (Fixity _ (Related n1) RightAssoc)- (RightOperandCtx (Fixity _ (Related n2) RightAssoc)) | n1 >= n2 = False-opBrackets f1- (LeftOperandCtx f2) | Related f1 <- fixityLevel f1- , Related f2 <- fixityLevel f2- , f1 > f2 = False-opBrackets f1- (RightOperandCtx f2) | Related f1 <- fixityLevel f1- , Related f2 <- fixityLevel f2- , f1 > f2 = False-opBrackets _ TopCtx = False-opBrackets _ FunctionSpaceDomainCtx = False-opBrackets _ InsideOperandCtx = False-opBrackets _ WithArgCtx = False-opBrackets _ WithFunCtx = False-opBrackets _ _ = True+opBrackets :: Fixity -> PrecedenceStack -> Bool+opBrackets = opBrackets' False +-- | Do we need to bracket an operator application of the given fixity+-- in a context with the given precedence.+opBrackets' :: Bool -> -- Is the last argument a parenless lambda?+ Fixity -> PrecedenceStack -> Bool+opBrackets' isLam f ps = brack f (headPrecedence ps)+ where+ false = isLam && lamBrackets' False ps -- require more parens for `e >>= λ x → e₁` than `e >>= e₁`+ brack (Fixity _ (Related n1) LeftAssoc)+ (LeftOperandCtx (Fixity _ (Related n2) LeftAssoc)) | n1 >= n2 = false+ brack (Fixity _ (Related n1) RightAssoc)+ (RightOperandCtx (Fixity _ (Related n2) RightAssoc)) | n1 >= n2 = false+ brack f1 (LeftOperandCtx f2) | Related f1 <- fixityLevel f1+ , Related f2 <- fixityLevel f2+ , f1 > f2 = false+ brack f1 (RightOperandCtx f2) | Related f1 <- fixityLevel f1+ , Related f2 <- fixityLevel f2+ , f1 > f2 = false+ brack _ TopCtx = false+ brack _ FunctionSpaceDomainCtx = false+ brack _ InsideOperandCtx = false+ brack _ WithArgCtx = false+ brack _ WithFunCtx = false+ brack _ _ = True+ -- | Does a lambda-like thing (lambda, let or pi) need brackets in the -- given context? A peculiar thing with lambdas is that they don't--- need brackets in certain right operand contexts. However, we insert--- brackets anyway, for the following reasons:------ * Clarity.------ * Sometimes brackets are needed. Example: @m₁ >>= (λ x → x) >>= m₂@--- (here @_>>=_@ is left associative).-lamBrackets :: Precedence -> Bool-lamBrackets TopCtx = False-lamBrackets _ = True+-- need brackets in certain right operand contexts. To decide we need to look+-- at the stack of precedences and not just the current precedence.+-- Example: @m₁ >>= (λ x → x) >>= m₂@ (for @_>>=_@ left associative).+-- The first argument is the parenthesis preference. If True, we add+-- parentheses also in right operand contexts where they aren't strictly+-- needed.+lamBrackets' :: Bool -> PrecedenceStack -> Bool+lamBrackets' _ [] = False+lamBrackets' strict (p : ps) = case p of+ TopCtx -> __IMPOSSIBLE__+ ArgumentCtx -> strict || lamBrackets' strict ps+ RightOperandCtx{} -> strict || lamBrackets' strict ps+ FunctionSpaceDomainCtx -> True+ LeftOperandCtx{} -> True+ FunctionCtx -> True+ InsideOperandCtx -> True+ WithFunCtx -> True+ WithArgCtx -> True+ DotPatternCtx -> True +-- | Preference for adding parentheses.+lamBrackets :: PrecedenceStack -> Bool+lamBrackets = lamBrackets' True+ -- | Does a function application need brackets?-appBrackets :: Precedence -> Bool-appBrackets ArgumentCtx = True-appBrackets DotPatternCtx = True-appBrackets _ = False+appBrackets :: PrecedenceStack -> Bool+appBrackets = appBrackets' False +-- | Does a function application need brackets?+appBrackets' :: Bool -> -- Is the argument of the application a parenless lambda?+ PrecedenceStack -> Bool+appBrackets' isLam ps = brack (headPrecedence ps)+ where+ brack ArgumentCtx = True+ brack DotPatternCtx = True+ brack _ = isLam && lamBrackets' False ps -- allow e + e₁ λ x → e₂+ -- | Does a with application need brackets?-withAppBrackets :: Precedence -> Bool-withAppBrackets TopCtx = False-withAppBrackets FunctionSpaceDomainCtx = False-withAppBrackets WithFunCtx = False-withAppBrackets _ = True+withAppBrackets :: PrecedenceStack -> Bool+withAppBrackets = brack . headPrecedence+ where+ brack TopCtx = False+ brack FunctionSpaceDomainCtx = False+ brack WithFunCtx = False+ brack _ = True -- | Does a function space need brackets?-piBrackets :: Precedence -> Bool-piBrackets TopCtx = False-piBrackets _ = True+piBrackets :: PrecedenceStack -> Bool+piBrackets [] = False+piBrackets _ = True -roundFixBrackets :: Precedence -> Bool-roundFixBrackets DotPatternCtx = True-roundFixBrackets _ = False+roundFixBrackets :: PrecedenceStack -> Bool+roundFixBrackets ps = DotPatternCtx == headPrecedence ps instance HasRange Fixity where getRange = fixityRange
src/full/Agda/Syntax/Fixity.hs-boot view
@@ -1,12 +1,14 @@ module Agda.Syntax.Fixity where import Control.DeepSeq (NFData)+import Data.Data (Data) import Agda.Syntax.Position ( KillRange ) data Fixity' instance KillRange Fixity'+instance Data Fixity' instance NFData Fixity' instance Show Fixity'
src/full/Agda/Syntax/IdiomBrackets.hs view
@@ -11,6 +11,8 @@ import Agda.Syntax.Scope.Monad import Agda.TypeChecking.Monad +import Agda.Utils.Pretty ( prettyShow )+ parseIdiomBrackets :: Range -> Expr -> ScopeM Expr parseIdiomBrackets r e = do let qPure = QName $ Name noRange [Id "pure"]@@ -44,5 +46,6 @@ ensureInScope q = do r <- resolveName q case r of- UnknownName -> genericError $ show q ++ " needs to be in scope to use idiom brackets (| ... |)"+ UnknownName -> genericError $+ prettyShow q ++ " needs to be in scope to use idiom brackets (| ... |)" _ -> return ()
src/full/Agda/Syntax/Info.hs view
@@ -1,6 +1,5 @@-{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE UndecidableInstances #-} {-| An info object contains additional information about a piece of abstract syntax that isn't part of the actual syntax. For instance, it might contain@@ -12,6 +11,7 @@ import Prelude hiding (null) +import Data.Data (Data) import Data.Typeable (Typeable) import qualified Agda.Syntax.Concrete.Name as C@@ -34,7 +34,7 @@ , metaNumber :: Maybe MetaId , metaNameSuggestion :: String }- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) emptyMetaInfo :: MetaInfo emptyMetaInfo = MetaInfo@@ -55,7 +55,7 @@ --------------------------------------------------------------------------} newtype ExprInfo = ExprRange Range- deriving (Typeable, Show, Eq, Null)+ deriving (Typeable, Data, Show, Eq, Null) exprNoRange :: ExprInfo exprNoRange = ExprRange noRange@@ -67,6 +67,35 @@ killRange (ExprRange r) = exprNoRange {--------------------------------------------------------------------------+ Lambda information+ --------------------------------------------------------------------------}++-- | Information about lambdas.+data LamInfo = LamInfo { lamRange :: Range+ , lamOrigin :: Origin+ , lamParens :: Bool -- ^ Do we prefer the lambda with or without parens?+ }+ deriving (Typeable, Data, Show, Eq, Ord)++-- | Default is system inserted and prefer parens.+defaultLamInfo :: Range -> LamInfo+defaultLamInfo r = LamInfo{ lamRange = r, lamOrigin = Inserted, lamParens = True }++-- | `LamInfo` with no range information.+defaultLamInfo_ :: LamInfo+defaultLamInfo_ = defaultLamInfo noRange++instance HasRange LamInfo where+ getRange = lamRange++instance KillRange LamInfo where+ killRange (LamInfo r o p) = LamInfo (killRange r) o p++instance LensOrigin LamInfo where+ getOrigin = lamOrigin+ setOrigin o i = i { lamOrigin = o }++{-------------------------------------------------------------------------- Module information --------------------------------------------------------------------------} @@ -81,9 +110,9 @@ , minfoDirective :: Maybe ImportDirective -- ^ Retained for @abstractToConcrete@ of 'ModuleMacro'. }- deriving (Typeable, Eq)+ deriving (Typeable, Data, Eq) -deriving instance (Show OpenShortHand, Show ImportDirective) => Show ModuleInfo+deriving instance Show ModuleInfo instance HasRange ModuleInfo where getRange = minfoRange@@ -99,7 +128,7 @@ --------------------------------------------------------------------------- newtype LetInfo = LetRange Range- deriving (Typeable, Show, Eq, Null)+ deriving (Typeable, Data, Show, Eq, Null) instance HasRange LetInfo where getRange (LetRange r) = r@@ -119,7 +148,7 @@ , defMacro :: IsMacro , defInfo :: DeclInfo }- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) mkDefInfo :: Name -> Fixity' -> Access -> IsAbstract -> Range -> DefInfo mkDefInfo x f a ab r = DefInfo f a ab NotInstanceDef NotMacroDef (DeclInfo x r)@@ -145,7 +174,7 @@ { declName :: Name , declRange :: Range }- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) instance HasRange DeclInfo where getRange = declRange@@ -165,7 +194,7 @@ , mutualPositivityCheck :: PositivityCheck , mutualRange :: Range }- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) -- | Default value for 'MutualInfo'. instance Null MutualInfo where@@ -182,7 +211,7 @@ --------------------------------------------------------------------------} newtype LHSInfo = LHSRange Range- deriving (Typeable, Show, Eq, Null)+ deriving (Typeable, Data, Show, Eq, Null) instance HasRange LHSInfo where getRange (LHSRange r) = r@@ -197,7 +226,7 @@ -- | For a general pattern we remember the source code position. newtype PatInfo = PatRange Range- deriving (Typeable, Eq, Null, Show, HasRange, KillRange)+ deriving (Typeable, Data, Eq, Null, Show, HasRange, KillRange) -- | Empty range for patterns. patNoRange :: PatInfo@@ -210,7 +239,7 @@ --- Or from a user written constructor or record pattern? , patInfo :: PatInfo }- deriving (Typeable, Eq)+ deriving (Typeable, Data, Eq) instance Show ConPatInfo where show (ConPatInfo po i) = applyWhen (po == ConOSystem) ("implicit " ++) $ show i
src/full/Agda/Syntax/Internal.hs view
@@ -3,6 +3,8 @@ {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE UndecidableInstances #-} -- because of shortcomings of FunctionalDependencies+ #if __GLASGOW_HASKELL__ <= 708 {-# LANGUAGE OverlappingInstances #-} #endif@@ -26,12 +28,8 @@ import Data.Maybe import Data.Semigroup (Semigroup, Monoid, (<>), mempty, mappend, Sum(..)) --- base-4.7 defines the Num instance for Sum-#if !(MIN_VERSION_base(4,7,0))-import Data.Orphans ()-#endif- import Data.Traversable+import Data.Data (Data) import Data.Typeable (Typeable) import Agda.Syntax.Position@@ -42,11 +40,6 @@ import Agda.Utils.Empty --- See Issue 1593.-#if !MIN_VERSION_transformers(0,4,1)-import Agda.Utils.Except ( Error(noMsg) )-#endif- import Agda.Utils.Functor import Agda.Utils.Geniplate import Agda.Utils.Lens@@ -78,7 +71,7 @@ -- Empty list for data constructors. -- 'Arg' is not needed here since it -- is stored in the constructor args.- } deriving (Typeable)+ } deriving (Typeable, Data, Show) instance Eq ConHead where (==) = (==) `on` conName@@ -86,8 +79,8 @@ instance Ord ConHead where (<=) = (<=) `on` conName -instance Show ConHead where- show (ConHead c i fs) = show c ++ "(" ++ show i ++ ")" ++ show fs+instance Pretty ConHead where+ pretty = pretty . conName instance HasRange ConHead where getRange = getRange . conName@@ -129,7 +122,7 @@ -- version of the irrelevance axiom @.irrAx : .A -> A@. | Shared !(Ptr Term) -- ^ Explicit sharing- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) type ConInfo = ConOrigin @@ -138,11 +131,19 @@ data Elim' a = Apply (Arg a) -- ^ Application. | Proj ProjOrigin QName -- ^ Projection. 'QName' is name of a record projection.- deriving (Typeable, Show, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Show, Functor, Foldable, Traversable) type Elim = Elim' Term type Elims = [Elim] -- ^ eliminations ordered left-to-right. +-- | This instance cheats on 'Proj', use with care.+-- 'Proj's are always assumed to be 'UserWritten', since they have no 'ArgInfo'.+instance LensOrigin (Elim' a) where+ getOrigin (Apply a) = getOrigin a+ getOrigin Proj{} = UserWritten+ mapOrigin f (Apply a) = Apply $ mapOrigin f a+ mapOrigin f e@Proj{} = e+ -- | Names in binders and arguments. type ArgName = String @@ -166,7 +167,7 @@ -- ^ The body has (at least) one free variable. -- Danger: 'unAbs' doesn't shift variables properly | NoAbs { absName :: ArgName, unAbs :: a }- deriving (Typeable, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Functor, Foldable, Traversable) instance Decoration Abs where traverseF f (Abs x a) = Abs x <$> f a@@ -175,7 +176,7 @@ -- | Types are terms with a sort annotation. -- data Type' a = El { _getSort :: Sort, unEl :: a }- deriving (Typeable, Show, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Show, Functor, Foldable, Traversable) type Type = Type' Term @@ -202,32 +203,10 @@ -- and so on. data Tele a = EmptyTel | ExtendTel a (Abs (Tele a)) -- ^ 'Abs' is never 'NoAbs'.- deriving (Typeable, Show, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Show, Functor, Foldable, Traversable) type Telescope = Tele (Dom Type) --- | A traversal for the names in a telescope.-mapAbsNamesM :: Applicative m => (ArgName -> m ArgName) -> Tele a -> m (Tele a)-mapAbsNamesM f EmptyTel = pure EmptyTel-mapAbsNamesM f (ExtendTel a ( Abs x b)) = ExtendTel a <$> ( Abs <$> f x <*> mapAbsNamesM f b)-mapAbsNamesM f (ExtendTel a (NoAbs x b)) = ExtendTel a <$> (NoAbs <$> f x <*> mapAbsNamesM f b)- -- Ulf, 2013-11-06: Last case is really impossible but I'd rather find out we- -- violated that invariant somewhere other than here.--mapAbsNames :: (ArgName -> ArgName) -> Tele a -> Tele a-mapAbsNames f = runIdentity . mapAbsNamesM (Identity . f)---- Ulf, 2013-11-06--- The record parameter is named "" inside the record module so we can avoid--- printing it (issue 208), but we don't want that to show up in the type of--- the functions in the module (issue 892). This function is used on the record--- module telescope before adding it to a type in--- TypeChecking.Monad.Signature.addConstant (to handle functions defined in--- record modules) and TypeChecking.Rules.Record.checkProjection (to handle--- record projections).-replaceEmptyName :: ArgName -> Tele a -> Tele a-replaceEmptyName x = mapAbsNames $ \ y -> if null y then x else y- -- | Sorts. -- data Sort@@ -240,19 +219,19 @@ -- If the free variable occurs in the second sort, -- the whole thing should reduce to Inf, -- otherwise it's the normal lub.- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) -- | A level is a maximum expression of 0..n 'PlusLevel' expressions -- each of which is a number or an atom plus a number. -- -- The empty maximum is the canonical representation for level 0. newtype Level = Max [PlusLevel]- deriving (Show, Typeable)+ deriving (Show, Typeable, Data) data PlusLevel = ClosedLevel Integer -- ^ @n@, to represent @Setₙ@. | Plus Integer LevelAtom -- ^ @n + ℓ@.- deriving (Show, Typeable)+ deriving (Show, Typeable, Data) -- | An atomic term of type @Level@. data LevelAtom@@ -264,7 +243,7 @@ -- ^ A neutral term of type @Level@. | UnreducedLevel Term -- ^ Introduced by 'instantiate', removed by 'reduce'.- deriving (Show, Typeable)+ deriving (Show, Typeable, Data) --------------------------------------------------------------------------- -- * Blocked Terms@@ -289,7 +268,7 @@ | ReallyNotBlocked -- ^ Reduction was not blocked, we reached a whnf -- which can be anything but a stuck @'Def'@.- deriving (Show, Typeable)+ deriving (Show, Typeable, Data) -- | 'ReallyNotBlocked' is the unit. -- 'MissingClauses' is dominant.@@ -306,7 +285,7 @@ instance Monoid NotBlocked where -- ReallyNotBlocked is neutral- mempty = ReallyNotBlocked+ mempty = ReallyNotBlocked mappend = (<>) -- | Something where a meta variable may block reduction.@@ -340,12 +319,6 @@ mempty = notBlocked () mappend = (<>) --- See issues 1573 and 1674.-#if !MIN_VERSION_transformers(0,4,1)-instance Error Blocked_ where- noMsg = mempty-#endif- -- | When trying to reduce @f es@, on match failed on one -- elimination @e ∈ es@ that came with info @r :: NotBlocked@. -- @stuckOn e r@ produces the new @NotBlocked@ info.@@ -398,7 +371,8 @@ -- For the purpose of the permutation and the body dot patterns count -- as variables. TODO: Change this! data Clause = Clause- { clauseRange :: Range+ { clauseLHSRange :: Range+ , clauseFullRange :: Range , clauseTel :: Telescope -- ^ @Δ@: The types of the pattern variables in dependency order. , namedClausePats :: [NamedArg DeBruijnPattern]@@ -413,14 +387,19 @@ -- pattern on the lhs. , clauseCatchall :: Bool -- ^ Clause has been labelled as CATCHALL.+ , clauseUnreachable :: Maybe Bool+ -- ^ Clause has been labelled as unreachable by the coverage checker.+ -- @Nothing@ means coverage checker has not run yet (clause may be unreachable).+ -- @Just False@ means clause is not unreachable.+ -- @Just True@ means clause is unreachable. }- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) clausePats :: Clause -> [Arg DeBruijnPattern] clausePats = map (fmap namedThing) . namedClausePats instance HasRange Clause where- getRange = clauseRange+ getRange = clauseLHSRange -- | Pattern variables. type PatVarName = ArgName@@ -445,11 +424,15 @@ | ConP ConHead ConPatternInfo [NamedArg (Pattern' x)] -- ^ @c ps@ -- The subpatterns do not contain any projection copatterns.+ | AbsurdP (Pattern' x)+ -- ^ @()@+ -- The argument is to keep track of the original pattern+ -- (before the absurd match). | LitP Literal -- ^ E.g. @5@, @"hello"@. | ProjP ProjOrigin QName -- ^ Projection copattern. Can only appear by itself.- deriving (Typeable, Show, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Show, Functor, Foldable, Traversable) type Pattern = Pattern' PatVarName -- ^ The @PatVarName@ is a name suggestion.@@ -461,7 +444,7 @@ data DBPatVar = DBPatVar { dbPatVarName :: PatVarName , dbPatVarIndex :: Int- } deriving (Typeable, Show)+ } deriving (Typeable, Data, Show) type DeBruijnPattern = Pattern' DBPatVar @@ -491,7 +474,7 @@ -- plugin (like Agsy). -- Needed e.g. for with-clause stripping. }- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) noConPatternInfo :: ConPatternInfo noConPatternInfo = ConPatternInfo Nothing Nothing@@ -507,17 +490,29 @@ -- | Extract pattern variables in left-to-right order. -- A 'DotP' is also treated as variable (see docu for 'Clause').-patternVars :: Arg (Pattern' a) -> [Arg (Either a Term)]-patternVars (Arg i (VarP x) ) = [Arg i $ Left x]-patternVars (Arg i (DotP t) ) = [Arg i $ Right t]-patternVars (Arg i (ConP _ _ ps)) = List.concat $ map (patternVars . fmap namedThing) ps-patternVars (Arg i (LitP l) ) = []-patternVars (Arg i ProjP{} ) = []+class PatternVars a b | b -> a where+ patternVars :: b -> [Arg (Either a Term)] +instance PatternVars a (Arg (Pattern' a)) where+ -- patternVars :: Arg (Pattern' a) -> [Arg (Either a Term)]+ patternVars (Arg i (VarP x) ) = [Arg i $ Left x]+ patternVars (Arg i (DotP t) ) = [Arg i $ Right t]+ patternVars (Arg i (AbsurdP p) ) = patternVars (Arg i p)+ patternVars (Arg _ (ConP _ _ ps)) = patternVars ps+ patternVars (Arg _ (LitP _) ) = []+ patternVars (Arg _ ProjP{} ) = []++instance PatternVars a (NamedArg (Pattern' a)) where+ patternVars = patternVars . fmap namedThing++instance PatternVars a b => PatternVars a [b] where+ patternVars = concatMap patternVars+ -- | Does the pattern perform a match that could fail? properlyMatching :: DeBruijnPattern -> Bool-properlyMatching (VarP x) = isAbsurdPatternName $ dbPatVarName x+properlyMatching (VarP x) = False properlyMatching DotP{} = False+properlyMatching AbsurdP{} = True properlyMatching LitP{} = True properlyMatching (ConP _ ci ps) = isNothing (conPRecord ci) || -- not a record cons List.any (properlyMatching . namedArg) ps -- or one of subpatterns is a proper m@@ -539,8 +534,8 @@ -- ^ Identity substitution. -- @Γ ⊢ IdS : Γ@ - | EmptyS- -- ^ Empty substitution, lifts from the empty context.+ | EmptyS Empty+ -- ^ Empty substitution, lifts from the empty context. First argument is @__IMPOSSIBLE__@. -- Apply this to closed terms you want to use in a non-empty context. -- @Γ ⊢ EmptyS : ()@ @@ -580,7 +575,15 @@ -- Γ, Ψρ ⊢ Lift |Ψ| ρ : Δ, Ψ -- @ - deriving (Show, Functor, Foldable, Traversable)+ deriving ( Show+ , Functor+ , Foldable+ , Traversable+ , Data+#if __GLASGOW_HASKELL__ <= 708+ , Typeable+#endif+ ) type Substitution = Substitution' Term type PatternSubstitution = Substitution' DeBruijnPattern@@ -603,7 +606,7 @@ = EqualityType { eqtSort :: Sort -- ^ Sort of this type. , eqtName :: QName -- ^ Builtin EQUALITY.- , eqtLevel :: Arg Term -- ^ Hidden+ , eqtParams :: [Arg Term] -- ^ Hidden. Empty or @Level@. , eqtType :: Arg Term -- ^ Hidden , eqtLhs :: Arg Term -- ^ NotHidden , eqtRhs :: Arg Term -- ^ NotHidden@@ -749,12 +752,79 @@ mkType :: Integer -> Sort mkType n = Type $ Max [ClosedLevel n | n > 0] +isSort :: Term -> Maybe Sort+isSort v = case ignoreSharing v of+ Sort s -> Just s+ _ -> Nothing+ impossibleTerm :: String -> Int -> Term impossibleTerm file line = Lit $ LitString noRange $ unlines [ "An internal error has occurred. Please report this as a bug." , "Location of the error: " ++ file ++ ":" ++ show line ] +hackReifyToMeta :: Term+hackReifyToMeta = DontCare $ Lit $ LitNat noRange (-42)++isHackReifyToMeta :: Term -> Bool+isHackReifyToMeta (DontCare (Lit (LitNat r (-42)))) = r == noRange+isHackReifyToMeta _ = False++---------------------------------------------------------------------------+-- * Telescopes.+---------------------------------------------------------------------------++-- | A traversal for the names in a telescope.+mapAbsNamesM :: Applicative m => (ArgName -> m ArgName) -> Tele a -> m (Tele a)+mapAbsNamesM f EmptyTel = pure EmptyTel+mapAbsNamesM f (ExtendTel a ( Abs x b)) = ExtendTel a <$> ( Abs <$> f x <*> mapAbsNamesM f b)+mapAbsNamesM f (ExtendTel a (NoAbs x b)) = ExtendTel a <$> (NoAbs <$> f x <*> mapAbsNamesM f b)+ -- Ulf, 2013-11-06: Last case is really impossible but I'd rather find out we+ -- violated that invariant somewhere other than here.++mapAbsNames :: (ArgName -> ArgName) -> Tele a -> Tele a+mapAbsNames f = runIdentity . mapAbsNamesM (Identity . f)++-- Ulf, 2013-11-06+-- The record parameter is named "" inside the record module so we can avoid+-- printing it (issue 208), but we don't want that to show up in the type of+-- the functions in the module (issue 892). This function is used on the record+-- module telescope before adding it to a type in+-- TypeChecking.Monad.Signature.addConstant (to handle functions defined in+-- record modules) and TypeChecking.Rules.Record.checkProjection (to handle+-- record projections).+replaceEmptyName :: ArgName -> Tele a -> Tele a+replaceEmptyName x = mapAbsNames $ \ y -> if null y then x else y++-- | Telescope as list.+type ListTel' a = [Dom (a, Type)]+type ListTel = ListTel' ArgName++telFromList' :: (a -> ArgName) -> ListTel' a -> Telescope+telFromList' f = List.foldr extTel EmptyTel+ where+ extTel (Dom info (x, a)) = ExtendTel (Dom info a) . Abs (f x)++-- | Convert a list telescope to a telescope.+telFromList :: ListTel -> Telescope+telFromList = telFromList' id++-- | Convert a telescope to its list form.+telToList :: Telescope -> ListTel+telToList EmptyTel = []+telToList (ExtendTel arg (Abs x tel)) = fmap (x,) arg : telToList tel+telToList (ExtendTel _ NoAbs{} ) = __IMPOSSIBLE__++-- | Drop the types from a telescope.+class TelToArgs a where+ telToArgs :: a -> [Arg ArgName]++instance TelToArgs ListTel where+ telToArgs = map $ \ dom -> Arg (domInfo dom) (fst $ unDom dom)++instance TelToArgs Telescope where+ telToArgs = telToArgs . telToList+ -- | Constructing a singleton telescope. class SgTel a where sgTel :: a -> Telescope@@ -768,13 +838,6 @@ instance SgTel (Dom Type) where sgTel dom = sgTel (stringToArgName "_", dom) -hackReifyToMeta :: Term-hackReifyToMeta = DontCare $ Lit $ LitNat noRange (-42)--isHackReifyToMeta :: Term -> Bool-isHackReifyToMeta (DontCare (Lit (LitNat r (-42)))) = r == noRange-isHackReifyToMeta _ = False- --------------------------------------------------------------------------- -- * Handling blocked terms. ---------------------------------------------------------------------------@@ -872,13 +935,6 @@ DontCare{} -> Nothing Shared{} -> __IMPOSSIBLE__ -{- PROBABLY USELESS-getElims :: Term -> (Elims -> Term, Elims)-getElims v = maybe default id $ hasElims v- where- default = (\ [] -> v, [])--}- -- | Drop 'Apply' constructor. (Unsafe!) argFromElim :: Elim' a -> Arg a argFromElim (Apply u) = u@@ -929,8 +985,8 @@ -- | A 'null' clause is one with no patterns and no rhs. -- Should not exist in practice. instance Null Clause where- empty = Clause empty empty empty empty empty False- null (Clause r tel pats body t catchall)+ empty = Clause empty empty empty empty empty empty False Nothing+ null (Clause _ _ tel pats body _ _ _) = null tel && null pats && null body@@ -1023,7 +1079,7 @@ instance TermSize a => TermSize (Substitution' a) where tsize IdS = 1- tsize EmptyS = 1+ tsize (EmptyS _) = 1 tsize (Wk _ rho) = 1 + tsize rho tsize (t :# rho) = 1 + tsize t + tsize rho tsize (Strengthen _ rho) = 1 + tsize rho@@ -1076,7 +1132,7 @@ instance KillRange Substitution where killRange IdS = IdS- killRange EmptyS = EmptyS+ killRange (EmptyS err) = EmptyS err killRange (Wk n rho) = killRange1 (Wk n) rho killRange (t :# rho) = killRange2 (:#) t rho killRange (Strengthen err rho) = killRange1 (Strengthen err) rho@@ -1093,12 +1149,14 @@ case p of VarP x -> killRange1 VarP x DotP v -> killRange1 DotP v+ AbsurdP p -> killRange1 AbsurdP p ConP con info ps -> killRange3 ConP con info ps LitP l -> killRange1 LitP l ProjP o q -> killRange1 (ProjP o) q instance KillRange Clause where- killRange (Clause r tel ps body t catchall) = killRange6 Clause r tel ps body t catchall+ killRange (Clause rl rf tel ps body t catchall unreachable) =+ killRange8 Clause rl rf tel ps body t catchall unreachable instance KillRange a => KillRange (Tele a) where killRange = fmap killRange@@ -1133,7 +1191,7 @@ where pr p rho = case rho of IdS -> text "idS"- EmptyS -> text "emptyS"+ EmptyS err -> text "emptyS" t :# rho -> mparens (p > 2) $ sep [ pr 2 rho P.<> text ",", prettyPrec 3 t ] Strengthen _ rho -> mparens (p > 9) $ text "strS" <+> pr 10 rho Wk n rho -> mparens (p > 9) $ text ("wkS " ++ show n) <+> pr 10 rho@@ -1145,11 +1203,11 @@ Var x els -> text ("@" ++ show x) `pApp` els Lam ai b -> mparens (p > 0) $- sep [ text "λ" <+> prettyHiding ai id (text . show . absName $ b) <+> text "->"+ sep [ text "λ" <+> prettyHiding ai id (text . absName $ b) <+> text "->" , nest 2 $ pretty (unAbs b) ] Lit l -> pretty l- Def q els -> text (show q) `pApp` els- Con c ci vs -> text (show $ conName c) `pApp` map Apply vs+ Def q els -> pretty q `pApp` els+ Con c ci vs -> pretty (conName c) `pApp` map Apply vs Pi a (NoAbs _ b) -> mparens (p > 0) $ sep [ prettyPrec 1 (unDom a) <+> text "->" , nest 2 $ pretty b ]@@ -1168,9 +1226,9 @@ pDom :: LensHiding a => a -> Doc -> Doc pDom i = case getHiding i of- NotHidden -> parens- Hidden -> braces- Instance -> braces . braces+ NotHidden -> parens+ Hidden -> braces+ Instance{} -> braces . braces instance Pretty Clause where pretty Clause{clauseTel = tel, namedClausePats = ps, clauseBody = b, clauseType = t} =@@ -1223,15 +1281,15 @@ SizeUniv -> text "SizeUniv" DLub s b -> mparens (p > 9) $ text "dlub" <+> prettyPrec 10 s- <+> parens (sep [ text ("λ " ++ show (absName b) ++ " ->")+ <+> parens (sep [ text ("λ " ++ absName b ++ " ->") , nest 2 $ pretty (unAbs b) ]) instance Pretty Type where prettyPrec p (El _ a) = prettyPrec p a -instance Pretty Elim where+instance Pretty tm => Pretty (Elim' tm) where prettyPrec p (Apply v) = prettyPrec p v- prettyPrec _ (Proj _o x) = text ("." ++ show x)+ prettyPrec _ (Proj _o x) = text ("." ++ prettyShow x) instance Pretty DBPatVar where prettyPrec _ x = text $ patVarNameToString (dbPatVarName x) ++ "@" ++ show (dbPatVarIndex x)@@ -1239,8 +1297,9 @@ instance Pretty a => Pretty (Pattern' a) where prettyPrec n (VarP x) = prettyPrec n x prettyPrec _ (DotP t) = text "." P.<> prettyPrec 10 t+ prettyPrec _ (AbsurdP _) = text "()" prettyPrec n (ConP c i nps)= mparens (n > 0) $- text (show $ conName c) <+> fsep (map pretty ps)+ pretty (conName c) <+> fsep (map pretty ps) where ps = map (fmap namedThing) nps -- -- Version with printing record type: -- prettyPrec _ (ConP c i ps) = (if b then braces else parens) $ prTy $@@ -1248,8 +1307,8 @@ -- where -- b = maybe False (== ConOSystem) $ conPRecord i -- prTy d = caseMaybe (conPType i) d $ \ t -> d <+> text ":" <+> pretty t- prettyPrec _ (LitP l) = text (show l)- prettyPrec _ (ProjP _o q) = text ("." ++ show q)+ prettyPrec _ (LitP l) = pretty l+ prettyPrec _ (ProjP _o q) = text ("." ++ prettyShow q) ----------------------------------------------------------------------------- -- * NFData instances
src/full/Agda/Syntax/Internal/Defs.hs view
@@ -1,10 +1,13 @@+{-# LANGUAGE TypeFamilies #-} -- | Extract used definitions from terms.+ module Agda.Syntax.Internal.Defs where import Control.Monad.Reader import Control.Monad.Writer +import Data.Foldable (Foldable) import qualified Data.Foldable as Fold import Agda.Syntax.Common@@ -38,9 +41,17 @@ doMeta x = getDefs . ($ x) =<< asks lookupMeta -- | Getting the used definitions.+--+-- Note: in contrast to 'Agda.Syntax.Internal.Generic.foldTerm'+-- @getDefs@ also collects from sorts in terms.+-- Thus, this is not an instance of @foldTerm@.+ class GetDefs a where getDefs :: MonadGetDefs m => a -> m () + default getDefs :: (MonadGetDefs m, Foldable f, GetDefs b, f b ~ a) => a -> m ()+ getDefs = Fold.mapM_ getDefs+ instance GetDefs Clause where getDefs = getDefs . clauseBody @@ -89,22 +100,11 @@ -- collection instances instance GetDefs a => GetDefs (Maybe a) where- getDefs = Fold.mapM_ getDefs--instance GetDefs a => GetDefs [a] where- getDefs = Fold.mapM_ getDefs-+instance GetDefs a => GetDefs [a] where instance GetDefs a => GetDefs (Elim' a) where- getDefs = Fold.mapM_ getDefs--instance GetDefs a => GetDefs (Arg a) where- getDefs = getDefs . unArg--instance GetDefs a => GetDefs (Dom a) where- getDefs = getDefs . unDom--instance GetDefs a => GetDefs (Abs a) where- getDefs = getDefs . unAbs+instance GetDefs a => GetDefs (Arg a) where+instance GetDefs a => GetDefs (Dom a) where+instance GetDefs a => GetDefs (Abs a) where instance (GetDefs a, GetDefs b) => GetDefs (a,b) where getDefs (a,b) = getDefs a >> getDefs b
src/full/Agda/Syntax/Internal/Generic.hs view
@@ -1,5 +1,8 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE TypeFamilies #-} +-- | Tree traversal for internal syntax.+ module Agda.Syntax.Internal.Generic where import Control.Applicative@@ -9,116 +12,85 @@ import Agda.Syntax.Common import Agda.Syntax.Internal +-- | Generic term traversal.+--+-- Note: ignores sorts in terms!+-- (Does not traverse into or collect from them.)+ class TermLike a where- traverseTerm :: (Term -> Term) -> a -> a- traverseTermM++ -- | Generic traversal with post-traversal action.+ -- Ignores sorts.+ traverseTermM :: (Monad m #if __GLASGOW_HASKELL__ <= 708- :: (Applicative m, Monad m)-#else- :: Monad m+ , Applicative m #endif- => (Term -> m Term) -> a -> m a+ ) => (Term -> m Term) -> a -> m a++ default traverseTermM :: (Monad m, Traversable f, TermLike b, f b ~ a+#if __GLASGOW_HASKELL__ <= 708+ , Applicative m+#endif+ ) => (Term -> m Term) -> a -> m a+ traverseTermM = traverse . traverseTermM++ -- | Generic fold, ignoring sorts. foldTerm :: Monoid m => (Term -> m) -> a -> m --- * Constants+ default foldTerm+ :: (Monoid m, Foldable f, TermLike b, f b ~ a) => (Term -> m) -> a -> m+ foldTerm = foldMap . foldTerm +-- Constants+ instance TermLike Bool where- traverseTerm _ = id traverseTermM _ = pure foldTerm _ = mempty instance TermLike Int where- traverseTerm _ = id traverseTermM _ = pure foldTerm _ = mempty instance TermLike Integer where- traverseTerm _ = id traverseTermM _ = pure foldTerm _ = mempty instance TermLike Char where- traverseTerm _ = id traverseTermM _ = pure foldTerm _ = mempty instance TermLike QName where- traverseTerm _ = id traverseTermM _ = pure foldTerm _ = mempty --- * Functors--instance TermLike a => TermLike (Elim' a) where- traverseTerm f = fmap (traverseTerm f)- traverseTermM f = traverse (traverseTermM f)- foldTerm f = foldMap (foldTerm f)--instance TermLike a => TermLike (Arg a) where- traverseTerm f = fmap (traverseTerm f)- traverseTermM f = traverse (traverseTermM f)- foldTerm f = foldMap (foldTerm f)--instance TermLike a => TermLike (Dom a) where- traverseTerm f = fmap (traverseTerm f)- traverseTermM f = traverse (traverseTermM f)- foldTerm f = foldMap (foldTerm f)+-- Functors -instance TermLike a => TermLike [a] where- traverseTerm f = fmap (traverseTerm f)- traverseTermM f = traverse (traverseTermM f)- foldTerm f = foldMap (foldTerm f)+instance TermLike a => TermLike (Elim' a) where+instance TermLike a => TermLike (Arg a) where+instance TermLike a => TermLike (Dom a) where+instance TermLike a => TermLike [a] where+instance TermLike a => TermLike (Maybe a) where+instance TermLike a => TermLike (Abs a) where+instance TermLike a => TermLike (Ptr a) where+instance TermLike a => TermLike (Blocked a) where -instance TermLike a => TermLike (Maybe a) where- traverseTerm f = fmap (traverseTerm f)- traverseTermM f = traverse (traverseTermM f)- foldTerm f = foldMap (foldTerm f)+-- Tuples instance (TermLike a, TermLike b) => TermLike (a, b) where- traverseTerm f (x, y) = (traverseTerm f x, traverseTerm f y) traverseTermM f (x, y) = (,) <$> traverseTermM f x <*> traverseTermM f y foldTerm f (x, y) = foldTerm f x `mappend` foldTerm f y instance (TermLike a, TermLike b, TermLike c) => TermLike (a, b, c) where- traverseTerm f (x, y, z) = (traverseTerm f x, traverseTerm f y, traverseTerm f z) traverseTermM f (x, y, z) = (,,) <$> traverseTermM f x <*> traverseTermM f y <*> traverseTermM f z foldTerm f (x, y, z) = mconcat [foldTerm f x, foldTerm f y, foldTerm f z] instance (TermLike a, TermLike b, TermLike c, TermLike d) => TermLike (a, b, c, d) where- traverseTerm f (x, y, z, u) = (traverseTerm f x, traverseTerm f y, traverseTerm f z, traverseTerm f u) traverseTermM f (x, y, z, u) = (,,,) <$> traverseTermM f x <*> traverseTermM f y <*> traverseTermM f z <*> traverseTermM f u foldTerm f (x, y, z, u) = mconcat [foldTerm f x, foldTerm f y, foldTerm f z, foldTerm f u] -instance TermLike a => TermLike (Abs a) where- traverseTerm f = fmap (traverseTerm f)- traverseTermM f = traverse (traverseTermM f)- foldTerm f = foldMap (foldTerm f)--instance TermLike a => TermLike (Ptr a) where- traverseTerm f = fmap (traverseTerm f)- traverseTermM f = traverse (traverseTermM f)- foldTerm f = foldMap (foldTerm f)--instance TermLike a => TermLike (Blocked a) where- traverseTerm f = fmap (traverseTerm f)- traverseTermM f = traverse (traverseTermM f)- foldTerm f = foldMap (foldTerm f)---- * Real terms+-- Real terms instance TermLike Term where- traverseTerm f t = case t of- Var i xs -> f $ Var i $ traverseTerm f xs- Def c xs -> f $ Def c $ traverseTerm f xs- Con c ci xs -> f $ Con c ci $ traverseTerm f xs- Lam h b -> f $ Lam h $ traverseTerm f b- Pi a b -> f $ uncurry Pi $ traverseTerm f (a, b)- MetaV m xs -> f $ MetaV m $ traverseTerm f xs- Level l -> f $ Level $ traverseTerm f l- Lit _ -> f t- Sort _ -> f t- DontCare mv -> f $ DontCare $ traverseTerm f mv- Shared p -> f $ Shared $ traverseTerm f p traverseTermM f t = case t of Var i xs -> f =<< Var i <$> traverseTermM f xs@@ -147,14 +119,10 @@ Shared p -> foldTerm f p instance TermLike Level where- traverseTerm f (Max as) = Max $ traverseTerm f as traverseTermM f (Max as) = Max <$> traverseTermM f as foldTerm f (Max as) = foldTerm f as instance TermLike PlusLevel where- traverseTerm f l = case l of- ClosedLevel{} -> l- Plus n l -> Plus n $ traverseTerm f l traverseTermM f l = case l of ClosedLevel{} -> return l Plus n l -> Plus n <$> traverseTermM f l@@ -162,11 +130,6 @@ foldTerm f (Plus _ l) = foldTerm f l instance TermLike LevelAtom where- traverseTerm f l = case l of- MetaLevel m vs -> MetaLevel m $ traverseTerm f vs- NeutralLevel r v -> NeutralLevel r $ traverseTerm f v- BlockedLevel m v -> BlockedLevel m $ traverseTerm f v- UnreducedLevel v -> UnreducedLevel $ traverseTerm f v traverseTermM f l = case l of MetaLevel m vs -> MetaLevel m <$> traverseTermM f vs NeutralLevel r v -> NeutralLevel r <$> traverseTermM f v@@ -179,40 +142,28 @@ UnreducedLevel v -> foldTerm f v instance TermLike Type where- traverseTerm f (El s t) = El s $ traverseTerm f t traverseTermM f (El s t) = El s <$> traverseTermM f t foldTerm f (El s t) = foldTerm f t instance TermLike EqualityView where - traverseTerm f v = case v of- OtherType t -> OtherType- (traverseTerm f t)- EqualityType s eq l t a b -> EqualityType s eq- (traverseTerm f l)- (traverseTerm f t)- (traverseTerm f a)- (traverseTerm f b)- traverseTermM f v = case v of OtherType t -> OtherType <$> traverseTermM f t EqualityType s eq l t a b -> EqualityType s eq- <$> traverseTermM f l+ <$> traverse (traverseTermM f) l <*> traverseTermM f t <*> traverseTermM f a <*> traverseTermM f b foldTerm f v = case v of OtherType t -> foldTerm f t- EqualityType s eq l t a b -> foldTerm f [l, t, a, b]+ EqualityType s eq l t a b -> foldTerm f (l ++ [t, a, b]) -- | Put it in a monad to make it possible to do strictly.-copyTerm+copyTerm :: (TermLike a, Monad m #if __GLASGOW_HASKELL__ <= 708- :: (TermLike a, Applicative m, Monad m)-#else- :: (TermLike a, Monad m)+ , Applicative m #endif- => a -> m a+ ) => a -> m a copyTerm = traverseTermM return
src/full/Agda/Syntax/Internal/Names.hs view
@@ -1,6 +1,8 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE TypeFamilies #-} -- | Extract all names from things.+ module Agda.Syntax.Internal.Names where import Data.Foldable@@ -16,6 +18,7 @@ import Agda.Syntax.Internal import qualified Agda.Syntax.Concrete as C import qualified Agda.Syntax.Abstract as A+ import Agda.TypeChecking.Monad.Base import Agda.TypeChecking.CompiledClause @@ -26,19 +29,18 @@ class NamesIn a where namesIn :: a -> Set QName -namesInFoldable :: (Foldable f, NamesIn a) => f a -> Set QName-namesInFoldable x = Set.unions $ foldMap ((:[]) . namesIn) x--instance NamesIn a => NamesIn (Maybe a) where namesIn = namesInFoldable-instance NamesIn a => NamesIn [a] where namesIn = namesInFoldable-instance NamesIn a => NamesIn (Arg a) where namesIn = namesInFoldable-instance NamesIn a => NamesIn (Dom a) where namesIn = namesInFoldable-instance NamesIn a => NamesIn (Named n a) where namesIn = namesInFoldable-instance NamesIn a => NamesIn (Abs a) where namesIn = namesInFoldable-instance NamesIn a => NamesIn (WithArity a) where namesIn = namesInFoldable-instance NamesIn a => NamesIn (Tele a) where namesIn = namesInFoldable+ default namesIn :: (Foldable f, NamesIn b, f b ~ a) => a -> Set QName+ namesIn = foldMap namesIn -instance NamesIn a => NamesIn (C.FieldAssignment' a) where namesIn = namesInFoldable+instance NamesIn a => NamesIn (Maybe a) where+instance NamesIn a => NamesIn [a] where+instance NamesIn a => NamesIn (Arg a) where+instance NamesIn a => NamesIn (Dom a) where+instance NamesIn a => NamesIn (Named n a) where+instance NamesIn a => NamesIn (Abs a) where+instance NamesIn a => NamesIn (WithArity a) where+instance NamesIn a => NamesIn (Tele a) where+instance NamesIn a => NamesIn (C.FieldAssignment' a) where instance (NamesIn a, NamesIn b) => NamesIn (a, b) where namesIn (x, y) = Set.union (namesIn x) (namesIn y)@@ -46,19 +48,28 @@ instance (NamesIn a, NamesIn b, NamesIn c) => NamesIn (a, b, c) where namesIn (x, y, z) = namesIn (x, (y, z)) +-- Andreas, 2017-07-27+-- In the following clauses, the choice of fields is not obvious+-- to the reader. Please comment on the choices.+--+-- Also, this would be more robust if these were constructor-style+-- matches instead of record-style matches.+-- If someone adds a field containing names, this would go unnoticed.+ instance NamesIn Definition where namesIn def = namesIn (defType def, theDef def) instance NamesIn Defn where namesIn def = case def of Axiom -> Set.empty+ -- Andreas 2017-07-27, Q: which names can be in @cc@ which are not already in @cl@? Function { funClauses = cl, funCompiled = cc } -> namesIn (cl, cc) Datatype { dataClause = cl, dataCons = cs, dataSort = s } -> namesIn (cl, cs, s) Record { recClause = cl, recConHead = c, recFields = fs } -> namesIn (cl, c, fs) -- Don't need recTel since those will be reachable from the constructor Constructor { conSrcCon = c, conData = d } -> namesIn (c, d) Primitive { primClauses = cl, primCompiled = cc } -> namesIn (cl, cc)- AbstractDefn -> __IMPOSSIBLE__+ AbstractDefn{} -> __IMPOSSIBLE__ instance NamesIn Clause where namesIn Clause{ clauseTel = tel, namedClausePats = ps, clauseBody = b, clauseType = t } =@@ -69,6 +80,8 @@ namesIn (Done _ v) = namesIn v namesIn Fail = Set.empty +-- Andreas, 2017-07-27+-- Why ignoring the litBranches? instance NamesIn a => NamesIn (Case a) where namesIn Branches{ conBranches = bs, catchAllBranch = c } = namesIn (Map.toList bs, c)@@ -78,6 +91,7 @@ VarP{} -> Set.empty LitP l -> namesIn l DotP v -> namesIn v+ AbsurdP p -> namesIn p ConP c _ args -> namesIn (c, args) ProjP _ f -> namesIn f @@ -134,13 +148,11 @@ namesIn (Apply arg) = namesIn arg namesIn (Proj _ f) = namesIn f -instance NamesIn QName where namesIn x = Set.singleton x+instance NamesIn QName where namesIn x = Set.singleton x -- interesting case instance NamesIn ConHead where namesIn h = namesIn (conName h) -instance NamesIn a => NamesIn (Open a) where- namesIn = namesIn . openThing--instance NamesIn a => NamesIn (Local a) where namesIn = namesIn . dget+instance NamesIn a => NamesIn (Open a) where+instance NamesIn a => NamesIn (Local a) where instance NamesIn DisplayForm where namesIn (Display _ ps v) = namesIn (ps, v)
src/full/Agda/Syntax/Internal/Pattern.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE TypeFamilies #-} -- because of type equality ~ {-# LANGUAGE UndecidableInstances #-} -- because of func. deps. #if __GLASGOW_HASKELL__ <= 708@@ -11,8 +12,10 @@ import Control.Monad.State import Data.Maybe-import Data.List-import Data.Traversable (traverse)+import Data.Monoid+import qualified Data.List as List+import Data.Foldable (Foldable, foldMap)+import Data.Traversable (Traversable, traverse) import Agda.Syntax.Common import Agda.Syntax.Abstract (IsProjP(..))@@ -79,17 +82,19 @@ -- ^ Intended, but unpractical due to the absence of type-level lambda, is: -- @labelPatVars :: f (Pattern' x) -> State [i] (f (Pattern' (i,x)))@ -instance LabelPatVars a b i => LabelPatVars (Arg a) (Arg b) i where+ default labelPatVars+ :: (Traversable f, LabelPatVars a' b' i, f a' ~ a, f b' ~ b)+ => a -> State [i] b labelPatVars = traverse labelPatVars- unlabelPatVars = fmap unlabelPatVars -instance LabelPatVars a b i => LabelPatVars (Named x a) (Named x b) i where- labelPatVars = traverse labelPatVars+ default unlabelPatVars+ :: (Traversable f, LabelPatVars a' b' i, f a' ~ a, f b' ~ b)+ => b -> a unlabelPatVars = fmap unlabelPatVars -instance LabelPatVars a b i => LabelPatVars [a] [b] i where- labelPatVars = traverse labelPatVars- unlabelPatVars = fmap unlabelPatVars+instance LabelPatVars a b i => LabelPatVars (Arg a) (Arg b) i where+instance LabelPatVars a b i => LabelPatVars (Named x a) (Named x b) i where+instance LabelPatVars a b i => LabelPatVars [a] [b] i where instance LabelPatVars Pattern DeBruijnPattern Int where labelPatVars p =@@ -97,6 +102,7 @@ VarP x -> do i <- next return $ VarP (DBPatVar x i) DotP t -> DotP t <$ next+ AbsurdP p -> AbsurdP <$> labelPatVars p ConP c mt ps -> ConP c mt <$> labelPatVars ps LitP l -> return $ LitP l ProjP o q -> return $ ProjP o q@@ -142,12 +148,13 @@ where ixs = concatMap (getIndices . namedThing . unArg) ps n = size $ catMaybes ixs- picks = forM (downFrom n) $ \ i -> findIndex (Just i ==) ixs+ picks = forM (downFrom n) $ \ i -> List.findIndex (Just i ==) ixs getIndices :: DeBruijnPattern -> [Maybe Int] getIndices (VarP x) = [Just $ dbPatVarIndex x] getIndices (ConP c _ ps) = concatMap (getIndices . namedThing . unArg) ps getIndices (DotP _) = [Nothing | countDots]+ getIndices (AbsurdP p) = getIndices p getIndices (LitP _) = [] getIndices ProjP{} = [] @@ -169,6 +176,7 @@ map (argFromElim . patternToElim . fmap namedThing) ps where ci = fromConPatternInfo cpi patternToElim (Arg ai (DotP t) ) = Apply $ Arg ai t+patternToElim (Arg ai (AbsurdP p)) = patternToElim $ Arg ai p patternToElim (Arg ai (LitP l) ) = Apply $ Arg ai $ Lit l patternToElim (Arg ai (ProjP o dest)) = Proj o dest @@ -183,17 +191,112 @@ Apply x -> unArg x Proj{} -> __IMPOSSIBLE__ + class MapNamedArg f where mapNamedArg :: (NamedArg a -> NamedArg b) -> NamedArg (f a) -> NamedArg (f b) +-- | Modify the content of @VarP@, and the closest surrounding @NamedArg@.+--+-- Note: the @mapNamedArg@ for @Pattern'@ is not expressible simply+-- by @fmap@ or @traverse@ etc., since @ConP@ has @NamedArg@ subpatterns,+-- which are taken into account by @mapNamedArg@.+ instance MapNamedArg Pattern' where mapNamedArg f np = case namedArg np of- VarP x -> map2 VarP $ f $ map2 (const x) np- DotP t -> map2 (const $ DotP t) np -- just Haskell type conversion- LitP l -> map2 (const $ LitP l) np -- ditto- ProjP o q -> map2 (const $ ProjP o q) np -- ditto- ConP c i ps -> map2 (const $ ConP c i $ map (mapNamedArg f) ps) np+ VarP x -> updateNamedArg VarP $ f $ setNamedArg np x+ AbsurdP p -> updateNamedArg AbsurdP $ mapNamedArg f $ setNamedArg np p+ DotP t -> setNamedArg np $ DotP t -- just Haskell type conversion+ LitP l -> setNamedArg np $ LitP l -- ditto+ ProjP o q -> setNamedArg np $ ProjP o q -- ditto+ ConP c i ps -> setNamedArg np $ ConP c i $ map (mapNamedArg f) ps+++-- | Generic pattern traversal.+--+-- Pre-applies a pattern modification, recurses, and post-applies another one.++class PatternLike a b where++ -- | Fold pattern.+ foldrPattern+ :: Monoid m+ => (Pattern' a -> m -> m)+ -- ^ Combine a pattern and the value computed from its subpatterns.+ -> b -> m++ default foldrPattern+ :: (Monoid m, Foldable f, PatternLike a p, f p ~ b)+ => (Pattern' a -> m -> m) -> b -> m+ foldrPattern = foldMap . foldrPattern++ -- | Traverse pattern.+ traversePatternM :: (Monad m+#if __GLASGOW_HASKELL__ <= 708+ , Applicative m, Functor m+#endif+ ) => (Pattern' a -> m (Pattern' a)) -- ^ @pre@: Modification before recursion.+ -> (Pattern' a -> m (Pattern' a)) -- ^ @post@: Modification after recursion.+ -> b -> m b++ default traversePatternM :: (Traversable f, PatternLike a p, f p ~ b, Monad m+#if __GLASGOW_HASKELL__ <= 708+ , Applicative m, Functor m+#endif+ ) => (Pattern' a -> m (Pattern' a))+ -> (Pattern' a -> m (Pattern' a))+ -> b -> m b+ traversePatternM pre post = traverse $ traversePatternM pre post++-- | Compute from each subpattern a value and collect them all in a monoid.++foldPattern :: (PatternLike a b, Monoid m) => (Pattern' a -> m) -> b -> m+foldPattern f = foldrPattern $ \ p m -> f p `mappend` m++-- | Traverse pattern(s) with a modification before the recursive descent.++preTraversePatternM :: (PatternLike a b, Monad m+#if __GLASGOW_HASKELL__ <= 708+ , Applicative m, Functor m+#endif+ ) => (Pattern' a -> m (Pattern' a)) -- ^ @pre@: Modification before recursion.+ -> b -> m b+preTraversePatternM pre = traversePatternM pre return++-- | Traverse pattern(s) with a modification after the recursive descent.++postTraversePatternM :: (PatternLike a b, Monad m+#if __GLASGOW_HASKELL__ <= 708+ , Applicative m, Functor m+#endif+ ) => (Pattern' a -> m (Pattern' a)) -- ^ @post@: Modification after recursion.+ -> b -> m b+postTraversePatternM = traversePatternM return++-- This is where the action is:++instance PatternLike a (Pattern' a) where++ foldrPattern f p = f p $ case p of+ ConP _ _ ps -> foldrPattern f ps+ VarP _ -> mempty+ AbsurdP _ -> mempty+ LitP _ -> mempty+ DotP _ -> mempty+ ProjP _ _ -> mempty++ traversePatternM pre post = pre >=> recurse >=> post where- map2 :: (a -> b) -> NamedArg a -> NamedArg b- map2 = fmap . fmap+ recurse p = case p of+ ConP c ci ps -> ConP c ci <$> traversePatternM pre post ps+ VarP _ -> return p+ LitP _ -> return p+ DotP _ -> return p+ AbsurdP _ -> return p+ ProjP _ _ -> return p++-- Boilerplate instances:++instance PatternLike a b => PatternLike a [b] where+instance PatternLike a b => PatternLike a (Arg b) where+instance PatternLike a b => PatternLike a (Named x b) where
src/full/Agda/Syntax/Internal/SanityCheck.hs view
@@ -18,7 +18,7 @@ #include "undefined.h" -sanityCheckVars :: (Pretty a, FreeVS a) => Telescope -> a -> TCM ()+sanityCheckVars :: (Pretty a, Free a) => Telescope -> a -> TCM () sanityCheckVars tel v = case filter bad (Set.toList $ allFreeVars v) of [] -> return ()@@ -33,13 +33,13 @@ bad x = x < 0 || x >= n -- | Check that @Γ ⊢ ρ : Δ@.-sanityCheckSubst :: (Pretty a, FreeVS a) => Telescope -> Substitution' a -> Telescope -> TCM ()+sanityCheckSubst :: (Pretty a, Free a) => Telescope -> Substitution' a -> Telescope -> TCM () sanityCheckSubst gamma rho delta = go gamma rho delta where go gamma rho delta = case rho of IdS -> unless (size gamma == size delta) $ err $ text "idS:" <+> hang (pretty gamma <+> text "/=") 2 (pretty delta)- EmptyS -> unless (size delta == 0) $ err $ text "emptyS:" <+> pretty delta <+> text "is not empty"+ EmptyS _ -> unless (size delta == 0) $ err $ text "emptyS:" <+> pretty delta <+> text "is not empty" v :# rho -> do unless (size delta > 0) $ err $ text "consS: empty target" sanityCheckVars gamma v
src/full/Agda/Syntax/Literal.hs view
@@ -4,7 +4,9 @@ import Control.DeepSeq import Data.Char+ import Data.Typeable (Typeable)+import Data.Data (Data) import Numeric.IEEE ( IEEE(identicalIEEE) ) @@ -20,26 +22,26 @@ | LitChar Range !Char | LitQName Range QName | LitMeta Range AbsolutePath MetaId- deriving (Typeable)+ deriving (Typeable, Data) instance Show Literal where showsPrec p l = showParen (p > 9) $ case l of- LitNat _ n -> sh "LitNat" n- LitFloat _ x -> sh "LitFloat" x- LitString _ s -> sh "LitString" s- LitChar _ c -> sh "LitChar" c- LitQName _ q -> sh "LitQName" q- LitMeta _ _ x -> sh "LitMeta" x+ LitNat _ n -> sh "LitNat _" n+ LitFloat _ x -> sh "LitFloat _" x+ LitString _ s -> sh "LitString _" s+ LitChar _ c -> sh "LitChar _" c+ LitQName _ q -> sh "LitQName _" q+ LitMeta _ _ x -> sh "LitMeta _ _" x where sh :: Show a => String -> a -> ShowS sh c x = showString (c ++ " ") . shows x instance Pretty Literal where pretty (LitNat _ n) = text $ show n- pretty (LitFloat _ x) = text $ show x+ pretty (LitFloat _ d) = text $ show d pretty (LitString _ s) = text $ showString' s "" pretty (LitChar _ c) = text $ "'" ++ showChar' c "" ++ "'"- pretty (LitQName _ x) = text $ show x+ pretty (LitQName _ x) = pretty x pretty (LitMeta _ _ x) = pretty x showString' :: String -> ShowS
src/full/Agda/Syntax/Notation.hs view
@@ -1,6 +1,5 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE ScopedTypeVariables #-} {-| As a concrete name, a notation is a non-empty list of alternating 'IdPart's and holes. In contrast to concrete names, holes can be binders.@@ -19,8 +18,10 @@ import Control.DeepSeq import Control.Monad -import Data.List+import qualified Data.List as List import Data.Maybe++import Data.Data (Data) import Data.Typeable (Typeable) import Agda.Syntax.Common@@ -58,7 +59,7 @@ | WildHole !Int -- ^ An underscore in binding position. | IdPart RawName- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) instance KillRange GenPart where killRange p = case p of@@ -187,8 +188,8 @@ -- The hole names are the keys of the @holeMap@. uniqueHoleNames = distinct [ x | (x, _) <- holeMap, x /= "_" ] - isExprLinear xs = sort [ i | x <- xs, isNormalHole x, let Just i = holeTarget x ] == holeNumbers- isLambdaLinear xs = sort [ x | BindHole x <- xs ] ==+ isExprLinear xs = List.sort [ i | x <- xs, isNormalHole x, let Just i = holeTarget x ] == holeNumbers+ isLambdaLinear xs = List.sort [ x | BindHole x <- xs ] == [ i | (i, h) <- numberedHoles, LambdaHole x _ <- [namedArg h], x /= "_" ]
src/full/Agda/Syntax/Parser.hs view
@@ -28,7 +28,8 @@ import Control.Monad.State import Control.Monad.Reader import Control.Monad.Writer hiding ((<>))-import Data.List++import qualified Data.List as List import Data.Typeable ( Typeable ) import Agda.Syntax.Position@@ -42,12 +43,12 @@ import Agda.Syntax.Parser.Tokens import Agda.Utils.Except- ( Error(strMsg)- , ExceptT+ ( ExceptT , MonadError(catchError, throwError) , runExceptT ) import Agda.Utils.FileName+import Agda.Utils.IO.UTF8 (readTextFile) import qualified Agda.Utils.Maybe.Strict as Strict import Agda.Utils.Pretty @@ -120,7 +121,7 @@ parseLiterateWithComments :: LiterateParser [Token] parseLiterateWithComments p layers = do code <- map Left <$> parseLiterateWithoutComments p layers- let literate = Right <$> filter (not . isCode) layers+ let literate = Right <$> filter (not . isCodeLayer) layers let (terms, overlaps) = interleaveRanges code literate forM_ (map fst overlaps) $ \c -> warning$ OverlappingTokensWarning { warnRange = getRange c }@@ -133,7 +134,7 @@ | m <- terms ] readFilePM :: AbsolutePath -> PM String-readFilePM path = wrapIOM (ReadFileError path) (readFile (filePath path))+readFilePM path = wrapIOM (ReadFileError path) (readTextFile (filePath path)) parseLiterateFile :: Processor -> Parser a -> AbsolutePath -> PM a parseLiterateFile po p path = readFilePM path >>= parseLiterate p p . po (startPos (Just path))@@ -147,7 +148,7 @@ parseFile' :: (Show a) => Parser a -> AbsolutePath -> PM a parseFile' p file =- if ".agda" `isSuffixOf` filePath file then+ if ".agda" `List.isSuffixOf` filePath file then Agda.Syntax.Parser.parseFile p file else go literateProcessors@@ -156,7 +157,7 @@ errPath = file , errValidExts = parseFileExts }- go ((ext, po):pos) | ext `isSuffixOf` filePath file = parseLiterateFile po p file+ go ((ext, po):pos) | ext `List.isSuffixOf` filePath file = parseLiterateFile po p file go (_:pos) = go pos ------------------------------------------------------------------------
src/full/Agda/Syntax/Parser/Comments.hs view
@@ -10,7 +10,7 @@ module Agda.Syntax.Parser.Comments where -import Data.List+import qualified Data.List as List import {-# SOURCE #-} Agda.Syntax.Parser.LexActions import Agda.Syntax.Parser.Monad@@ -45,7 +45,7 @@ i = posToInterval (lexSrcFile inp) p1 p2 s = case (p1, p2) of (Pn { posPos = p1 }, Pn { posPos = p2 }) ->- genericTake (p2 - p1) $ lexInput inp+ List.genericTake (p2 - p1) $ lexInput inp return $ TokComment (i, s) else lexToken
src/full/Agda/Syntax/Parser/LexActions.hs view
@@ -9,7 +9,7 @@ , token , withInterval, withInterval', withInterval_ , withLayout- , begin, end, endWith+ , begin, end, beginWith, endWith , begin_, end_ , lexError -- ** Specialized actions@@ -161,13 +161,18 @@ do pushLexState code skipTo inp' - -- | Exit the current state throwing away the current lexeme. end_ :: LexAction Token end_ _ inp' _ = do popLexState skipTo inp' ++-- | Enter a new state and perform the given action.+beginWith :: LexState -> LexAction a -> LexAction a+beginWith code a inp inp' n =+ do pushLexState code+ a inp inp' n -- | Exit the current state and perform the given action. endWith :: LexAction a -> LexAction a
src/full/Agda/Syntax/Parser/LexActions.hs-boot view
@@ -14,10 +14,11 @@ withInterval' :: (String -> a) -> ((Interval, a) -> tok) -> LexAction tok withLayout :: LexAction r -> LexAction r -begin :: LexState -> LexAction Token-endWith :: LexAction a -> LexAction a-begin_ :: LexState -> LexAction Token-end_ :: LexAction Token+begin :: LexState -> LexAction Token+beginWith :: LexState -> LexAction a -> LexAction a+endWith :: LexAction a -> LexAction a+begin_ :: LexState -> LexAction Token+end_ :: LexAction Token keyword :: Keyword -> LexAction Token symbol :: Symbol -> LexAction Token
src/full/Agda/Syntax/Parser/Lexer.x view
@@ -20,8 +20,6 @@ , AlexReturn(..), alexScanUser ) where --- -- import Data.List- import Agda.Syntax.Parser.Alex import Agda.Syntax.Parser.Comments #ifndef __HADDOCK__@@ -72,25 +70,26 @@ <pragma_> $white_notab ; -- Pragmas-<0,code> "{-#" { begin pragma }-<pragma_> "{-#" { symbol SymOpenPragma }+<0,code,pragma_> "{-#" { beginWith pragma $ symbol SymOpenPragma } <pragma_> "#-}" { endWith $ symbol SymClosePragma } <pragma_> "BUILTIN" { keyword KwBUILTIN } <pragma_> "CATCHALL" { keyword KwCATCHALL } <pragma_> "COMPILED" { keyword KwCOMPILED } <pragma_> "COMPILED_DATA" { keyword KwCOMPILED_DATA } <pragma_> "COMPILED_DATA_UHC" { keyword KwCOMPILED_DATA_UHC }-<pragma_> "COMPILED_DECLARE_DATA" { keyword KwCOMPILED_DECLARE_DATA }-<pragma_> "COMPILED_EPIC" { keyword KwCOMPILED_EPIC } <pragma_> "COMPILED_EXPORT" { keyword KwCOMPILED_EXPORT } <pragma_> "COMPILED_JS" { keyword KwCOMPILED_JS } <pragma_> "COMPILED_TYPE" { keyword KwCOMPILED_TYPE } <pragma_> "COMPILED_UHC" { keyword KwCOMPILED_UHC }-<pragma_> "HASKELL" { keyword KwHASKELL }+<pragma_> "COMPILE" { keyword KwCOMPILE }+<pragma_> "FOREIGN" { keyword KwFOREIGN } <pragma_> "DISPLAY" { keyword KwDISPLAY }+<pragma_> "ETA" { keyword KwETA }+<pragma_> "HASKELL" { keyword KwHASKELL } <pragma_> "IMPORT" { keyword KwIMPORT } <pragma_> "IMPORT_UHC" { keyword KwIMPORT_UHC } <pragma_> "IMPOSSIBLE" { keyword KwIMPOSSIBLE }+<pragma_> "INJECTIVE" { keyword KwINJECTIVE } <pragma_> "INLINE" { keyword KwINLINE } <pragma_> "LINE" { keyword KwLINE } <pragma_> "MEASURE" { keyword KwMEASURE }
src/full/Agda/Syntax/Parser/Literate.hs view
@@ -2,17 +2,21 @@ {-# LANGUAGE ViewPatterns #-} -- | Preprocessors for literate code formats module Agda.Syntax.Parser.Literate (- literateProcessors,- literateExts,- literateExtsShortList,- literateSrcFile,- literateTeX,- literateRsT,- illiterate,- isCode,- Processor,- Layer(..),- LayerType(..)+ literateProcessors+ ,literateExts+ ,literateExtsShortList+ ,literateSrcFile+ ,literateTeX+ ,literateRsT+ ,literateMd+ ,illiterate+ ,atomizeLayers+ ,Processor+ ,Layers+ ,Layer(..)+ ,LayerRole(..)+ ,isCode+ ,isCodeLayer ) where @@ -29,31 +33,37 @@ #include "undefined.h" import Agda.Utils.Impossible -data LayerType = Markup | Comment | Code+-- | Role of a character in the file+data LayerRole = Markup | Comment | Code deriving (Show, Eq) +-- | A sequence of characters in a file playing the same role data Layer = Layer {- layerType :: LayerType+ layerRole :: LayerRole ,interval :: Interval ,layerContent :: String } deriving (Show) +-- | A list of contiguous layers+type Layers = [Layer]+ instance HasRange Layer where getRange = getRange . interval -- | Annotates a tokenized string with position information.-mkLayers :: Position -> [(LayerType, String)] -> [Layer]+mkLayers :: Position -> [(LayerRole, String)] -> Layers mkLayers pos [] = emptyLiterate pos+-- Ignore empty layers mkLayers pos ((_,""):xs) = mkLayers pos xs mkLayers pos ((ty,s):xs) = let next = movePosByString pos s in (Layer ty (Interval pos next) s):(mkLayers next xs) --- | Checks if a layer corresponds to Agda code-isCode :: Layer -> Bool-isCode Layer{layerType=Code} = True-isCode Layer{layerType=Markup } = False-isCode Layer{layerType=Comment} = False+unMkLayers :: Layers -> [(LayerRole, String)]+unMkLayers = map ((,) <$> layerRole <*> layerContent) +atomizeLayers :: Layers -> [(LayerRole, Char)]+atomizeLayers = (>>= fmap <$> ((,) . fst) <*> snd) . unMkLayers+ -- | Type of a literate preprocessor: -- Invariants: --@@ -78,16 +88,27 @@ [("" , literateTeX) ,(".rst", literateRsT) ,(".tex", literateTeX)+ ,(".md", literateMd) ] +-- | Returns `True` if a role corresponds to Agda code+isCode :: LayerRole -> Bool+isCode Code = True+isCode Markup = False+isCode Comment = False++-- | Returns `True` a layer contains Agda code+isCodeLayer :: Layer -> Bool+isCodeLayer = isCode . layerRole+ -- | Blanks the non-code parts of a given file, preserving positions of -- characters corresponding to code. This way, there is a direct -- correspondence between source positions and positions in the -- processed result. illiterate :: [Layer] -> String illiterate xs = concat [- (if isCode m then id else bleach) layerContent- | m@Layer{layerContent} <- xs]+ (if isCode layerRole then id else bleach) layerContent+ | Layer{layerRole,layerContent} <- xs] -- | Replaces non-space characters in a string with spaces. bleach :: String -> String@@ -138,35 +159,74 @@ literateTeX :: Position -> String -> [Layer] literateTeX pos s = mkLayers pos$ tex s where- tex :: String -> [(LayerType, String)]+ tex :: String -> [(LayerRole, String)] tex [] = [] tex s = let (line, rest) = getLine s in case r_begin `matchM` line of- Just (getAllTextSubmatches -> [_, pre, markup]) ->- (Comment, pre):(Markup, markup):code rest+ Just (getAllTextSubmatches -> [_, pre, _, markup, blanks]) ->+ (Comment, pre):(Markup, markup):(Code, blanks):code rest Just _ -> __IMPOSSIBLE__ Nothing -> (Comment, line):tex rest - r_begin = rex "(.*)([[:space:]]*\\\\begin\\{code\\}[[:space:]]*)"+ r_begin = rex "(([^\\%]|\\\\.)*)(\\\\begin\\{code\\})([[:space:]]*)" - code :: String -> [(LayerType, String)]+ code :: String -> [(LayerRole, String)] code [] = [] code s = let (line, rest) = getLine s in case r_end `matchM` line of- Just (getAllTextSubmatches -> [_, markup, post]) ->- (Markup, markup):(Comment, post):tex rest+ Just (getAllTextSubmatches -> [_, code, markup, post]) ->+ (Code,code):(Markup, markup):(Comment, post):tex rest Just _ -> __IMPOSSIBLE__ Nothing -> (Code, line):code rest - r_end = rex "([[:space:]]*\\\\end\\{code\\}[[:space:]]*)(.*)"+ r_end = rex "([[:blank:]]*)(\\\\end\\{code\\})(.*)" +-- | Preprocessor for Markdown+literateMd :: Position -> String -> [Layer]+literateMd pos s = mkLayers pos$ md s+ where+ md :: String -> [(LayerRole, String)]+ md [] = []+ md s = let (line, rest) = getLine s in+ case md_begin `matchM` line of+ Just (getAllTextSubmatches -> [_, pre, markup, _]) ->+ (Comment, pre):(Markup, markup):code rest+ Just _ -> __IMPOSSIBLE__+ Nothing ->+ (Comment, line):+ if md_begin_other `match` line+ then code_other rest+ else md rest + md_begin = rex "(.*)([[:space:]]*```(agda)?[[:space:]]*)"+ md_begin_other = rex "[[:space:]]*```[a-zA-Z0-9-]*[[:space:]]*"++ code :: String -> [(LayerRole, String)]+ code [] = []+ code s = let (line, rest) = getLine s in+ case md_end `matchM` line of+ Just (getAllTextSubmatches -> [_, markup]) ->+ (Markup, markup):md rest+ Just _ -> __IMPOSSIBLE__+ Nothing -> (Code, line):code rest++ -- A non-Agda code block.+ code_other :: String -> [(LayerRole, String)]+ code_other [] = []+ code_other s = let (line, rest) = getLine s in+ (Comment, line):+ if md_end `match` line+ then md rest+ else code_other rest++ md_end = rex "([[:space:]]*```[[:space:]]*)"+ -- | Preprocessor for reStructuredText literateRsT :: Position -> String -> [Layer] literateRsT pos s = mkLayers pos$ rst s where- rst :: String -> [(LayerType, String)]+ rst :: String -> [(LayerRole, String)] rst [] = [] rst s = maybe_code s @@ -189,7 +249,7 @@ -- | Finds the next indented block in the input- code :: String -> [(LayerType, String)]+ code :: String -> [(LayerRole, String)] code [] = [] code s = let (line, rest) = getLine s in if all isSpace line then@@ -202,7 +262,7 @@ (indented xs rest) -- | Process an indented block- indented :: String -> String -> [(LayerType, String)]+ indented :: String -> String -> [(LayerRole, String)] indented _ [] = [] indented ind s = let (line, rest) = getLine s in if all isSpace line then
src/full/Agda/Syntax/Parser/Monad.hs view
@@ -33,7 +33,9 @@ import Control.Exception (catch) import Data.Int+ import Data.Typeable ( Typeable )+import Data.Data (Data) import Control.Monad.State import Control.Applicative@@ -41,10 +43,6 @@ import Agda.Syntax.Position import Agda.Utils.Except ( MonadError(catchError, throwError) )-#if !(MIN_VERSION_mtl(2,2,1))-import Agda.Utils.Except ( Error(noMsg) )-#endif- import Agda.Utils.FileName import qualified Agda.Utils.IO.UTF8 as UTF8 import qualified Agda.Utils.Maybe.Strict as Strict@@ -137,7 +135,7 @@ OverlappingTokensWarning { warnRange :: !(Range' SrcFile) -- ^ The range of the bigger overlapping token- }+ } deriving (Typeable, Data) -- | The result of parsing something. data ParseResult a = ParseOk ParseState a@@ -197,7 +195,7 @@ pretty InvalidExtensionError{errPath,errValidExts} = vcat [ pretty errPath <> colon <+> text "Unsupported extension."- , text "Supported extensions are:" <+> prettyList errValidExts+ , text "Supported extensions are:" <+> prettyList_ errValidExts ] pretty ReadFileError{errPath,errIOError} = vcat [ text "Cannot read file" <+> pretty errPath@@ -213,12 +211,6 @@ where p = startPos (Just errPath) getRange ReadFileError{errPath} = posToRange p p where p = startPos (Just errPath)--#if !(MIN_VERSION_mtl(2,2,1))--- Stupid ErrorT!-instance Error ParseError where- noMsg = __IMPOSSIBLE__-#endif instance Show ParseWarning where show = prettyShow
src/full/Agda/Syntax/Parser/Parser.y view
@@ -133,17 +133,19 @@ 'COMPILED' { TokKeyword KwCOMPILED $$ } 'COMPILED_DATA' { TokKeyword KwCOMPILED_DATA $$ } 'COMPILED_DATA_UHC' { TokKeyword KwCOMPILED_DATA_UHC $$ }- 'COMPILED_DECLARE_DATA' { TokKeyword KwCOMPILED_DECLARE_DATA $$ }- 'COMPILED_EPIC' { TokKeyword KwCOMPILED_EPIC $$ } 'COMPILED_EXPORT' { TokKeyword KwCOMPILED_EXPORT $$ } 'COMPILED_JS' { TokKeyword KwCOMPILED_JS $$ } 'COMPILED_TYPE' { TokKeyword KwCOMPILED_TYPE $$ } 'COMPILED_UHC' { TokKeyword KwCOMPILED_UHC $$ }- 'HASKELL' { TokKeyword KwHASKELL $$ } 'DISPLAY' { TokKeyword KwDISPLAY $$ }+ 'ETA' { TokKeyword KwETA $$ }+ 'HASKELL' { TokKeyword KwHASKELL $$ } 'IMPORT' { TokKeyword KwIMPORT $$ } 'IMPORT_UHC' { TokKeyword KwIMPORT_UHC $$ }+ 'FOREIGN' { TokKeyword KwFOREIGN $$ }+ 'COMPILE' { TokKeyword KwCOMPILE $$ } 'IMPOSSIBLE' { TokKeyword KwIMPOSSIBLE $$ }+ 'INJECTIVE' { TokKeyword KwINJECTIVE $$ } 'INLINE' { TokKeyword KwINLINE $$ } 'MEASURE' { TokKeyword KwMEASURE $$ } 'NO_TERMINATION_CHECK' { TokKeyword KwNO_TERMINATION_CHECK $$ }@@ -263,17 +265,19 @@ | 'COMPILED' { TokKeyword KwCOMPILED $1 } | 'COMPILED_DATA' { TokKeyword KwCOMPILED_DATA $1 } | 'COMPILED_DATA_UHC' { TokKeyword KwCOMPILED_DATA_UHC $1 }- | 'COMPILED_DECLARE_DATA' { TokKeyword KwCOMPILED_DECLARE_DATA $1 }- | 'COMPILED_EPIC' { TokKeyword KwCOMPILED_EPIC $1 } | 'COMPILED_EXPORT' { TokKeyword KwCOMPILED_EXPORT $1 } | 'COMPILED_JS' { TokKeyword KwCOMPILED_JS $1 } | 'COMPILED_TYPE' { TokKeyword KwCOMPILED_TYPE $1 } | 'COMPILED_UHC' { TokKeyword KwCOMPILED_UHC $1 }- | 'HASKELL' { TokKeyword KwHASKELL $1 } | 'DISPLAY' { TokKeyword KwDISPLAY $1 }+ | 'ETA' { TokKeyword KwETA $1 }+ | 'HASKELL' { TokKeyword KwHASKELL $1 } | 'IMPORT' { TokKeyword KwIMPORT $1 } | 'IMPORT_UHC' { TokKeyword KwIMPORT_UHC $1 }+ | 'FOREIGN' { TokKeyword KwFOREIGN $1 }+ | 'COMPILE' { TokKeyword KwCOMPILE $1 } | 'IMPOSSIBLE' { TokKeyword KwIMPOSSIBLE $1 }+ | 'INJECTIVE' { TokKeyword KwINJECTIVE $1 } | 'INLINE' { TokKeyword KwINLINE $1 } | 'MEASURE' { TokKeyword KwMEASURE $1 } | 'NO_TERMINATION_CHECK' { TokKeyword KwNO_TERMINATION_CHECK $1 }@@ -328,6 +332,7 @@ File :: { ([Pragma], [Declaration]) } File : vopen TopLevel maybe_vclose { takeOptionsPragmas $2 } +maybe_vclose :: { () } maybe_vclose : {- empty -} { () } | vclose { () } @@ -347,6 +352,7 @@ brace. However when the parser sees the 'in' there will be a parse error. This is our cue to close the layout block. -}+close :: { () } close : vclose { () } | error {% popContext } @@ -355,6 +361,7 @@ -- brace, so we don't have to distinguish between the two semi colons. You can't -- use a virtual semi colon in a block started by a concrete brace, but this is -- simply because the lexer will not generate virtual semis in this case.+semi :: { Interval } semi : ';' { $1 } | vsemi { $1 } @@ -566,6 +573,12 @@ Strings : {- empty -} { [] } | string Strings { $1 : $2 } +ForeignCode :: { [(Interval, String)] }+ForeignCode+ : {- empty -} { [] }+ | string ForeignCode { $1 : $2 }+ | '{-#' ForeignCode '#-}' ForeignCode { [($1, "{-#")] ++ $2 ++ [($3, "#-}")] ++ $4 }+ PragmaName :: { Name } PragmaName : string {% mkName $1 } @@ -607,6 +620,7 @@ | Expr1 %prec LOWEST { $1 } -- Level 1: Application+Expr1 :: { Expr } Expr1 : WithExprs {% case $1 of { [e] -> return e ; e : es -> return $ WithApp (fuseRange e es) e es@@ -625,6 +639,7 @@ | Expr3 Application { $1 : $2 } -- Level 2: Lambdas and lets+Expr2 :: { Expr } Expr2 : '\\' LamBindings Expr { Lam (getRange ($1,$2,$3)) $2 $3 } | ExtendedOrAbsurdLam { $1 }@@ -638,7 +653,7 @@ ExtendedOrAbsurdLam :: { Expr } ExtendedOrAbsurdLam : '\\' '{' LamClauses '}' { ExtendedLam (getRange ($1,$2,$3,$4)) (reverse $3) }- | '\\' 'where' vopen LamClauses close { ExtendedLam (getRange ($1, $2, $4)) (reverse $4) }+ | '\\' 'where' vopen LamWhereClauses close { ExtendedLam (getRange ($1, $2, $4)) (reverse $4) } | '\\' AbsurdLamBindings {% case $2 of Left (bs, h) -> if null bs then return $ AbsurdLam r h else return $ Lam r bs (AbsurdLam r h)@@ -654,11 +669,22 @@ : Expr3 { [$1] } | Expr3 Application3 { $1 : $2 } +-- Christian Sattler, 2017-08-04, issue #2671+-- We allow empty lists of expressions for the LHS of extended lambda clauses.+-- I am not sure what Application3 is otherwise used for, so I keep the+-- original type and create this copy solely for extended lambda clauses.+Application3PossiblyEmpty :: { [Expr] }+Application3PossiblyEmpty+ : { [] }+ | Expr3 Application3PossiblyEmpty { $1 : $2 }+ -- Level 3: Atoms+Expr3Curly :: { Expr } Expr3Curly : '{' Expr '}' { HiddenArg (getRange ($1,$2,$3)) (maybeNamed $2) } | '{' '}' { let r = fuseRange $1 $2 in HiddenArg r $ unnamed $ Absurd r } +Expr3NoCurly :: { Expr } Expr3NoCurly : QId { Ident $1 } | literal { Lit $1 }@@ -682,6 +708,7 @@ | 'record' '{' RecordAssignments '}' { Rec (getRange ($1,$2,$3,$4)) $3 } | 'record' Expr3NoCurly '{' FieldAssignments '}' { RecUpdate (getRange ($1,$2,$3,$4,$5)) $2 $4 } +Expr3 :: { Expr } Expr3 : Expr3Curly { $1 } | Expr3NoCurly { $1 }@@ -724,8 +751,10 @@ --------------------------------------------------------------------------} -- "Delta ->" to avoid conflict between Delta -> Gamma and Delta -> A.+TeleArrow :: { Telescope } TeleArrow : Telescope1 '->' { $1 } +Telescope1 :: { Telescope } Telescope1 : TypedBindingss { {-TeleBind-} $1 } @@ -747,7 +776,7 @@ setRelevance Irrelevant $3 } | '.' '{{' TBind DoubleCloseBrace { setRange (getRange ($2,$3,$4)) $- setHiding Instance $+ makeInstance $ setRelevance Irrelevant $3 } | '..' '(' TBindWithHiding ')' { setRange (getRange ($2,$3,$4)) $ setRelevance NonStrict $3 }@@ -756,12 +785,12 @@ setRelevance NonStrict $3 } | '..' '{{' TBind DoubleCloseBrace { setRange (getRange ($2,$3,$4)) $- setHiding Instance $+ makeInstance $ setRelevance NonStrict $3 } | '(' TBindWithHiding ')' { setRange (getRange ($1,$2,$3)) $2 } | '{{' TBind DoubleCloseBrace { setRange (getRange ($1,$2,$3)) $- setHiding Instance $2 }+ makeInstance $2 } | '{' TBind '}' { setRange (getRange ($1,$2,$3)) $ setHiding Hidden $2 } | '(' Open ')' { tLet (getRange ($1,$3)) $2 }@@ -820,7 +849,7 @@ | TypedBindings { [Right $ DomainFull $1] } | '(' ')' { [Left NotHidden] } | '{' '}' { [Left Hidden] }- | '{{' DoubleCloseBrace { [Left Instance] }+ | '{{' DoubleCloseBrace { [Left (Instance NoOverlap)] } -- Like LamBinds, but could also parse an absurd LHS of an extended lambda @{ p1 ... () }@ LamBindsAbsurd :: { Either [Either Hiding LamBinding] [Expr] }@@ -833,16 +862,16 @@ | TypedBindings { Left [Right $ DomainFull $1] } | '(' ')' { Left [Left NotHidden] } | '{' '}' { Left [Left Hidden] }- | '{{' DoubleCloseBrace { Left [Left Instance] }+ | '{{' DoubleCloseBrace { Left [Left (Instance NoOverlap)] } -- FNF, 2011-05-05: No where clauses in extended lambdas for now NonAbsurdLamClause :: { (LHS,RHS,WhereClause,Bool) } NonAbsurdLamClause- : Application3 '->' Expr {% do+ : Application3PossiblyEmpty '->' Expr {% do p <- exprToLHS (RawApp (getRange $1) $1) ; return (p [] [], RHS $3, NoWhere, False) }- | CatchallPragma Application3 '->' Expr {% do+ | CatchallPragma Application3PossiblyEmpty '->' Expr {% do p <- exprToLHS (RawApp (getRange $2) $2) ; return (p [] [], RHS $4, NoWhere, True) }@@ -874,6 +903,12 @@ | NonAbsurdLamClause { [$1] } -- | {- empty -} { [] } +-- Parses all extended lambda clauses including a single absurd clause. For λ+-- where this is not taken care of in AbsurdLambda+LamWhereClauses :: { [(LHS,RHS,WhereClause,Bool)] }+LamWhereClauses+ : LamWhereClauses semi LamClause { $3 : $1 }+ | LamClause { [$1] } ForallBindings :: { [LamBinding] } ForallBindings@@ -902,17 +937,6 @@ Left lbs -> lbs Right _ -> fail "expected sequence of bound identifiers, not absurd pattern" }-{- : BId { [DomainFree NotHidden Relevant $ mkBoundName_ $1] }- | '.' BId { [DomainFree NotHidden Irrelevant $ mkBoundName_ $2] }- | '..' BId { [DomainFree NotHidden NonStrict $ mkBoundName_ $2] }- | '{' CommaBIds '}' { map (DomainFree Hidden Relevant . mkBoundName_) $2 }- | '{{' CommaBIds DoubleCloseBrace { map (DomainFree (setHiding Instance defaultArgInfo) . mkBoundName_) $2 }- | '.' '{' CommaBIds '}' { map (DomainFree Hidden Irrelevant . mkBoundName_) $3 }- | '.' '{{' CommaBIds DoubleCloseBrace { map (DomainFree Instance Irrelevant . mkBoundName_) $3 }- | '..' '{' CommaBIds '}' { map (DomainFree Hidden NonStrict . mkBoundName_) $3 }- | '..' '{{' CommaBIds DoubleCloseBrace { map (DomainFree Instance NonStrict . mkBoundName_) $3 }- | '..' '{{' CommaBIds DoubleCloseBrace { map (DomainFree Instance NonStrict . mkBoundName_) $3 }- -} -- A domain free binding is either x or {x1 .. xn} DomainFreeBindingAbsurd :: { Either [LamBinding] [Expr]}@@ -922,11 +946,11 @@ | '..' BId { Left [DomainFree (setRelevance NonStrict $ defaultArgInfo) $ mkBoundName_ $2] } | '{' CommaBIdAndAbsurds '}' { mapLeft (map (DomainFree (setHiding Hidden $ defaultArgInfo) . mkBoundName_)) $2 }- | '{{' CommaBIds DoubleCloseBrace { Left $ map (DomainFree (setHiding Instance $ defaultArgInfo) . mkBoundName_) $2 }+ | '{{' CommaBIds DoubleCloseBrace { Left $ map (DomainFree (makeInstance $ defaultArgInfo) . mkBoundName_) $2 } | '.' '{' CommaBIds '}' { Left $ map (DomainFree (setHiding Hidden $ setRelevance Irrelevant $ defaultArgInfo) . mkBoundName_) $3 }- | '.' '{{' CommaBIds DoubleCloseBrace { Left $ map (DomainFree (setHiding Instance $ setRelevance Irrelevant $ defaultArgInfo) . mkBoundName_) $3 }+ | '.' '{{' CommaBIds DoubleCloseBrace { Left $ map (DomainFree (makeInstance $ setRelevance Irrelevant $ defaultArgInfo) . mkBoundName_) $3 } | '..' '{' CommaBIds '}' { Left $ map (DomainFree (setHiding Hidden $ setRelevance NonStrict $ defaultArgInfo) . mkBoundName_) $3 }- | '..' '{{' CommaBIds DoubleCloseBrace { Left $ map (DomainFree (setHiding Instance $ setRelevance NonStrict $ defaultArgInfo) . mkBoundName_) $3 }+ | '..' '{{' CommaBIds DoubleCloseBrace { Left $ map (DomainFree (makeInstance $ setRelevance NonStrict $ defaultArgInfo) . mkBoundName_) $3 } {--------------------------------------------------------------------------@@ -990,6 +1014,7 @@ : {- empty -} { [] } | CommaImportNames1 { $1 } +CommaImportNames1 :: { [ImportedName] } CommaImportNames1 : ImportName { [$1] } | ImportName ';' CommaImportNames1 { $1 : $3 }@@ -1082,12 +1107,17 @@ ArgTypeSigs :: { [Arg Declaration] } ArgTypeSigs : ArgIds ':' Expr { map (fmap (\ x -> TypeSig defaultArgInfo x $3)) $1 }- | 'overlap' ArgIds ':' Expr {- let setOverlap (Arg i x) = Arg i{ argInfoOverlappable = True } x in- map (setOverlap . fmap (\ x -> TypeSig defaultArgInfo x $4)) $2 }+ | 'overlap' ArgIds ':' Expr {%+ let setOverlap x =+ case getHiding x of+ Instance _ -> return $ makeInstance' YesOverlap x+ _ ->+ parseErrorAt (fromJust $ rStart' $ getRange $1)+ "The 'overlap' keyword only applies to instance fields (fields marked with {{ }})"+ in T.traverse (setOverlap . fmap (\ x -> TypeSig defaultArgInfo x $4)) $2 } | 'instance' ArgTypeSignatures { let- setInstance (TypeSig info x t) = TypeSig (setHiding Instance info) x t+ setInstance (TypeSig info x t) = TypeSig (makeInstance info) x t setInstance _ = __IMPOSSIBLE__ in map (fmap setInstance) $2 } @@ -1153,8 +1183,9 @@ Fields :: { [Declaration] } Fields : 'field' ArgTypeSignatures { let- inst i | getHiding i == Instance = InstanceDef- | otherwise = NotInstanceDef+ inst i = case getHiding i of+ Instance _ -> InstanceDef+ _ -> NotInstanceDef toField (Arg info (TypeSig info' x t)) = Field (inst info') x (Arg info t) in map toField $2 } @@ -1231,10 +1262,10 @@ HoleName :: { NamedArg HoleName } HoleName : SimpleTopHole { defaultNamedArg $1 }- | '{' SimpleHole '}' { setHiding Hidden $ defaultNamedArg $2 }- | '{{' SimpleHole '}}' { setHiding Instance $ defaultNamedArg $2 }- | '{' SimpleId '=' SimpleHole '}' { setHiding Hidden $ defaultArg $ named $2 $4 }- | '{{' SimpleId '=' SimpleHole '}}' { setHiding Instance $ defaultArg $ named $2 $4 }+ | '{' SimpleHole '}' { hide $ defaultNamedArg $2 }+ | '{{' SimpleHole '}}' { makeInstance $ defaultNamedArg $2 }+ | '{' SimpleId '=' SimpleHole '}' { hide $ defaultArg $ named $2 $4 }+ | '{{' SimpleId '=' SimpleHole '}}' { makeInstance $ defaultArg $ named $2 $4 } SimpleTopHole :: { HoleName } SimpleTopHole@@ -1298,7 +1329,10 @@ (Just (AsName m' asR)) doOpen dir ] else return [ impStm asR, appStm m' initArgs ]- | DontOpen <- doOpen -> parseErrorAt (fromJust $ rStart' $ getRange $2) "An import statement with module instantiation does not actually import the module. This statement achieves nothing. Either add the `open' keyword or bind the instantiated module with an `as' clause."+ -- Andreas, 2017-05-13, issue #2579+ -- Nisse reports that importing with instantation but without open+ -- could be usefule for bringing instances into scope.+ -- -- | DontOpen <- doOpen -> parseErrorAt (fromJust $ rStart' $ getRange $2) "An import statement with module instantiation does not actually import the module. This statement achieves nothing. Either add the `open' keyword or bind the instantiated module with an `as' clause." | otherwise -> return [ impStm noRange , appStm (noName $ beginningOf $ getRange m) es@@ -1375,14 +1409,15 @@ | CompiledPragma { $1 } | CompiledExportPragma { $1 } | CompiledDataPragma { $1 }- | CompiledDeclareDataPragma { $1 } | CompiledTypePragma { $1 }- | CompiledEpicPragma { $1 } | CompiledJSPragma { $1 } | CompiledUHCPragma { $1 } | CompiledDataUHCPragma { $1 } | HaskellPragma { $1 }+ | CompilePragma { $1 }+ | ForeignPragma { $1 } | StaticPragma { $1 }+ | InjectivePragma { $1 } | InlinePragma { $1 } | ImportPragma { $1 } | ImportUHCPragma { $1 }@@ -1393,6 +1428,7 @@ | MeasurePragma { $1 } | CatchallPragma { $1 } | DisplayPragma { $1 }+ | EtaPragma { $1 } | NoPositivityCheckPragma { $1 } | PolarityPragma { $1 } | OptionsPragma { $1 }@@ -1426,11 +1462,6 @@ : '{-#' 'COMPILED_EXPORT' PragmaQName PragmaString '#-}' { CompiledExportPragma (getRange ($1,$2,$3,$5)) $3 $4 } -CompiledDeclareDataPragma :: { Pragma }-CompiledDeclareDataPragma- : '{-#' 'COMPILED_DECLARE_DATA' PragmaQName PragmaStrings '#-}'- { CompiledDeclareDataPragma (getRange ($1,$2,$3,$5)) $3 (unwords $4) }- CompiledTypePragma :: { Pragma } CompiledTypePragma : '{-#' 'COMPILED_TYPE' PragmaQName PragmaStrings '#-}'@@ -1441,11 +1472,6 @@ : '{-#' 'COMPILED_DATA' PragmaQName string PragmaStrings '#-}' { CompiledDataPragma (getRange ($1,$2,$3,fst $4,$6)) $3 (snd $4) $5 } -CompiledEpicPragma :: { Pragma }-CompiledEpicPragma- : '{-#' 'COMPILED_EPIC' PragmaQName PragmaStrings '#-}'- { CompiledEpicPragma (getRange ($1,$2,$3,$5)) $3 (unwords $4) }- CompiledJSPragma :: { Pragma } CompiledJSPragma : '{-#' 'COMPILED_JS' PragmaQName PragmaStrings '#-}'@@ -1463,8 +1489,17 @@ HaskellPragma :: { Pragma } HaskellPragma- : '{-#' 'HASKELL' Strings '#-}' { HaskellCodePragma (getRange ($1, $2, $4)) (recoverLayout $3) }+ : '{-#' 'HASKELL' ForeignCode '#-}' { HaskellCodePragma (getRange ($1, $2, $4)) (recoverLayout $3) } +ForeignPragma :: { Pragma }+ForeignPragma+ : '{-#' 'FOREIGN' string ForeignCode '#-}' { ForeignPragma (getRange ($1, $2, fst $3, $5)) (snd $3) (recoverLayout $4) }++CompilePragma :: { Pragma }+CompilePragma+ : '{-#' 'COMPILE' string PragmaQName PragmaStrings '#-}'+ { CompilePragma (getRange ($1,$2,fst $3,$4,$6)) (snd $3) $4 (unwords $5) }+ StaticPragma :: { Pragma } StaticPragma : '{-#' 'STATIC' PragmaQName '#-}'@@ -1475,12 +1510,22 @@ : '{-#' 'INLINE' PragmaQName '#-}' { InlinePragma (getRange ($1,$2,$3,$4)) $3 } +InjectivePragma :: { Pragma }+InjectivePragma+ : '{-#' 'INJECTIVE' PragmaQName '#-}'+ { InjectivePragma (getRange ($1,$2,$3,$4)) $3 }+ DisplayPragma :: { Pragma } DisplayPragma : '{-#' 'DISPLAY' string PragmaStrings '#-}' {% let (r, s) = $3 in parseDisplayPragma (fuseRange $1 $5) (iStart r) (unwords (s : $4)) } +EtaPragma :: { Pragma }+EtaPragma+ : '{-#' 'ETA' PragmaQName '#-}'+ { EtaPragma (getRange ($1,$2,$3,$4)) $3 }+ NoTerminationCheckPragma :: { Pragma } NoTerminationCheckPragma : '{-#' 'NO_TERMINATION_CHECK' '#-}'@@ -1675,11 +1720,14 @@ case spanAllowedBeforeModule ds of -- Andreas 2016-02-01, issue #1388. -- We need to distinguish two additional cases.+ -- Case 1: Regular file layout: imports followed by one module. Nothing to do. (ds0, [ Module{} ]) -> ds+ -- Case 2: The declarations in the module are not indented. -- This is allowed for the top level module, and thus rectified here. (ds0, Module r m tel [] : ds2) -> ds0 ++ [Module r m tel ds2]+ -- Case 3: There is a module with indented declarations, -- followed by non-indented declarations. This should be a -- parse error and be reported later (see @toAbstract TopLevel{}@),@@ -1687,8 +1735,19 @@ (ds0, Module r m tel ds1 : ds2) -> ds -- Gives parse error in scope checker. -- OLD code causing issue 1388: -- (ds0, Module r m tel ds1 : ds2) -> ds0 ++ [Module r m tel $ ds1 ++ ds2]+ -- Case 4: a top-level module declaration is missing.- (ds0, ds1) -> ds0 ++ [Module (getRange ds1) (QName noName_) [] ds1]+ -- Andreas, 2017-01-01, issue #2229:+ -- Put everything (except OPTIONS pragmas) into an anonymous module.+ _ -> ds0 ++ [Module r (QName $ noName r) [] ds1]+ where+ (ds0, ds1) = (`span` ds) $ \case+ Pragma OptionsPragma{} -> True+ _ -> False+ -- Andreas, 2017-05-17, issue #2574.+ -- Since the module noName will act as jump target, it needs a range.+ -- We use the beginning of the file as beginning of the top level module.+ r = beginningOfFile $ getRange ds1 -- | Create a name from a string.
src/full/Agda/Syntax/Parser/Tokens.hs view
@@ -19,10 +19,11 @@ | KwEta | KwNoEta | KwHiding | KwUsing | KwRenaming | KwTo | KwPublic | KwOPTIONS | KwBUILTIN | KwLINE- | KwCOMPILED_DATA | KwCOMPILED_DECLARE_DATA | KwCOMPILED_TYPE | KwCOMPILED | KwCOMPILED_EXPORT- | KwHASKELL- | KwCOMPILED_EPIC | KwCOMPILED_JS | KwCOMPILED_UHC | KwCOMPILED_DATA_UHC- | KwIMPORT | KwIMPORT_UHC | KwIMPOSSIBLE | KwSTATIC | KwINLINE+ | KwCOMPILED_DATA | KwCOMPILED_TYPE | KwCOMPILED | KwCOMPILED_EXPORT+ | KwHASKELL | KwFOREIGN | KwCOMPILE+ | KwCOMPILED_JS | KwCOMPILED_UHC | KwCOMPILED_DATA_UHC+ | KwIMPORT | KwIMPORT_UHC | KwIMPOSSIBLE | KwSTATIC | KwINJECTIVE | KwINLINE+ | KwETA | KwNO_TERMINATION_CHECK | KwTERMINATING | KwNON_TERMINATING | KwMEASURE | KwDISPLAY | KwREWRITE
src/full/Agda/Syntax/Position.hs view
@@ -3,7 +3,6 @@ {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE NoMonomorphismRestriction #-}-{-# LANGUAGE ScopedTypeVariables #-} #if __GLASGOW_HASKELL__ <= 708 {-# LANGUAGE OverlappingInstances #-}@@ -89,6 +88,7 @@ import Data.Set (Set) import qualified Data.Set as Set import Data.Traversable (Traversable)+import Data.Data (Data) import Data.Typeable (Typeable) import Data.Sequence (Seq) import qualified Data.Sequence as Seq@@ -128,7 +128,7 @@ , posCol :: !Int32 -- ^ Column number, counting from 1. }- deriving (Typeable, Functor, Foldable, Traversable, Generic)+ deriving (Data, Typeable, Functor, Foldable, Traversable, Generic) positionInvariant :: Position' a -> Bool positionInvariant p =@@ -152,7 +152,7 @@ -- -- Note the invariant which intervals have to satisfy: 'intervalInvariant'. data Interval' a = Interval { iStart, iEnd :: !(Position' a) }- deriving (Typeable, Eq, Ord, Functor, Foldable, Traversable, Generic)+ deriving (Data, Typeable, Eq, Ord, Functor, Foldable, Traversable, Generic) type Interval = Interval' SrcFile type IntervalWithoutFile = Interval' ()@@ -197,7 +197,7 @@ = NoRange | Range !a (Seq IntervalWithoutFile) deriving- (Typeable, Eq, Ord, Functor, Foldable, Traversable, Generic)+ (Typeable, Data, Eq, Ord, Functor, Foldable, Traversable, Generic) type Range = Range' SrcFile
src/full/Agda/Syntax/Scope/Base.hs view
@@ -1,28 +1,29 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE GADTs #-} {-| This module defines the notion of a scope and operations on scopes. -} module Agda.Syntax.Scope.Base where +import Prelude hiding (null)+ import Control.Arrow (first, second, (***))-import Control.Applicative+import Control.Applicative hiding (empty) import Control.DeepSeq import Control.Monad import Data.Either (partitionEithers) import Data.Function-import Data.List as List+import qualified Data.List as List import Data.Map (Map) import qualified Data.Map as Map import Data.Set (Set) import qualified Data.Set as Set import Data.Maybe-import Data.Typeable (Typeable) --- import Debug.Trace (trace)+import Data.Typeable (Typeable)+import Data.Data (Data) import Agda.Benchmarking @@ -38,6 +39,7 @@ import Agda.Utils.Functor import Agda.Utils.Lens import Agda.Utils.List+import Agda.Utils.Null import Agda.Utils.Pretty import qualified Agda.Utils.Map as Map @@ -53,9 +55,9 @@ , scopeParents :: [A.ModuleName] , scopeNameSpaces :: ScopeNameSpaces , scopeImports :: Map C.QName A.ModuleName- , scopeDatatypeModule :: Bool+ , scopeDatatypeModule :: Maybe DataOrRecord }- deriving (Typeable, Eq)+ deriving (Typeable, Data, Eq, Show) -- | See 'Agda.Syntax.Common.Access'. data NameSpaceId@@ -65,7 +67,7 @@ | OnlyQualifiedNS -- ^ Visible (as qualified) from outside, -- but not exported when opening the module. -- Used for qualified constructors.- deriving (Typeable, Eq, Bounded, Enum)+ deriving (Typeable, Data, Eq, Bounded, Enum, Show) type ScopeNameSpaces = [(NameSpaceId, NameSpace)] @@ -98,12 +100,12 @@ { scopeCurrent :: A.ModuleName , scopeModules :: Map A.ModuleName Scope , scopeLocals :: LocalVars- , scopePrecedence :: Precedence+ , scopePrecedence :: PrecedenceStack , scopeInverseName :: Map A.QName [C.QName] , scopeInverseModule :: Map A.ModuleName [C.QName] , scopeInScope :: InScopeSet }- deriving Typeable+ deriving (Typeable, Data, Show) instance Eq ScopeInfo where ScopeInfo c1 m1 l1 p1 _ _ _ == ScopeInfo c2 m2 l2 p2 _ _ _ =@@ -115,13 +117,16 @@ -- | A local variable can be shadowed by an import. -- In case of reference to a shadowed variable, we want to report -- a scope error.-data LocalVar- = LocalVar { localVar :: A.Name }+data LocalVar = LocalVar+ { localVar :: A.Name -- ^ Unique ID of local variable.- | ShadowedVar { localVar :: A.Name, localShadowedBy :: [AbstractName] }- -- ^ This local variable is shadowed by one or more imports.- -- (List not empty).- deriving (Typeable)+ , localLetBound :: Bool+ -- ^ Flag whether the variable is introduced by a @let@.+ , localShadowedBy :: [AbstractName]+ -- ^ If this list is not empty, the local variable is+ -- shadowed by one or more imports.+ }+ deriving (Typeable, Data, Show) instance Eq LocalVar where (==) = (==) `on` localVar@@ -130,20 +135,19 @@ compare = compare `on` localVar -- | We show shadowed variables as prefixed by a ".", as not in scope.-instance Show LocalVar where- show (LocalVar x) = show x- show (ShadowedVar x xs) = "." ++ show x+instance Pretty LocalVar where+ pretty (LocalVar x _ []) = pretty x+ pretty (LocalVar x _ xs) = text "." <> pretty x -- | Shadow a local name by a non-empty list of imports. shadowLocal :: [AbstractName] -> LocalVar -> LocalVar shadowLocal [] _ = __IMPOSSIBLE__-shadowLocal ys (LocalVar x ) = ShadowedVar x ys-shadowLocal ys (ShadowedVar x zs) = ShadowedVar x (ys ++ zs)+shadowLocal ys (LocalVar x b zs) = LocalVar x b (ys ++ zs) -- | Project name of unshadowed local variable. notShadowedLocal :: LocalVar -> Maybe A.Name-notShadowedLocal (LocalVar x) = Just x-notShadowedLocal ShadowedVar{} = Nothing+notShadowedLocal (LocalVar x _ []) = Just x+notShadowedLocal _ = Nothing -- | Get all locals that are not shadowed __by imports__. notShadowedLocals :: LocalVars -> AssocList C.Name A.Name@@ -175,7 +179,7 @@ -- ^ Maps concrete module names to a list of abstract module names. , nsInScope :: InScopeSet }- deriving (Typeable, Eq)+ deriving (Typeable, Data, Eq, Show) type ThingsInScope a = Map C.Name [a] type NamesInScope = ThingsInScope AbstractName@@ -223,7 +227,7 @@ | PatternSynName -- ^ Name of a pattern synonym. | MacroName -- ^ Name of a macro | QuotableName -- ^ A name that can only be quoted.- deriving (Eq, Show, Typeable, Enum, Bounded)+ deriving (Eq, Show, Typeable, Data, Enum, Bounded) -- | A list containing all name kinds. allKindsOfNames :: [KindOfName]@@ -240,7 +244,7 @@ -- ^ Imported from another module. | Applied C.QName WhyInScope -- ^ Imported by a module application.- deriving (Typeable)+ deriving (Typeable, Data, Show) -- | A decoration of 'Agda.Syntax.Abstract.Name.QName'. data AbstractName = AbsName@@ -251,7 +255,7 @@ , anameLineage :: WhyInScope -- ^ Explanation where this name came from. }- deriving (Typeable)+ deriving (Typeable, Data, Show) -- | A decoration of abstract syntax module names. data AbstractModule = AbsModule@@ -260,7 +264,7 @@ , amodLineage :: WhyInScope -- ^ Explanation where this name came from. }- deriving (Typeable)+ deriving (Typeable, Data, Show) instance Eq AbstractName where (==) = (==) `on` anameName@@ -285,7 +289,7 @@ -- * Operations on name and module maps. mergeNames :: Eq a => ThingsInScope a -> ThingsInScope a -> ThingsInScope a-mergeNames = Map.unionWith union+mergeNames = Map.unionWith List.union ------------------------------------------------------------------------ -- * Operations on name spaces@@ -339,7 +343,7 @@ , scopeParents = [] , scopeNameSpaces = [ (nsid, emptyNameSpace) | nsid <- [minBound..maxBound] ] , scopeImports = Map.empty- , scopeDatatypeModule = False+ , scopeDatatypeModule = Nothing } -- | The empty scope info.@@ -348,7 +352,7 @@ { scopeCurrent = noModuleName , scopeModules = Map.singleton noModuleName emptyScope , scopeLocals = []- , scopePrecedence = TopCtx+ , scopePrecedence = [] , scopeInverseName = Map.empty , scopeInverseModule = Map.empty , scopeInScope = Set.empty@@ -405,11 +409,14 @@ (NameSpaceId -> InScopeSet -> InScopeSet -> InScopeSet ) -> Scope -> Scope -> Scope zipScope fd fm fs s1 s2 =- s1 { scopeNameSpaces = [ (nsid, zipNS nsid ns1 ns2)- | ((nsid, ns1), (nsid', ns2)) <- zipWith' (,) (scopeNameSpaces s1) (scopeNameSpaces s2)- , assert (nsid == nsid')- ]- , scopeImports = Map.union (scopeImports s1) (scopeImports s2)+ s1 { scopeNameSpaces =+ [ (nsid, zipNS nsid ns1 ns2)+ | ((nsid, ns1), (nsid', ns2)) <-+ fromMaybe __IMPOSSIBLE__ $+ zipWith' (,) (scopeNameSpaces s1) (scopeNameSpaces s2)+ , assert (nsid == nsid')+ ]+ , scopeImports = Map.union (scopeImports s1) (scopeImports s2) } where assert True = True@@ -714,7 +721,9 @@ scopeLookup q scope = map fst $ scopeLookup' q scope scopeLookup' :: forall a. InScope a => C.QName -> ScopeInfo -> [(a, Access)]-scopeLookup' q scope = nubBy ((==) `on` fst) $ findName q root ++ maybeToList topImports ++ imports+scopeLookup' q scope =+ List.nubBy ((==) `on` fst) $+ findName q root ++ maybeToList topImports ++ imports where -- 1. Finding a name in the current scope and its parents.@@ -824,7 +833,7 @@ len (C.Qual _ x) = 1 + len x best :: [C.QName] -> [C.QName]- best = sortBy (compare `on` len)+ best = List.sortBy (compare `on` len) unique :: forall a . [a] -> Bool unique [] = __IMPOSSIBLE__@@ -922,58 +931,56 @@ -- * (Debug) printing ------------------------------------------------------------------------ -instance Show AbstractName where- show = show . anameName+instance Pretty AbstractName where+ pretty = pretty . anameName -instance Show AbstractModule where- show = show . amodName+instance Pretty AbstractModule where+ pretty = pretty . amodName -instance Show NameSpaceId where- show nsid = case nsid of+instance Pretty NameSpaceId where+ pretty = text . \case PublicNS -> "public" PrivateNS -> "private" ImportedNS -> "imported" OnlyQualifiedNS -> "only-qualified" -instance Show NameSpace where- show (NameSpace names mods _) =- unlines $- blockOfLines "names" (map pr $ Map.toList names) ++- blockOfLines "modules" (map pr $ Map.toList mods)- where- pr :: (Show a, Show b) => (a,b) -> String- pr (x, y) = show x ++ " --> " ++ show y+instance Pretty NameSpace where+ pretty = vcat . prettyNameSpace -instance Show Scope where- show (scope@Scope{ scopeName = name, scopeParents = parents, scopeImports = imps }) =- unlines $- [ "scope " ++ show name ] ++ ind (- concat [ blockOfLines (show nsid) (lines $ show $ scopeNameSpace nsid scope)+prettyNameSpace :: NameSpace -> [Doc]+prettyNameSpace (NameSpace names mods _) =+ blockOfLines (text "names") (map pr $ Map.toList names) +++ blockOfLines (text "modules") (map pr $ Map.toList mods)+ where+ pr :: (Pretty a, Pretty b) => (a,b) -> Doc+ pr (x, y) = pretty x <+> text "-->" <+> pretty y++instance Pretty Scope where+ pretty (scope@Scope{ scopeName = name, scopeParents = parents, scopeImports = imps }) =+ vcat $+ [ text "scope" <+> pretty name ] ++ ind (+ concat [ blockOfLines (pretty nsid) $ prettyNameSpace $ scopeNameSpace nsid scope | nsid <- [minBound..maxBound] ]- ++ blockOfLines "imports" (case Map.keys imps of- [] -> []- ks -> [ show ks ]- )+ ++ blockOfLines (text "imports")+ (case Map.keys imps of [] -> []; ks -> [ prettyList ks ]) )- where ind = map (" " ++)+ where ind = map $ nest 2 -- | Add first string only if list is non-empty.-blockOfLines :: String -> [String] -> [String]+blockOfLines :: Doc -> [Doc] -> [Doc] blockOfLines _ [] = []-blockOfLines hd ss = hd : map (" " ++) ss+blockOfLines hd ss = hd : map (nest 2) ss -instance Show ScopeInfo where- show (ScopeInfo this mods locals ctx _ _ _) =- unlines $- [ "ScopeInfo"- , " current = " ++ show this- ] ++- (if null locals then [] else [ " locals = " ++ show locals ]) ++- [ " context = " ++ show ctx- , " modules"- ] ++ map (" "++) (relines . map show $ Map.elems mods)- where- relines = filter (not . null) . lines . unlines+instance Pretty ScopeInfo where+ pretty (ScopeInfo this mods locals ctx _ _ _) = vcat $+ [ text "ScopeInfo"+ , text " current = " <> pretty this+ ] +++ (if null locals then [] else [ text " locals = " <> pretty locals ]) +++ [ text " context = " <> pretty ctx+ , text " modules"+ ] +++ map (nest 4) (List.filter (not . null) $ map pretty $ Map.elems mods) ------------------------------------------------------------------------ -- * Boring instances
src/full/Agda/Syntax/Scope/Monad.hs view
@@ -13,7 +13,7 @@ import Control.Monad.Writer hiding (mapM, forM) import Control.Monad.State hiding (mapM, forM) -import Data.List as List+import qualified Data.List as List import Data.Map (Map) import qualified Data.Map as Map import Data.Maybe@@ -31,6 +31,7 @@ import Agda.Syntax.Scope.Base import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.State import Agda.TypeChecking.Monad.Options @@ -55,10 +56,9 @@ -- * Errors -isDatatypeModule :: A.ModuleName -> ScopeM Bool+isDatatypeModule :: A.ModuleName -> ScopeM (Maybe DataOrRecord) isDatatypeModule m = do- sc <- getScope- return $ maybe __IMPOSSIBLE__ scopeDatatypeModule (Map.lookup m (scopeModules sc))+ scopeDatatypeModule . Map.findWithDefault __IMPOSSIBLE__ m . scopeModules <$> getScope -- * General operations @@ -90,14 +90,15 @@ case Map.lookup m (scopeModules scope) of Just s -> return s Nothing -> do- reportSLn "" 0 $ "ERROR: In scope\n" ++ show scope ++ "\nNO SUCH SCOPE " ++ show m+ reportSLn "" 0 $ "ERROR: In scope\n" ++ prettyShow scope ++ "\nNO SUCH SCOPE " ++ prettyShow m __IMPOSSIBLE__ getCurrentScope :: ScopeM Scope getCurrentScope = getNamedScope =<< getCurrentModule --- | Create a new module with an empty scope (Bool is True if it is a datatype module)-createModule :: Bool -> A.ModuleName -> ScopeM ()+-- | Create a new module with an empty scope.+-- (@Just@ if it is a datatype or record module.)+createModule :: Maybe DataOrRecord -> A.ModuleName -> ScopeM () createModule b m = do reportSLn "scope.createModule" 10 $ "createModule " ++ prettyShow m s <- getCurrentScope@@ -139,18 +140,17 @@ modifyCurrentNameSpace acc f = modifyCurrentScope $ updateScopeNameSpaces $ AssocList.updateAt acc f -setContextPrecedence :: Precedence -> ScopeM ()-setContextPrecedence p = modifyScope_ $ \s -> s { scopePrecedence = p }+pushContextPrecedence :: Precedence -> ScopeM ()+pushContextPrecedence p = modifyScope_ $ \ s -> s { scopePrecedence = pushPrecedence p $ scopePrecedence s } -getContextPrecedence :: ScopeM Precedence-getContextPrecedence = scopePrecedence <$> getScope+popContextPrecedence :: ScopeM ()+popContextPrecedence = modifyScope_ $ \ s -> s { scopePrecedence = drop 1 $ scopePrecedence s } withContextPrecedence :: Precedence -> ScopeM a -> ScopeM a withContextPrecedence p m = do- p' <- getContextPrecedence- setContextPrecedence p+ pushContextPrecedence p x <- m- setContextPrecedence p'+ popContextPrecedence return x getLocalVars :: ScopeM LocalVars@@ -201,15 +201,37 @@ -- * Resolving names data ResolvedName- = VarName A.Name- | DefinedName Access AbstractName- | FieldName [AbstractName]- -- ^ record fields names need to be distinguished to parse copatterns- | ConstructorName [AbstractName]- | PatternSynResName AbstractName- | UnknownName+ = -- | Local variable bound by λ, Π, module telescope, pattern, @let@.+ VarName+ { resolvedVar :: A.Name+ , resolvedLetBound :: Bool -- ^ Variable bound by @let@?+ }++ | -- | Function, data/record type, postulate.+ DefinedName Access AbstractName++ | -- | Record field name. Needs to be distinguished to parse copatterns.+ FieldName [AbstractName]++ | -- | Data or record constructor name.+ ConstructorName [AbstractName]++ | -- | Name of pattern synonym.+ PatternSynResName AbstractName++ | -- | Unbound name.+ UnknownName deriving (Show, Eq) +instance Pretty ResolvedName where+ pretty = \case+ VarName x _ -> text "variable" <+> pretty x+ DefinedName a x -> pretty a <+> pretty x+ FieldName xs -> text "field" <+> pretty xs+ ConstructorName xs -> text "constructor" <+> pretty xs+ PatternSynResName x -> text "pattern" <+> pretty x+ UnknownName -> text "<unknown name>"+ -- | Look up the abstract name referred to by a given concrete name. resolveName :: C.QName -> ScopeM ResolvedName resolveName = resolveName' allKindsOfNames Nothing@@ -225,16 +247,16 @@ resolveName' kinds names x = do scope <- getScope let vars = AssocList.mapKeysMonotonic C.QName $ scopeLocals scope- retVar y = return $ VarName $ y { nameConcrete = unqualify x }+ retVar y = return . VarName y{ nameConcrete = unqualify x } aName = A.qnameName . anameName case lookup x vars of -- Case: we have a local variable x.- Just (LocalVar y) -> retVar y+ Just (LocalVar y b []) -> retVar y b -- Case: ... but is (perhaps) shadowed by some imports.- Just (ShadowedVar y ys) -> case names of+ Just (LocalVar y b ys) -> case names of Nothing -> shadowed ys- Just ns -> case filter (\y -> aName y `Set.member` ns) ys of- [] -> retVar y+ Just ns -> case filter (\ y -> aName y `Set.member` ns) ys of+ [] -> retVar y b ys -> shadowed ys where shadowed ys =@@ -272,7 +294,7 @@ resolveModule x = do ms <- scopeLookup x <$> getScope case ms of- [AbsModule m why] -> return $ AbsModule (m `withRangesOfQ` x) why+ [AbsModule m why] -> return $ AbsModule (m `withRangeOf` x) why [] -> typeError $ NoSuchModule x ms -> typeError $ AmbiguousModule x (map amodName ms) @@ -285,7 +307,7 @@ getNotation x ns = do r <- resolveName' allKindsOfNames (Just ns) x case r of- VarName y -> return $ namesToNotation x y+ VarName y _ -> return $ namesToNotation x y DefinedName _ d -> return $ notation d FieldName ds -> return $ oneNotation ds ConstructorName ds -> return $ oneNotation ds@@ -300,9 +322,13 @@ -- * Binding names --- | Bind a variable. The abstract name is supplied as the second argument.-bindVariable :: C.Name -> A.Name -> ScopeM ()-bindVariable x y = modifyScope_ $ updateScopeLocals $ AssocList.insert x $ LocalVar y+-- | Bind a variable.+bindVariable+ :: Bool -- ^ Let-bound variable?+ -> C.Name -- ^ Concrete name.+ -> A.Name -- ^ Abstract name.+ -> ScopeM ()+bindVariable b x y = modifyScope_ $ updateScopeLocals $ AssocList.insert x $ LocalVar y b [] -- | Bind a defined name. Must not shadow anything. bindName :: Access -> KindOfName -> C.Name -> A.QName -> ScopeM ()@@ -314,7 +340,7 @@ UnknownName | isNoName x -> success DefinedName{} | isNoName x -> success <* modifyCurrentScope (removeNameFromScope PrivateNS x) DefinedName _ d -> clash $ anameName d- VarName z -> clash $ A.qualify (mnameFromList []) z+ VarName z _ -> clash $ A.qualify (mnameFromList []) z FieldName ds -> ambiguous FldName ds ConstructorName ds -> ambiguous ConName ds PatternSynResName n -> clash $ anameName n@@ -380,8 +406,8 @@ where copy :: A.ModuleName -> Scope -> WSM Scope copy new s = do- lift $ reportSLn "scope.copy" 20 $ "Copying scope " ++ show old ++ " to " ++ show new- lift $ reportSLn "scope.copy" 50 $ show s+ lift $ reportSLn "scope.copy" 20 $ "Copying scope " ++ prettyShow old ++ " to " ++ prettyShow new+ lift $ reportSLn "scope.copy" 50 $ prettyShow s s0 <- lift $ getNamedScope new -- Delete private names, then copy names and modules. Recompute inScope -- set rather than trying to copy it.@@ -454,7 +480,7 @@ -- For now, we just set their range -- to the new module name's one, which fixes issue 1619. y <- setRange rnew . A.qualify m <$> refresh (qnameName x)- lift $ reportSLn "scope.copy" 50 $ " Copying " ++ show x ++ " to " ++ show y+ lift $ reportSLn "scope.copy" 50 $ " Copying " ++ prettyShow x ++ " to " ++ prettyShow y addName x y return y @@ -491,9 +517,9 @@ -- Andreas, Jesper, 2015-07-02: Issue 1597 -- Don't copy a module over itself, it will just be emptied of its contents. if (x == y) then return x else do- lift $ reportSLn "scope.copy" 50 $ " Copying module " ++ show x ++ " to " ++ show y+ lift $ reportSLn "scope.copy" 50 $ " Copying module " ++ prettyShow x ++ " to " ++ prettyShow y addMod x y rec- lift $ createModule False y+ lift $ createModule Nothing y -- We need to copy the contents of included modules recursively (only when 'rec') when rec $ copyRec x y return y@@ -522,7 +548,7 @@ -- Check for duplicate imports in a single import directive. -- @dup@ : To be imported names that are mentioned more than once.- let dup = targetNames \\ nub targetNames+ let dup = targetNames List.\\ List.nub targetNames unless (null dup) $ typeError $ DuplicateImports m dup -- Apply the import directive.@@ -565,7 +591,7 @@ (Using xs, ys) -> do let uselessHiding = [ x | x@ImportedName{} <- ys ] ++ [ x | x@(ImportedModule y) <- ys, ImportedName y `notElem` names ]- unless (null uselessHiding) $ typeError $ GenericError $ "Hiding " ++ intercalate ", " (map show uselessHiding)+ unless (null uselessHiding) $ typeError $ GenericError $ "Hiding " ++ List.intercalate ", " (map prettyShow uselessHiding) ++ " has no effect" return dir{ hiding = [] } _ -> return dir@@ -605,7 +631,7 @@ doesntExport = do -- Names @xs@ mentioned in the import directive @dir@ but not in the @scope@. let xs = filter doesntExist names- reportSLn "scope.import.apply" 20 $ "non existing names: " ++ show xs+ reportSLn "scope.import.apply" 20 $ "non existing names: " ++ prettyShow xs typeError $ ModuleDoesntExport m xs doesntExist (ImportedName x) = isNothing $ Map.lookup x namesInScope@@ -679,7 +705,7 @@ locals <- mapMaybe (\ (c,x) -> c <$ notShadowedLocal x) <$> getLocalVars let newdefs = Map.keys $ nsNames ns shadowed = List.intersect locals newdefs- reportSLn "scope.locals" 10 $ "opening module shadows the following locals vars: " ++ show shadowed+ reportSLn "scope.locals" 10 $ "opening module shadows the following locals vars: " ++ prettyShow shadowed -- Andreas, 2014-09-03, issue 1266: shadow local variables by imported defs. modifyLocalVars $ AssocList.mapWithKey $ \ c x -> case Map.lookup c $ nsNames ns of
src/full/Agda/Syntax/Translation/AbstractToConcrete.hs view
@@ -27,6 +27,7 @@ import Control.Applicative hiding (empty) import Control.Monad.Reader+import Control.Monad.State import qualified Data.Map as Map import Data.Maybe@@ -41,6 +42,7 @@ import Agda.Syntax.Literal import Agda.Syntax.Info import Agda.Syntax.Internal (MetaId(..))+import qualified Agda.Syntax.Internal as I import Agda.Syntax.Fixity import Agda.Syntax.Concrete as C import Agda.Syntax.Abstract as A@@ -48,11 +50,13 @@ import Agda.Syntax.Scope.Base import Agda.TypeChecking.Monad.State (getScope)-import Agda.TypeChecking.Monad.Base (TCM, NamedMeta(..))+import Agda.TypeChecking.Monad.Base (TCM, NamedMeta(..), stBuiltinThings, BuiltinThings, Builtin(..))+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.Options import qualified Agda.Utils.AssocList as AssocList import Agda.Utils.Either+import Agda.Utils.Function import Agda.Utils.Functor import Agda.Utils.Maybe import Agda.Utils.Monad@@ -70,10 +74,11 @@ , currentScope :: ScopeInfo } -defaultEnv :: Env-defaultEnv = Env { takenNames = Set.empty- , currentScope = emptyScopeInfo- }+-- -- UNUSED+-- defaultEnv :: Env+-- defaultEnv = Env { takenNames = Set.empty+-- , currentScope = emptyScopeInfo+-- } makeEnv :: ScopeInfo -> Env makeEnv scope = Env { takenNames = Set.union vars defs@@ -83,12 +88,17 @@ vars = Set.fromList $ map fst $ scopeLocals scope defs = Map.keysSet $ nsNames $ everythingInScope scope -currentPrecedence :: AbsToCon Precedence+currentPrecedence :: AbsToCon PrecedenceStack currentPrecedence = asks $ scopePrecedence . currentScope +withPrecedence' :: PrecedenceStack -> AbsToCon a -> AbsToCon a+withPrecedence' ps = local $ \e ->+ e { currentScope = (currentScope e) { scopePrecedence = ps } }+ withPrecedence :: Precedence -> AbsToCon a -> AbsToCon a-withPrecedence p = local $ \e ->- e { currentScope = (currentScope e) { scopePrecedence = p } }+withPrecedence p ret = do+ ps <- currentPrecedence+ withPrecedence' (pushPrecedence p ps) ret withScope :: ScopeInfo -> AbsToCon a -> AbsToCon a withScope scope = local $ \e -> e { currentScope = scope }@@ -96,6 +106,14 @@ noTakenNames :: AbsToCon a -> AbsToCon a noTakenNames = local $ \e -> e { takenNames = Set.empty } +-- | Bind a concrete name to an abstract in the translation environment.+addBinding :: C.Name -> A.Name -> Env -> Env+addBinding y x e =+ e { takenNames = Set.insert y $ takenNames e+ , currentScope = (`updateScopeLocals` currentScope e) $+ AssocList.insert y (LocalVar x __IMPOSSIBLE__ [])+ }+ -- The Monad -------------------------------------------------------------- -- | We put the translation into TCM in order to print debug messages.@@ -110,10 +128,7 @@ abstractToConcreteEnv flags a = runReaderT (toConcrete a) flags abstractToConcreteCtx :: ToConcrete a c => Precedence -> a -> TCM c-abstractToConcreteCtx ctx x = do- scope <- getScope- let scope' = scope { scopePrecedence = ctx }- abstractToConcreteEnv (makeEnv scope') x+abstractToConcreteCtx ctx x = runAbsToCon $ withPrecedence ctx (toConcrete x) abstractToConcrete_ :: ToConcrete a c => a -> TCM c abstractToConcrete_ = runAbsToCon . toConcrete@@ -140,7 +155,7 @@ lookupQName ambCon x = do ys <- inverseScopeLookupName' ambCon x <$> asks currentScope lift $ reportSLn "scope.inverse" 100 $- "inverse looking up abstract name " ++ show x ++ " yields " ++ show ys+ "inverse looking up abstract name " ++ prettyShow x ++ " yields " ++ prettyShow ys case ys of (y : _) -> return y [] -> do@@ -165,25 +180,30 @@ [] -> return $ mnameToConcrete x -- this is what happens for names that are not in scope (private names) +-- | Add a abstract name to the scope and produce an available concrete version of it. bindName :: A.Name -> (C.Name -> AbsToCon a) -> AbsToCon a bindName x ret = do- names <- asks takenNames let y = nameConcrete x- case (Set.member y names) of- _ | isNoName y -> ret y- True -> bindName (nextName x) ret- False ->- local (\e -> e { takenNames = Set.insert y $ takenNames e- , currentScope = (`updateScopeLocals` currentScope e) $- AssocList.insert y (LocalVar x)- }- ) $ ret y+ if isNoName y then ret y else do+ names <- asks takenNames+ let loop x = do+ let y = nameConcrete x+ if y `Set.member` names then loop $ nextName x+ else local (addBinding y x) $ ret y+ loop x ++-- | Like 'bindName', but do not care whether name is already taken.+bindName' :: A.Name -> AbsToCon a -> AbsToCon a+bindName' x = applyUnless (isNoName y) $ local $ addBinding y x+ where y = nameConcrete x++ -- Dealing with precedences ----------------------------------------------- -- | General bracketing function. bracket' :: (e -> e) -- ^ the bracketing function- -> (Precedence -> Bool) -- ^ Should we bracket things+ -> (PrecedenceStack -> Bool) -- ^ Should we bracket things -- which have the given -- precedence? -> e -> AbsToCon e@@ -192,20 +212,20 @@ return $ if needParen p then paren e else e -- | Expression bracketing-bracket :: (Precedence -> Bool) -> AbsToCon C.Expr -> AbsToCon C.Expr+bracket :: (PrecedenceStack -> Bool) -> AbsToCon C.Expr -> AbsToCon C.Expr bracket par m = do e <- m bracket' (Paren (getRange e)) par e -- | Pattern bracketing-bracketP_ :: (Precedence -> Bool) -> AbsToCon C.Pattern -> AbsToCon C.Pattern+bracketP_ :: (PrecedenceStack -> Bool) -> AbsToCon C.Pattern -> AbsToCon C.Pattern bracketP_ par m = do e <- m bracket' (ParenP (getRange e)) par e {- UNUSED -- | Pattern bracketing-bracketP :: (Precedence -> Bool) -> (C.Pattern -> AbsToCon a)+bracketP :: (PrecedenceStack -> Bool) -> (C.Pattern -> AbsToCon a) -> ((C.Pattern -> AbsToCon a) -> AbsToCon a) -> AbsToCon a bracketP par ret m = m $ \p -> do@@ -213,6 +233,17 @@ ret p -} +-- | Applications where the argument is a lambda without parentheses need+-- parens more often than other applications.+isParenlessLambda :: NamedArg A.Expr -> Bool+isParenlessLambda e | notVisible e = False+isParenlessLambda e =+ case unScope $ namedArg e of+ A.Lam i _ _ -> not $ lamParens i+ A.AbsurdLam i _ -> not $ lamParens i+ A.ExtendedLam i _ _ _ -> not $ lamParens i+ _ -> False+ -- Dealing with infix declarations ---------------------------------------- -- | If a name is defined with a fixity that differs from the default, we have@@ -255,6 +286,9 @@ toConcrete :: a -> AbsToCon c bindToConcrete :: a -> (c -> AbsToCon b) -> AbsToCon b + -- Christian Sattler, 2017-08-05:+ -- These default implementations are not valid semantically (at least+ -- the second one). Perhaps they (it) should be removed. toConcrete x = bindToConcrete x return bindToConcrete x ret = ret =<< toConcrete x @@ -278,23 +312,33 @@ toConcreteHiding :: (LensHiding h, ToConcrete a c) => h -> a -> AbsToCon c toConcreteHiding h = case getHiding h of- NotHidden -> toConcrete- Hidden -> toConcreteTop- Instance -> toConcreteTop+ NotHidden -> toConcrete+ Hidden -> toConcreteTop+ Instance{} -> toConcreteTop -- | Translate something in a context indicated by 'Hiding' info. bindToConcreteHiding :: (LensHiding h, ToConcrete a c) => h -> a -> (c -> AbsToCon b) -> AbsToCon b bindToConcreteHiding h = case getHiding h of- NotHidden -> bindToConcrete- Hidden -> bindToConcreteTop- Instance -> bindToConcreteTop+ NotHidden -> bindToConcrete+ Hidden -> bindToConcreteTop+ Instance{} -> bindToConcreteTop -- General instances ------------------------------------------------------ instance ToConcrete a c => ToConcrete [a] [c] where toConcrete = mapM toConcrete- bindToConcrete = thread bindToConcrete+ -- Andreas, 2017-04-11, Issue #2543+ -- The naive `thread'ing does not work as we have to undo+ -- changes to the Precedence.+ -- bindToConcrete = thread bindToConcrete+ bindToConcrete [] ret = ret []+ bindToConcrete (a:as) ret = do+ p <- currentPrecedence -- save precedence+ bindToConcrete a $ \ c ->+ withPrecedence' p $ -- reset precedence+ bindToConcrete as $ \ cs ->+ ret (c : cs) instance (ToConcrete a1 c1, ToConcrete a2 c2) => ToConcrete (Either a1 a2) (Either c1 c2) where toConcrete = traverseEither toConcrete toConcrete@@ -391,8 +435,9 @@ toConcrete e@(A.App i e1 e2) = tryToRecoverOpApp e+ $ tryToRecoverNatural e -- or fallback to App- $ bracket appBrackets+ $ bracket (appBrackets' $ isParenlessLambda e2) $ do e1' <- toConcreteCtx FunctionCtx e1 e2' <- toConcreteCtx ArgumentCtx e2 return $ C.App (getRange i) e1' e2'@@ -404,9 +449,10 @@ return $ C.WithApp (getRange i) e es toConcrete (A.AbsurdLam i h) =- bracket lamBrackets $ return $ C.AbsurdLam (getRange i) h+ bracket (lamBrackets' $ lamParens i) $ return $ C.AbsurdLam (getRange i) h toConcrete e@(A.Lam i _ _) =- bracket lamBrackets+ tryToRecoverOpApp e -- recover sections+ $ bracket (lamBrackets' $ lamParens i) $ case lamView e of (bs, e) -> bindToConcrete (map makeDomainFree bs) $ \bs -> do@@ -425,12 +471,12 @@ _ -> ([b], e) lamView e = ([], e) toConcrete (A.ExtendedLam i di qname cs) =- bracket lamBrackets $ do+ bracket (lamBrackets' $ lamParens i) $ do decls <- concat <$> toConcrete cs let namedPat np = case getHiding np of- NotHidden -> namedArg np- Hidden -> C.HiddenP noRange (unArg np)- Instance -> C.InstanceP noRange (unArg np)+ NotHidden -> namedArg np+ Hidden -> C.HiddenP noRange (unArg np)+ Instance{} -> C.InstanceP noRange (unArg np) -- we know all lhs are of the form `.extlam p1 p2 ... pn`, -- with the name .extlam leftmost. It is our mission to remove it. let removeApp (C.RawAppP r (_:es)) = return $ C.RawAppP r es@@ -473,9 +519,9 @@ _ -> e addDot a e = C.Dot (getRange a) e mkArg (Arg info e) = case getHiding info of- Hidden -> HiddenArg (getRange e) (unnamed e)- Instance -> InstanceArg (getRange e) (unnamed e)- NotHidden -> e+ Hidden -> HiddenArg (getRange e) (unnamed e)+ Instance{} -> InstanceArg (getRange e) (unnamed e)+ NotHidden -> e toConcrete (A.Set i 0) = return $ C.Set (getRange i) toConcrete (A.Set i n) = return $ C.SetN (getRange i) n@@ -531,9 +577,18 @@ _ -> b makeDomainFree b = b +-- Christian Sattler, 2017-08-05, fixing #2669+-- Both methods of ToConcrete (FieldAssignment' a) (FieldAssignment' c) need+-- to be implemented, each in terms of the corresponding one of ToConcrete a c.+-- This mirrors the instance ToConcrete (Arg a) (Arg c).+-- The default implementations of ToConcrete are not valid semantically. instance ToConcrete a c => ToConcrete (FieldAssignment' a) (FieldAssignment' c) where toConcrete = traverse toConcrete + bindToConcrete (FieldAssignment name a) ret =+ bindToConcrete a $ ret . FieldAssignment name++ -- Binder instances ------------------------------------------------------- instance ToConcrete A.LamBinding [C.LamBinding] where@@ -547,7 +602,7 @@ where recoverLabels :: Arg A.TypedBinding -> Arg C.TypedBinding -> [Arg C.TypedBinding] recoverLabels b cb- | getHiding b == NotHidden = [cb] -- We don't care about labels for explicit args+ | visible b = [cb] -- We don't care about labels for explicit args | otherwise = traverse (recover (unArg b)) cb recover (A.TBind _ xs _) (C.TBind r ys e) = tbind r e (zipWith label xs ys)@@ -577,7 +632,7 @@ bindToConcrete (LetBind i info x t e) ret = bindToConcrete x $ \x -> do (t,(e, [], [], [])) <- toConcrete (t, A.RHS e Nothing)- ret $ addInstanceB (getHiding info == Instance) $+ ret $ addInstanceB (isInstance info) $ [ C.TypeSig info x t , C.FunClause (C.LHS (C.IdentP $ C.QName x) [] [] []) e C.NoWhere False@@ -591,14 +646,14 @@ x' <- unqualify <$> toConcrete x modapp <- toConcrete modapp let r = getRange modapp- open = maybe DontOpen id $ minfoOpenShort i- dir = maybe defaultImportDir{ importDirRange = r } id $ minfoDirective i+ open = fromMaybe DontOpen $ minfoOpenShort i+ dir = fromMaybe defaultImportDir{ importDirRange = r } $ minfoDirective i -- This is no use since toAbstract LetDefs is in localToAbstract. local (openModule' x dir id) $ ret [ C.ModuleMacro (getRange i) x' modapp open dir ] bindToConcrete (LetOpen i x _) ret = do x' <- toConcrete x- let dir = maybe defaultImportDir id $ minfoDirective i+ let dir = fromMaybe defaultImportDir $ minfoDirective i local (openModule' x dir restrictPrivate) $ ret [ C.Open (getRange i) x' dir ] bindToConcrete (LetDeclaredVariable _) ret =@@ -652,7 +707,7 @@ toConcrete A.AbsurdRHS = return (C.AbsurdRHS, [], [], []) toConcrete (A.WithRHS _ es cs) = do es <- toConcrete es- cs <- concat <$> toConcrete cs+ cs <- noTakenNames $ concat <$> toConcrete cs return (C.AbsurdRHS, [], es, cs) toConcrete (A.RewriteRHS xeqs rhs wh) = do wh <- declsToConcrete wh@@ -679,7 +734,7 @@ toConcrete (Constr d) = head <$> toConcrete d instance ToConcrete a C.LHS => ToConcrete (A.Clause' a) [C.Declaration] where- toConcrete (A.Clause lhs _ rhs wh catchall) =+ toConcrete (A.Clause lhs _ _ rhs wh catchall) = bindToConcrete lhs $ \lhs -> case lhs of C.LHS p wps _ _ -> do@@ -780,8 +835,8 @@ toConcrete (A.Import i x _) = do x <- toConcrete x- let open = maybe DontOpen id $ minfoOpenShort i- dir = maybe defaultImportDir id $ minfoDirective i+ let open = fromMaybe DontOpen $ minfoOpenShort i+ dir = fromMaybe defaultImportDir $ minfoDirective i return [ C.Import (getRange i) x Nothing open dir] toConcrete (A.Pragma i p) = do@@ -824,18 +879,15 @@ A.CompiledDataPragma x hs hcs -> do x <- toConcrete x return $ C.CompiledDataPragma r x hs hcs- A.CompiledDeclareDataPragma x hs -> do- x <- toConcrete x- return $ C.CompiledDeclareDataPragma r x hs A.CompiledPragma x hs -> do x <- toConcrete x return $ C.CompiledPragma r x hs+ A.CompilePragma b x s -> do+ x <- toConcrete x+ return $ C.CompilePragma r b x s A.CompiledExportPragma x hs -> do x <- toConcrete x return $ C.CompiledExportPragma r x hs- A.CompiledEpicPragma x e -> do- x <- toConcrete x- return $ C.CompiledEpicPragma r x e A.CompiledJSPragma x e -> do x <- toConcrete x return $ C.CompiledJSPragma r x e@@ -846,7 +898,9 @@ x <- toConcrete x return $ C.CompiledDataUHCPragma r x crd crcs A.StaticPragma x -> C.StaticPragma r <$> toConcrete x+ A.InjectivePragma x -> C.InjectivePragma r <$> toConcrete x A.InlinePragma x -> C.InlinePragma r <$> toConcrete x+ A.EtaPragma x -> C.EtaPragma r <$> toConcrete x A.DisplayPragma f ps rhs -> C.DisplayPragma r <$> toConcrete (A.DefP (PatRange noRange) (AmbQ [f]) ps) <*> toConcrete rhs @@ -864,18 +918,82 @@ instance ToConcrete A.LHSCore C.Pattern where bindToConcrete = bindToConcrete . lhsCoreToPattern -appBrackets' :: [arg] -> Precedence -> Bool-appBrackets' [] _ = False-appBrackets' (_:_) ctx = appBrackets ctx+appBracketsArgs :: [arg] -> PrecedenceStack -> Bool+appBracketsArgs [] _ = False+appBracketsArgs (_:_) ctx = appBrackets ctx +-- Auxiliary wrappers for processing the bindings in patterns in the right order.+newtype UserPattern a = UserPattern a+newtype SplitPattern a = SplitPattern a newtype BindingPattern = BindingPat A.Pattern newtype FreshName = FreshenName A.Name instance ToConcrete FreshName A.Name where bindToConcrete (FreshenName x) ret = bindToConcrete x $ \ y -> ret x{ nameConcrete = y } --- Takes care of freshening and binding pattern variables, but doesn't actually+-- Pass 1: (Issue #2729)+-- Takes care of binding the originally user-written pattern variables, but doesn't actually -- translate anything to Concrete.+instance ToConcrete (UserPattern A.Pattern) A.Pattern where+ bindToConcrete (UserPattern p) ret =+ case p of+ A.VarP x -> bindName' x $ ret $ A.VarP x+ A.WildP{} -> ret p+ A.ProjP{} -> ret p+ A.AbsurdP{} -> ret p+ A.LitP{} -> ret p+ A.DotP{} -> ret p+ -- Andreas, 2017-09-03, issue #2729:+ -- Do not go into patterns generated by case-split here!+ -- They are treated in a second pass.+ A.ConP i c args+ | patOrigin i == ConOSplit -> ret p+ | otherwise -> bindToConcrete (map UserPattern args) $ ret . A.ConP i c+ A.DefP i f args -> bindToConcrete (map UserPattern args) $ ret . A.DefP i f+ A.PatternSynP i f args -> bindToConcrete (map UserPattern args) $ ret . A.PatternSynP i f+ A.RecP i args -> bindToConcrete ((map . fmap) UserPattern args) $ ret . A.RecP i+ A.AsP i x p -> bindName' x $+ bindToConcrete (UserPattern p) $ \ p ->+ ret (A.AsP i x p)++instance ToConcrete (UserPattern (NamedArg A.Pattern)) (NamedArg A.Pattern) where+ bindToConcrete (UserPattern np) ret =+ case getOrigin np of+ CaseSplit -> ret np+ _ -> bindToConcrete (fmap (fmap UserPattern) np) ret++-- Pass 2a: locate case-split pattern. Don't bind anything!+instance ToConcrete (SplitPattern A.Pattern) A.Pattern where+ bindToConcrete (SplitPattern p) ret =+ case p of+ A.VarP x -> ret p+ A.WildP{} -> ret p+ A.ProjP{} -> ret p+ A.AbsurdP{} -> ret p+ A.LitP{} -> ret p+ A.DotP{} -> ret p+ -- Andreas, 2017-09-03, issue #2729:+ -- For patterns generated by case-split here, switch to freshening & binding.+ A.ConP i c args+ | patOrigin i == ConOSplit+ -> bindToConcrete ((map . fmap . fmap) BindingPat args) $ ret . A.ConP i c+ | otherwise -> bindToConcrete (map SplitPattern args) $ ret . A.ConP i c+ A.DefP i f args -> bindToConcrete (map SplitPattern args) $ ret . A.DefP i f+ A.PatternSynP i f args -> bindToConcrete (map SplitPattern args) $ ret . A.PatternSynP i f+ A.RecP i args -> bindToConcrete ((map . fmap) SplitPattern args) $ ret . A.RecP i+ A.AsP i x p -> bindToConcrete (SplitPattern p) $ \ p ->+ ret (A.AsP i x p)++instance ToConcrete (SplitPattern (NamedArg A.Pattern)) (NamedArg A.Pattern) where+ bindToConcrete (SplitPattern np) ret =+ case getOrigin np of+ CaseSplit -> bindToConcrete (fmap (fmap BindingPat ) np) ret+ _ -> bindToConcrete (fmap (fmap SplitPattern) np) ret+++-- Pass 2b:+-- Takes care of freshening and binding pattern variables introduced by case split.+-- Still does not translate anything to Concrete. instance ToConcrete BindingPattern A.Pattern where bindToConcrete (BindingPat p) ret = case p of@@ -896,7 +1014,9 @@ instance ToConcrete A.Pattern C.Pattern where bindToConcrete p ret = do prec <- currentPrecedence- bindToConcrete (BindingPat p) (ret <=< withPrecedence prec . toConcrete)+ bindToConcrete (UserPattern p) $ \ p -> do+ bindToConcrete (SplitPattern p) $ \ p -> do+ ret =<< do withPrecedence' prec $ toConcrete p toConcrete p = case p of A.VarP x ->@@ -957,7 +1077,7 @@ Just c -> applyTo args2 c Nothing -> applyTo args . C.IdentP =<< toConcrete x -- Note: applyTo [] c = return c- applyTo args c = bracketP_ (appBrackets' args) $ do+ applyTo args c = bracketP_ (appBracketsArgs args) $ do foldl C.AppP c <$> toConcreteCtx ArgumentCtx args @@ -965,46 +1085,112 @@ data Hd = HdVar A.Name | HdCon A.QName | HdDef A.QName -cOpApp :: Range -> C.QName -> A.Name -> [C.Expr] -> C.Expr+cOpApp :: Range -> C.QName -> A.Name -> [Maybe C.Expr] -> C.Expr cOpApp r x n es = C.OpApp r x (Set.singleton n)- (map (defaultNamedArg . noPlaceholder . Ordinary) es)+ (map (defaultNamedArg . placeholder) eps)+ where+ x0 = C.unqualify x+ positions | isPrefix x0 = [ Middle | _ <- drop 1 es ] ++ [End]+ | isPostfix x0 = [Beginning] ++ [ Middle | _ <- drop 1 es ]+ | isInfix x0 = [Beginning] ++ [ Middle | _ <- drop 2 es ] ++ [End]+ | otherwise = [ Middle | _ <- es ]+ eps = zip es positions+ placeholder (Nothing, pos) = Placeholder pos+ placeholder (Just e, _) = noPlaceholder (Ordinary e) +tryToRecoverNatural :: A.Expr -> AbsToCon C.Expr -> AbsToCon C.Expr+tryToRecoverNatural e def = do+ builtins <- stBuiltinThings <$> lift get+ let reified = do+ zero <- getAQName "ZERO" builtins+ suc <- getAQName "SUC" builtins+ explore zero suc 0 e+ case reified of+ Just n -> return $ C.Lit $ LitNat noRange n+ Nothing -> def+ where++ getAQName :: String -> BuiltinThings a -> Maybe A.QName+ getAQName str bs = do+ Builtin (I.Con hd _ _) <- Map.lookup str bs+ return $ I.conName hd++ explore :: A.QName -> A.QName -> Integer -> A.Expr -> Maybe Integer+ explore z s k (A.App _ (A.Con (AmbQ [f])) t) | f == s =+ let v = 1+k in v `seq` explore z s v $ namedArg t+ explore z s k (A.Con (AmbQ [x])) | x == z = Just k+ explore z s k (A.Lit (LitNat _ l)) = Just (k + l)+ explore _ _ _ _ = Nothing+ tryToRecoverOpApp :: A.Expr -> AbsToCon C.Expr -> AbsToCon C.Expr-tryToRecoverOpApp e def = caseMaybeM (recoverOpApp bracket cOpApp view e) def return+tryToRecoverOpApp e def = caseMaybeM (recoverOpApp bracket (isParenlessLambda . defaultNamedArg) cOpApp view e) def return where- view e = do- let Application hd args = AV.appView e- case hd of- Var x -> Just (HdVar x, args)- Def f -> Just (HdDef f, args)- Con (AmbQ (c:_)) -> Just (HdCon c, args)- Con (AmbQ []) -> __IMPOSSIBLE__- _ -> Nothing+ view e+ -- Do we have a series of inserted lambdas?+ | Just xs@(_:_) <- traverse insertedName bs =+ (,) <$> getHead hd <*> sectionArgs xs args+ where+ LamView bs body = AV.lamView e+ Application hd args = AV.appView body + -- Only inserted domain-free visible lambdas come from sections.+ insertedName (i, A.DomainFree ai x)+ | getOrigin i == Inserted && visible ai = Just x+ insertedName _ = Nothing++ -- Build section arguments. Need to check that:+ -- lambda bound variables appear in the right order and only as+ -- top-level arguments.+ sectionArgs :: [A.Name] -> [NamedArg A.Expr] -> Maybe [NamedArg (Maybe A.Expr)]+ sectionArgs xs = go xs+ where+ noXs = getAll . foldExpr (\ case A.Var x -> All (notElem x xs)+ _ -> All True)+ go [] [] = return []+ go (y : ys) (arg : args)+ | visible arg+ , A.Var y' <- namedArg arg+ , y == y' = (fmap (Nothing <$) arg :) <$> go ys args+ go ys (arg : args)+ | visible arg, noXs arg = ((fmap . fmap) Just arg :) <$> go ys args+ go _ _ = Nothing++ view e = (, (map . fmap . fmap) Just args) <$> getHead hd+ where Application hd args = AV.appView e++ getHead (Var x) = Just (HdVar x)+ getHead (Def f) = Just (HdDef f)+ getHead (Con (AmbQ (c : _))) = Just (HdCon c)+ getHead (Con (AmbQ [])) = __IMPOSSIBLE__+ getHead _ = Nothing+ tryToRecoverOpAppP :: A.Pattern -> AbsToCon (Maybe C.Pattern)-tryToRecoverOpAppP = recoverOpApp bracketP_ opApp view+tryToRecoverOpAppP = recoverOpApp bracketP_ (const False) opApp view where opApp r x n ps =- C.OpAppP r x (Set.singleton n) (map defaultNamedArg ps)+ C.OpAppP r x (Set.singleton n) (map (defaultNamedArg . fromjust) ps)+ fromjust (Just x) = x+ fromjust Nothing = __IMPOSSIBLE__ -- `view` does not generate any `Nothing`s view p = case p of- ConP _ (AmbQ (c:_)) ps -> Just (HdCon c, ps)- DefP _ (AmbQ (f:_)) ps -> Just (HdDef f, ps)+ ConP _ (AmbQ (c:_)) ps -> Just (HdCon c, (map . fmap . fmap) Just ps)+ DefP _ (AmbQ (f:_)) ps -> Just (HdDef f, (map . fmap . fmap) Just ps) _ -> __IMPOSSIBLE__ -- ProjP _ _ (AmbQ (d:_)) -> Just (HdDef d, []) -- ? Andreas, 2016-04-21 -- _ -> Nothing recoverOpApp :: (ToConcrete a c, HasRange c)- => ((Precedence -> Bool) -> AbsToCon c -> AbsToCon c)- -> (Range -> C.QName -> A.Name -> [c] -> c)- -> (a -> Maybe (Hd, [NamedArg a]))+ => ((PrecedenceStack -> Bool) -> AbsToCon c -> AbsToCon c)+ -> (a -> Bool) -- ^ Check for parenless lambdas+ -> (Range -> C.QName -> A.Name -> [Maybe c] -> c)+ -> (a -> Maybe (Hd, [NamedArg (Maybe a)])) -- ^ `Nothing` for sections -> a -> AbsToCon (Maybe c)-recoverOpApp bracket opApp view e = case view e of+recoverOpApp bracket isParenlessLam opApp view e = case view e of Nothing -> mDefault Just (hd, args)- | all notHidden args -> do+ | all visible args -> do let args' = map namedArg args case hd of HdVar n@@ -1036,11 +1222,11 @@ as' = case as of as@(_ : _ : _) -> init $ tail as _ -> __IMPOSSIBLE__- e1 <- toConcreteCtx (LeftOperandCtx fixity) a1- es <- mapM (toConcreteCtx InsideOperandCtx) as'- en <- toConcreteCtx (RightOperandCtx fixity) an Just <$> do- bracket (opBrackets fixity) $+ bracket (opBrackets' (maybe False isParenlessLam an) fixity) $ do+ e1 <- traverse (toConcreteCtx $ LeftOperandCtx fixity) a1+ es <- (mapM . traverse) (toConcreteCtx InsideOperandCtx) as'+ en <- traverse (toConcreteCtx $ RightOperandCtx fixity) an return $ opApp (getRange (e1, en)) x n ([e1] ++ es ++ [en]) -- prefix@@ -1050,10 +1236,10 @@ as' = case as of as@(_ : _) -> init as _ -> __IMPOSSIBLE__- es <- mapM (toConcreteCtx InsideOperandCtx) as'- en <- toConcreteCtx (RightOperandCtx fixity) an Just <$> do- bracket (opBrackets fixity) $+ bracket (opBrackets' (maybe False isParenlessLam an) fixity) $ do+ es <- (mapM . traverse) (toConcreteCtx InsideOperandCtx) as'+ en <- traverse (toConcreteCtx $ RightOperandCtx fixity) an return $ opApp (getRange (n, en)) x n (es ++ [en]) -- postfix@@ -1061,15 +1247,15 @@ | Hole <- head xs = do let a1 = head as as' = tail as- e1 <- toConcreteCtx (LeftOperandCtx fixity) a1- es <- mapM (toConcreteCtx InsideOperandCtx) as'+ e1 <- traverse (toConcreteCtx $ LeftOperandCtx fixity) a1+ es <- (mapM . traverse) (toConcreteCtx InsideOperandCtx) as' Just <$> do bracket (opBrackets fixity) $ return $ opApp (getRange (e1, n)) x n ([e1] ++ es) -- roundfix doQName _ x n as xs = do- es <- mapM (toConcreteCtx InsideOperandCtx) as+ es <- (mapM . traverse) (toConcreteCtx InsideOperandCtx) as Just <$> do bracket roundFixBrackets $ return $ opApp (getRange x) x n es@@ -1082,3 +1268,4 @@ instance ToConcrete NamedMeta C.Expr where toConcrete i = do return $ C.Underscore noRange (Just $ prettyShow i)+
src/full/Agda/Syntax/Translation/ConcreteToAbstract.hs view
@@ -1,6 +1,5 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE UndecidableInstances #-} #if __GLASGOW_HASKELL__ <= 708 {-# LANGUAGE OverlappingInstances #-}@@ -42,6 +41,7 @@ import Agda.Syntax.Concrete.Generic import Agda.Syntax.Concrete.Operators import Agda.Syntax.Abstract as A+import Agda.Syntax.Abstract.Pattern ( patternVars ) import Agda.Syntax.Abstract.Pretty import qualified Agda.Syntax.Internal as I import Agda.Syntax.Position@@ -62,17 +62,20 @@ import Agda.TypeChecking.Monad.Trace (traceCall, setCurrentRange) import Agda.TypeChecking.Monad.State import Agda.TypeChecking.Monad.MetaVars (registerInteractionPoint)+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.Options import Agda.TypeChecking.Monad.Env (insideDotPattern, isInsideDotPattern) import Agda.TypeChecking.Rules.Builtin (isUntypedBuiltin, bindUntypedBuiltin) import Agda.TypeChecking.Patterns.Abstract (expandPatternSynonyms) import Agda.TypeChecking.Pretty hiding (pretty, prettyA)+import Agda.TypeChecking.Warnings import Agda.Interaction.FindFile (checkModuleName) -- import Agda.Interaction.Imports -- for type-checking in ghci import {-# SOURCE #-} Agda.Interaction.Imports (scopeCheckImport) import Agda.Interaction.Options+import qualified Agda.Interaction.Options.Lenses as Lens import Agda.Utils.Either import Agda.Utils.Except ( MonadError(catchError, throwError) )@@ -115,7 +118,7 @@ printLocals :: Int -> String -> ScopeM () printLocals v s = verboseS "scope.top" v $ do locals <- getLocalVars- reportSLn "scope.top" v $ s ++ " " ++ show locals+ reportSLn "scope.top" v $ s ++ " " ++ prettyShow locals {-------------------------------------------------------------------------- Helpers@@ -142,55 +145,9 @@ unlessNull (duplicates $ map nameConcrete $ patternVars ps) $ \ ys -> do typeError $ RepeatedVariablesInPattern ys -class PatternVars a where- patternVars :: a -> [A.Name]--instance PatternVars a => PatternVars [a] where- patternVars = concatMap patternVars--instance PatternVars a => PatternVars (Arg a) where- patternVars = patternVars . unArg--instance PatternVars a => PatternVars (Named n a) where- patternVars = patternVars . namedThing--instance PatternVars a => PatternVars (C.FieldAssignment' a) where- patternVars = patternVars . (^. exprFieldA)--instance PatternVars (A.Pattern' e) where- patternVars p = case p of- A.VarP x -> [x]- A.ConP _ _ args -> patternVars args- A.ProjP _ _ _ -> []- A.WildP _ -> []- A.AsP _ x p -> x : patternVars p- A.DotP _ _ _ -> []- A.AbsurdP _ -> []- A.LitP _ -> []- A.DefP _ _ args -> patternVars args- -- Projection pattern, @args@ should be empty unless we have- -- indexed records.- A.PatternSynP _ _ args -> patternVars args- A.RecP _ fs -> patternVars fs-- -- | Make sure that there are no dot patterns (called on pattern synonyms). noDotPattern :: String -> A.Pattern' e -> ScopeM (A.Pattern' Void)-noDotPattern err = dot- where- dot :: A.Pattern' e -> ScopeM (A.Pattern' Void)- dot p = case p of- A.VarP x -> pure $ A.VarP x- A.ConP i c args -> A.ConP i c <$> (traverse $ traverse $ traverse dot) args- A.ProjP i o d -> pure $ A.ProjP i o d- A.WildP i -> pure $ A.WildP i- A.AsP i x p -> A.AsP i x <$> dot p- A.DotP{} -> typeError $ GenericError err- A.AbsurdP i -> pure $ A.AbsurdP i- A.LitP l -> pure $ A.LitP l- A.DefP i f args -> A.DefP i f <$> (traverse $ traverse $ traverse dot) args- A.PatternSynP i c args -> A.PatternSynP i c <$> (traverse $ traverse $ traverse dot) args- A.RecP i fs -> A.RecP i <$> (traverse $ traverse dot) fs+noDotPattern err = traverse $ const $ typeError $ GenericError err -- | Compute the type of the record constructor (with bogus target type) recordConstructorType :: [NiceDeclaration] -> ScopeM C.Expr@@ -226,7 +183,7 @@ C.NiceMutual _ _ _ [ C.FunSig _ _ _ _ _instanc macro _info _ _ _- , C.FunDef _ _ _ abstract _ _+ , C.FunDef _ _ _ abstract _ _ _ [ C.Clause _top _catchall (C.LHS _p [] [] []) (C.RHS _rhs) NoWhere [] ] ] | abstract /= AbstractDef && macro /= MacroDef -> -- TODO: this is still too generous, we also need to check that _p@@ -297,7 +254,7 @@ -- Set the current scope to @s'@ modifyCurrentScope $ const s' printScope "mod.inst" 20 "copied source module"- reportSLn "scope.mod.inst" 30 $ show (pretty copyInfo)+ reportSDoc "scope.mod.inst" 30 $ return $ pretty copyInfo let amodapp = A.SectionApp tel' m1 args' reportSDoc "scope.decl" 70 $ vcat $ [ text $ "scope checked ModuleApplication " ++ prettyShow x@@ -389,9 +346,9 @@ [ text $ "scope checked ModuleMacro " ++ prettyShow x ] reportSLn "scope.decl" 90 $ "info = " ++ show info- reportSLn "scope.decl" 90 $ "m = " ++ show m+ reportSLn "scope.decl" 90 $ "m = " ++ prettyShow m reportSLn "scope.decl" 90 $ "modapp' = " ++ show modapp'- reportSLn "scope.decl" 90 $ show $ pretty copyInfo+ reportSDoc "scope.decl" 90 $ return $ pretty copyInfo reportSDoc "scope.decl" 70 $ vcat $ map (nest 2 . prettyA) adecls return adecls@@ -423,12 +380,21 @@ :: Range -> C.QName -> C.ImportDirective -- ^ Arguments of 'NiceOpen' -> ScopeM (ModuleInfo, A.ModuleName, A.ImportDirective) -- ^ Arguments of 'A.Open' checkOpen r x dir = do- reportSDoc "scope.decl" 70 $ vcat $- [ text $ "scope checking NiceOpen " ++ prettyShow x- ]+ reportSDoc "scope.decl" 70 $ do+ cm <- getCurrentModule+ vcat $+ [ text "scope checking NiceOpen " <> return (pretty x)+ , text " getCurrentModule = " <> prettyA cm+ , text $ " getCurrentModule (raw) = " ++ show cm+ , text $ " C.ImportDirective = " ++ prettyShow dir+ ]+ -- Andreas, 2017-01-01, issue #2377: warn about useless `public`+ when (publicOpen dir) $ do+ whenM ((A.noModuleName ==) <$> getCurrentModule) $ do+ warning $ UselessPublic m <- toAbstract (OldModuleName x)- printScope "open" 20 $ "opening " ++ show x+ printScope "open" 20 $ "opening " ++ prettyShow x adir <- openModule_ x dir printScope "open" 20 $ "result:" let minfo = ModuleInfo@@ -473,9 +439,9 @@ setContextCPS :: Precedence -> (a -> ScopeM b) -> ((a -> ScopeM b) -> ScopeM b) -> ScopeM b-setContextCPS p ret f = do- p' <- getContextPrecedence- withContextPrecedence p $ f $ withContextPrecedence p' . ret+setContextCPS p ret f =+ withContextPrecedence p $ f $+ bracket_ popContextPrecedence (\ _ -> pushContextPrecedence p) . ret localToAbstractCtx :: ToAbstract concrete abstract => Precedence -> concrete -> (abstract -> ScopeM a) -> ScopeM a@@ -518,7 +484,11 @@ -- Names ------------------------------------------------------------------ -newtype NewName a = NewName a+data NewName a = NewName+ { newLetBound :: Bool -- bound by a @let@?+ , newName :: a+ }+ data OldQName = OldQName C.QName (Maybe (Set A.Name)) -- ^ If a set is given, then the first name must correspond to one -- of the names in the set.@@ -528,23 +498,23 @@ -- of the names in the set. instance ToAbstract (NewName C.Name) A.Name where- toAbstract (NewName x) = do+ toAbstract (NewName b x) = do y <- freshAbstractName_ x- bindVariable x y+ bindVariable b x y return y instance ToAbstract (NewName C.BoundName) A.Name where- toAbstract (NewName BName{ boundName = x, bnameFixity = fx }) = do+ toAbstract (NewName b BName{ boundName = x, bnameFixity = fx }) = do y <- freshAbstractName fx x- bindVariable x y+ bindVariable b x y return y instance ToAbstract OldQName A.Expr where toAbstract (OldQName x ns) = do qx <- resolveName' allKindsOfNames ns x- reportSLn "scope.name" 10 $ "resolved " ++ show x ++ ": " ++ show qx+ reportSLn "scope.name" 10 $ "resolved " ++ prettyShow x ++ ": " ++ prettyShow qx case qx of- VarName x' -> return $ A.Var x'+ VarName x' _ -> return $ A.Var x' DefinedName _ d -> return $ nameExpr d FieldName ds -> return $ A.Proj ProjPrefix $ AmbQ (map anameName ds) ConstructorName ds -> return $ A.Con $ AmbQ (map anameName ds)@@ -557,13 +527,13 @@ instance ToAbstract PatName APatName where toAbstract (PatName x ns) = do- reportSLn "scope.pat" 10 $ "checking pattern name: " ++ show x+ reportSLn "scope.pat" 10 $ "checking pattern name: " ++ prettyShow x rx <- resolveName' [ConName, PatternSynName] ns x -- Andreas, 2013-03-21 ignore conflicting names which cannot -- be meant since we are in a pattern z <- case (rx, x) of -- TODO: warn about shadowing- (VarName y, C.QName x) -> return $ Left x -- typeError $ RepeatedVariableInPattern y x+ (VarName y _, C.QName x) -> return $ Left x -- typeError $ RepeatedVariableInPattern y x (FieldName d, C.QName x) -> return $ Left x (DefinedName _ d, C.QName x) | DefName == anameKind d -> return $ Left x (UnknownName, C.QName x) -> return $ Left x@@ -572,15 +542,15 @@ _ -> genericError $ "Cannot pattern match on non-constructor " ++ prettyShow x case z of Left x -> do- reportSLn "scope.pat" 10 $ "it was a var: " ++ show x- p <- VarPatName <$> toAbstract (NewName x)+ reportSLn "scope.pat" 10 $ "it was a var: " ++ prettyShow x+ p <- VarPatName <$> toAbstract (NewName False x) printLocals 10 "bound it:" return p Right (Left ds) -> do- reportSLn "scope.pat" 10 $ "it was a con: " ++ show (map anameName ds)+ reportSLn "scope.pat" 10 $ "it was a con: " ++ prettyShow (map anameName ds) return $ ConPatName ds Right (Right d) -> do- reportSLn "scope.pat" 10 $ "it was a pat syn: " ++ show (anameName d)+ reportSLn "scope.pat" 10 $ "it was a pat syn: " ++ prettyShow (anameName d) return $ PatternSynPatName d class ToQName a where@@ -601,7 +571,7 @@ FieldName (d:_) -> return $ anameName d FieldName [] -> __IMPOSSIBLE__ PatternSynResName d -> return $ anameName d- VarName x -> typeError $ GenericError $ "Not a defined name: " ++ show x+ VarName x _ -> typeError $ GenericError $ "Not a defined name: " ++ prettyShow x UnknownName -> notInScope (toQName x) newtype NewModuleName = NewModuleName C.Name@@ -615,7 +585,8 @@ checkForModuleClash x = do ms <- scopeLookup (C.QName x) <$> getScope unless (null ms) $ do- reportSLn "scope.clash" 20 $ "clashing modules ms = " ++ show ms+ reportSLn "scope.clash" 20 $ "clashing modules ms = " ++ prettyShow ms+ reportSLn "scope.clash" 60 $ "clashing modules ms = " ++ show ms setCurrentRange x $ typeError $ ShadowedModule x $ map ((`withRangeOf` x) . amodName) ms@@ -625,7 +596,7 @@ checkForModuleClash x m <- getCurrentModule y <- freshQModule m x- createModule False y+ createModule Nothing y return y instance ToAbstract NewModuleQName A.ModuleName where@@ -633,7 +604,7 @@ where toAbs m (C.QName x) = do y <- freshQModule m x- createModule False y+ createModule Nothing y return y toAbs m (C.Qual x q) = do m' <- freshQModule m x@@ -647,14 +618,14 @@ -- | Peel off 'C.HiddenArg' and represent it as an 'NamedArg'. mkNamedArg :: C.Expr -> NamedArg C.Expr-mkNamedArg (C.HiddenArg _ e) = Arg (setHiding Hidden defaultArgInfo) e-mkNamedArg (C.InstanceArg _ e) = Arg (setHiding Instance defaultArgInfo) e+mkNamedArg (C.HiddenArg _ e) = Arg (hide defaultArgInfo) e+mkNamedArg (C.InstanceArg _ e) = Arg (makeInstance defaultArgInfo) e mkNamedArg e = Arg defaultArgInfo $ unnamed e -- | Peel off 'C.HiddenArg' and represent it as an 'Arg', throwing away any name. mkArg' :: ArgInfo -> C.Expr -> Arg C.Expr-mkArg' info (C.HiddenArg _ e) = Arg (setHiding Hidden info) $ namedThing e-mkArg' info (C.InstanceArg _ e) = Arg (setHiding Instance info) $ namedThing e+mkArg' info (C.HiddenArg _ e) = Arg (hide info) $ namedThing e+mkArg' info (C.InstanceArg _ e) = Arg (makeInstance info) $ namedThing e mkArg' info e = Arg (setHiding NotHidden info) e -- | By default, arguments are @Relevant@.@@ -692,9 +663,11 @@ e <- toAbstractCtx ctx e -- We have at least one binder. Get first @b@ and rest @bs@. caseList bs __IMPOSSIBLE__ $ \ b bs -> do- return $ A.Lam (ExprRange r) b $ foldr mkLam e bs+ return $ A.Lam (setOrigin UserWritten $ (defaultLamInfo r) { lamParens = False }) b $ foldr mkLam e bs where- mkLam b e = A.Lam (ExprRange $ fuseRange b e) b e+ -- We set the origin of the outer lambda to `UserWritten` and the origin of+ -- the inner lambdas to `Inserted`.+ mkLam b e = A.Lam (defaultLamInfo $ fuseRange b e) b e -- | Scope check extended lambda expression. scopeCheckExtendedLam :: Range -> [(C.LHS, C.RHS, WhereClause, Bool)] -> ScopeM A.Expr@@ -705,18 +678,18 @@ -- Find an unused name for the extended lambda definition. cname <- nextlamname r 0 extendedLambdaName name <- freshAbstractName_ cname- reportSLn "scope.extendedLambda" 10 $ "new extended lambda name: " ++ show name+ reportSLn "scope.extendedLambda" 10 $ "new extended lambda name: " ++ prettyShow name qname <- qualifyName_ name bindName (PrivateAccess Inserted) DefName cname qname - -- Compose a function definition an scope check it.+ -- Compose a function definition and scope check it. a <- aModeToDef <$> asks envAbstractMode let insertApp (C.RawAppP r es) = C.RawAppP r $ IdentP (C.QName cname) : es insertApp (C.IdentP q ) = C.RawAppP r $ IdentP (C.QName cname) : [C.IdentP q] where r = getRange q insertApp _ = __IMPOSSIBLE__- d = C.FunDef r [] noFixity' {-'-} a __IMPOSSIBLE__ cname $+ d = C.FunDef r [] noFixity' {-'-} a NotInstanceDef __IMPOSSIBLE__ cname $ for cs $ \ (lhs, rhs, wh, ca) -> -- wh == NoWhere, see parser for more info C.Clause cname ca (mapLhsOriginalPattern insertApp lhs) rhs wh [] scdef <- toAbstract d@@ -725,7 +698,7 @@ case scdef of A.ScopedDecl si [A.FunDef di qname' NotDelayed cs] -> do setScope si -- This turns into an A.ScopedExpr si $ A.ExtendedLam...- return $ A.ExtendedLam (ExprRange r) di qname' cs+ return $ A.ExtendedLam (setOrigin UserWritten $ (defaultLamInfo r) { lamParens = False }) di qname' cs _ -> __IMPOSSIBLE__ where@@ -738,8 +711,6 @@ UnknownName -> return cname _ -> nextlamname r (i+1) s -- instance ToAbstract C.Expr A.Expr where toAbstract e = traceCall (ScopeCheckExpr e) $ annotateExpr $ case e of@@ -748,24 +719,30 @@ Ident x -> toAbstract (OldQName x Nothing) -- Literals- C.Lit l@(LitNat r n) -> do- let builtin | n < 0 = Just <$> primFromNeg -- negative literals are only allowed if FROMNEG is defined- | otherwise = getBuiltin' builtinFromNat- l' = LitNat r (abs n)- info = ExprRange r- conv <- builtin- case conv of- Just (I.Def q _) -> return $ A.App info (A.Def q) $ defaultNamedArg (A.Lit l')- _ -> return $ A.Lit l+ C.Lit l ->+ case l of+ LitNat r n -> do+ let builtin | n < 0 = Just <$> primFromNeg -- negative literals are only allowed if FROMNEG is defined+ | otherwise = ensureInScope =<< getBuiltin' builtinFromNat+ l' = LitNat r (abs n)+ info = ExprRange r+ conv <- builtin+ case conv of+ Just (I.Def q _) -> return $ A.App info (A.Def q) $ defaultNamedArg (A.Lit l')+ _ -> return $ A.Lit l - C.Lit l@(LitString r s) -> do- conv <- getBuiltin' builtinFromString- let info = ExprRange r- case conv of- Just (I.Def q _) -> return $ A.App info (A.Def q) $ defaultNamedArg (A.Lit l)- _ -> return $ A.Lit l+ LitString r s -> do+ conv <- ensureInScope =<< getBuiltin' builtinFromString+ let info = ExprRange r+ case conv of+ Just (I.Def q _) -> return $ A.App info (A.Def q) $ defaultNamedArg (A.Lit l)+ _ -> return $ A.Lit l - C.Lit l -> return $ A.Lit l+ _ -> return $ A.Lit l+ where+ ensureInScope :: Maybe I.Term -> ScopeM (Maybe I.Term)+ ensureInScope v@(Just (I.Def q _)) = ifM (isNameInScope q <$> getScope) (return v) (return Nothing)+ ensureInScope _ = return Nothing -- Meta variables C.QuestionMark r n -> do@@ -813,7 +790,7 @@ C.InstanceArg _ _ -> nothingAppliedToInstanceArg e -- Lambda- C.AbsurdLam r h -> return $ A.AbsurdLam (ExprRange r) h+ C.AbsurdLam r h -> return $ A.AbsurdLam (setOrigin UserWritten $ (defaultLamInfo r) { lamParens = False }) h C.Lam r bs e -> toAbstractLam r bs e TopCtx @@ -860,7 +837,14 @@ A.RecUpdate (ExprRange r) <$> toAbstract e <*> toAbstractCtx TopCtx fs -- Parenthesis- C.Paren _ e -> toAbstractCtx TopCtx e+ C.Paren _ e -> setLamParens <$> toAbstractCtx TopCtx e+ where+ setP i = i { lamParens = True }+ setLamParens (A.Lam i bs e) = A.Lam (setP i) bs e+ setLamParens (A.AbsurdLam i h) = A.AbsurdLam (setP i) h+ setLamParens (A.ExtendedLam i def q cs) = A.ExtendedLam (setP i) def q cs+ setLamParens (A.ScopedExpr s e) = A.ScopedExpr s (setLamParens e)+ setLamParens e = e -- Idiom brackets C.IdiomBrackets r e ->@@ -879,7 +863,7 @@ -- Quoting C.QuoteGoal _ x e -> do- x' <- toAbstract (NewName x)+ x' <- toAbstract (NewName False x) e' <- toAbstract e return $ A.QuoteGoal (ExprRange $ getRange e) x' e' C.QuoteContext r -> return $ A.QuoteContext (ExprRange r)@@ -912,7 +896,7 @@ toAbstract = traverse toAbstract instance ToAbstract C.LamBinding A.LamBinding where- toAbstract (C.DomainFree info x) = A.DomainFree info <$> toAbstract (NewName x)+ toAbstract (C.DomainFree info x) = A.DomainFree info <$> toAbstract (NewName False x) toAbstract (C.DomainFull tb) = A.DomainFull <$> toAbstract tb makeDomainFull :: C.LamBinding -> C.TypedBindings@@ -927,7 +911,7 @@ instance ToAbstract C.TypedBinding A.TypedBinding where toAbstract (C.TBind r xs t) = do t' <- toAbstractCtx TopCtx t- xs' <- toAbstract $ map (fmap NewName) xs+ xs' <- toAbstract $ map (fmap (NewName False)) xs return $ A.TBind r xs' t' toAbstract (C.TLet r ds) = A.TLet r <$> toAbstract (LetDefs ds) @@ -1049,7 +1033,7 @@ -> ScopeM [A.Declaration] -- ^ The code for checking the module contents. -> ScopeM (ScopeInfo, [A.Declaration]) scopeCheckModule r x qm tel checkDs = do- printScope "module" 20 $ "checking module " ++ show x+ printScope "module" 20 $ "checking module " ++ prettyShow x -- Andreas, 2013-12-10: Telescope does not live in the new module -- but its parent, so check it before entering the new module. -- This is important for Nicolas Pouillard's open parametrized modules@@ -1059,13 +1043,13 @@ withCurrentModule qm $ do -- pushScope m -- qm <- getCurrentModule- printScope "module" 20 $ "inside module " ++ show x+ printScope "module" 20 $ "inside module " ++ prettyShow x ds <- checkDs scope <- getScope return (scope, [ A.Section info (qm `withRangesOfQ` x) tel ds ]) -- Binding is done by the caller- printScope "module" 20 $ "after module " ++ show x+ printScope "module" 20 $ "after module " ++ prettyShow x return res where info = ModuleInfo r noRange Nothing Nothing Nothing@@ -1111,7 +1095,26 @@ (outsideDecls, [ C.Module r m0 tel insideDecls ]) -> do -- If the module name is _ compute the name from the file path m <- if isNoName m0- then return $ C.QName $ C.Name noRange [Id $ stringToRawName $ rootNameModule file]+ then do+ -- Andreas, 2017-07-28, issue #1077+ -- Check if the insideDecls end in a single module which has the same+ -- name as the file. In this case, it is highly likely that the user+ -- put some non-allowed declarations before the top-level module in error.+ case flip span insideDecls $ \case { C.Module{} -> False; _ -> True } of+ (ds0, [ C.Module _ m1 _ _ ])+ | C.toTopLevelModuleName m1 == expectedMName+ -- If the anonymous module comes from the user,+ -- the range cannot be the beginningOfFile.+ -- That is the range if the parser inserted the anon. module.+ , r == beginningOfFile (getRange insideDecls) -> do++ traceCall (SetRange $ getRange ds0) $ typeError $ GenericError $+ "Illegal declaration(s) before top-level module"++ -- Otherwise, reconstruct the top-level module name+ _ -> return $ C.QName $ C.Name (getRange m0)+ [Id $ stringToRawName $ rootNameModule file]+ -- Andreas, 2017-05-17, issue #2574, keep name as jump target! -- Andreas, 2016-07-12, ALTERNATIVE: -- -- We assign an anonymous file module the name expected from -- -- its import. For flat file structures, this is the same.@@ -1144,9 +1147,12 @@ -- | runs Syntax.Concrete.Definitions.niceDeclarations on main module niceDecls :: [C.Declaration] -> ScopeM [NiceDeclaration]-niceDecls ds = case runNice $ niceDeclarations ds of- Left e -> throwError $ Exception (getRange e) $ pretty e- Right ds -> return ds+niceDecls ds = do+ let (result, warns) = runNice $ niceDeclarations ds+ unless (null warns) $ setCurrentRange ds $ warning $ NicifierIssue warns+ case result of+ Left e -> throwError $ Exception (getRange e) $ pretty e+ Right ds -> return ds #if __GLASGOW_HASKELL__ >= 710 instance {-# OVERLAPPING #-} ToAbstract [C.Declaration] [A.Declaration] where@@ -1157,7 +1163,7 @@ -- When --safe is active the termination checker (Issue 586) and -- positivity checker (Issue 1614) may not be switched off, and -- polarities may not be assigned.- ds <- ifM (optSafe <$> commandLineOptions)+ ds <- ifM (Lens.getSafeMode <$> commandLineOptions) (mapM (noNoTermCheck >=> noNoPositivityCheck >=> noPolarity) ds) (return ds) toAbstract =<< niceDecls ds@@ -1166,20 +1172,21 @@ -- @NoTerminationCheck@ because the @NO_TERMINATION_CHECK@ pragma -- was removed. See Issue 1763. noNoTermCheck :: C.Declaration -> TCM C.Declaration- noNoTermCheck (C.Pragma (C.TerminationCheckPragma r NonTerminating)) =- typeError $ SafeFlagNonTerminating- noNoTermCheck (C.Pragma (C.TerminationCheckPragma r Terminating)) =- typeError $ SafeFlagTerminating+ noNoTermCheck d@(C.Pragma (C.TerminationCheckPragma r NonTerminating)) =+ d <$ (setCurrentRange d $ warning SafeFlagNonTerminating)+ noNoTermCheck d@(C.Pragma (C.TerminationCheckPragma r Terminating)) =+ d <$ (setCurrentRange d $ warning SafeFlagTerminating) noNoTermCheck d = return d noNoPositivityCheck :: C.Declaration -> TCM C.Declaration- noNoPositivityCheck (C.Pragma (C.NoPositivityCheckPragma _)) =- typeError $ SafeFlagNoPositivityCheck+ noNoPositivityCheck d@(C.Pragma (C.NoPositivityCheckPragma _)) =+ d <$ (setCurrentRange d $ warning SafeFlagNoPositivityCheck) noNoPositivityCheck d = return d noPolarity :: C.Declaration -> TCM C.Declaration- noPolarity (C.Pragma C.PolarityPragma{}) = typeError SafeFlagPolarity- noPolarity d = return d+ noPolarity d@(C.Pragma C.PolarityPragma{}) =+ d <$ (setCurrentRange d $ warning SafeFlagPolarity)+ noPolarity d = return d newtype LetDefs = LetDefs [C.Declaration] newtype LetDef = LetDef NiceDeclaration@@ -1191,16 +1198,16 @@ instance ToAbstract LetDef [A.LetBinding] where toAbstract (LetDef d) = case d of- NiceMutual _ _ _ d@[C.FunSig _ fx _ _ instanc macro info _ x t, C.FunDef _ _ _ abstract _ _ [cl]] ->+ NiceMutual _ _ _ d@[C.FunSig _ fx _ _ instanc macro info _ x t, C.FunDef _ _ _ abstract _ _ _ [cl]] -> do when (abstract == AbstractDef) $ do genericError $ "abstract not allowed in let expressions" when (macro == MacroDef) $ do genericError $ "Macros cannot be defined in a let expression." (x', e) <- letToAbstract cl t <- toAbstract t- x <- toAbstract (NewName $ mkBoundName x fx)+ x <- toAbstract (NewName True $ mkBoundName x fx) -- If InstanceDef set info to Instance- let info' | instanc == InstanceDef = setHiding Instance info+ let info' | instanc == InstanceDef = makeInstance info | otherwise = info -- There are sometimes two instances of the -- let-bound variable, one declaration and one@@ -1230,7 +1237,7 @@ Nothing -> throwError err Just x -> toAbstract $ LetDef $ NiceMutual r termCheck True [ C.FunSig r noFixity' PublicAccess ConcreteDef NotInstanceDef NotMacroDef defaultArgInfo termCheck x (C.Underscore (getRange x) Nothing)- , C.FunDef r __IMPOSSIBLE__ __IMPOSSIBLE__ ConcreteDef __IMPOSSIBLE__ __IMPOSSIBLE__+ , C.FunDef r __IMPOSSIBLE__ __IMPOSSIBLE__ ConcreteDef NotInstanceDef __IMPOSSIBLE__ __IMPOSSIBLE__ [C.Clause x (ca || catchall) lhs (C.RHS rhs) NoWhere []] ] where@@ -1252,7 +1259,8 @@ definedName C.OpAppP{} = __IMPOSSIBLE__ -- You can't open public in a let- NiceOpen r x dirs | not (publicOpen dirs) -> do+ NiceOpen r x dirs -> do+ when (publicOpen dirs) $ warning UselessPublic m <- toAbstract (OldModuleName x) adir <- openModule_ x dirs let minfo = ModuleInfo@@ -1264,7 +1272,8 @@ } return [A.LetOpen minfo m adir] - NiceModuleMacro r p x modapp open dir | not (publicOpen dir) ->+ NiceModuleMacro r p x modapp open dir -> do+ when (publicOpen dir) $ warning UselessPublic -- Andreas, 2014-10-09, Issue 1299: module macros in lets need -- to be private checkModuleMacro LetApply r (PrivateAccess Inserted) x modapp open dir@@ -1292,12 +1301,12 @@ lambda e (Arg info (Named Nothing (A.VarP x))) = return $ A.Lam i (A.DomainFree info x) e where- i = ExprRange (fuseRange x e)+ i = defaultLamInfo (fuseRange x e) lambda e (Arg info (Named Nothing (A.WildP i))) = do x <- freshNoName (getRange i) return $ A.Lam i' (A.DomainFree info x) e where- i' = ExprRange (fuseRange i e)+ i' = defaultLamInfo (fuseRange i e) lambda _ _ = notAValidLetBinding d newtype Blind a = Blind { unBlind :: a }@@ -1322,7 +1331,7 @@ C.Axiom r f p a i rel _ x t -> do -- check that we do not postulate in --safe mode clo <- commandLineOptions- when (optSafe clo) (typeError (SafeFlagPostulate x))+ when (Lens.getSafeMode clo) (warning $ SafeFlagPostulate x) -- check the postulate toAbstractNiceAxiom A.NoFunSig NotMacroDef d @@ -1343,8 +1352,6 @@ -- this ensures that projections out of irrelevant fields cannot occur -- Ulf: unless you turn on --irrelevant-projections bindName p FldName x y- when (getHiding t /= Instance && argInfoOverlappable (argInfo t)) $- genericError "The 'overlap' keyword only applies to instance fields (fields marked with {{ }})" return [ A.Field (mkDefInfoInstance x f p a i NotMacroDef r) y t' ] -- Primitive function@@ -1370,7 +1377,7 @@ return [ A.RecSig (mkDefInfo x f p a r) x' ls' t' ] C.NiceDataSig r f p a _pc x ls t -> withLocalVars $ do- printScope "scope.data.sig" 20 ("checking DataSig for " ++ show x)+ printScope "scope.data.sig" 20 ("checking DataSig for " ++ prettyShow x) ensureNoLetStms ls ls' <- toAbstract (map makeDomainFull ls) t' <- toAbstract t@@ -1385,22 +1392,22 @@ toAbstractNiceAxiom A.FunSig m (C.Axiom r f p a i rel Nothing x t) -- Function definitions- C.FunDef r ds f a tc x cs -> do- printLocals 10 $ "checking def " ++ show x+ C.FunDef r ds f a i tc x cs -> do+ printLocals 10 $ "checking def " ++ prettyShow x (x',cs) <- toAbstract (OldName x,cs) let delayed = NotDelayed -- (delayed, cs) <- translateCopatternClauses cs -- TODO- return [ A.FunDef (mkDefInfo x f PublicAccess a r) x' delayed cs ]+ return [ A.FunDef (mkDefInfoInstance x f PublicAccess a i NotMacroDef r) x' delayed cs ] -- Uncategorized function clauses C.NiceFunClause r acc abs termCheck catchall (C.FunClause lhs rhs wcls ca) -> genericError $- "Missing type signature for left hand side " ++ show lhs+ "Missing type signature for left hand side " ++ prettyShow lhs C.NiceFunClause{} -> __IMPOSSIBLE__ -- Data definitions C.DataDef r f a _ x pars cons -> withLocalVars $ do- printScope "scope.data.def" 20 ("checking DataDef for " ++ show x)+ printScope "scope.data.def" 20 ("checking DataDef for " ++ prettyShow x) ensureNoLetStms pars -- Check for duplicate constructors do cs <- mapM conName cons@@ -1416,12 +1423,12 @@ -- Create the module for the qualified constructors checkForModuleClash x -- disallow shadowing previously defined modules let m = mnameFromList $ qnameToList x'- createModule True m+ createModule (Just IsData) m bindModule p x m -- make it a proper module cons <- toAbstract (map (ConstrDecl NoRec m a p) cons) -- Open the module -- openModule_ (C.QName x) defaultImportDir{ publicOpen = True }- printScope "data" 20 $ "Checked data " ++ show x+ printScope "data" 20 $ "Checked data " ++ prettyShow x return [ A.DataDef (mkDefInfo x f PublicAccess a r) x' pars cons ] where conName (C.Axiom _ _ _ _ _ _ _ c _) = return c@@ -1443,12 +1450,22 @@ m0 <- getCurrentModule let m = A.qualifyM m0 $ mnameFromList [ last $ qnameToList x' ] printScope "rec" 15 "before record"- createModule False m+ createModule (Just IsRecord) m -- We scope check the fields a second time, as actual fields. afields <- withCurrentModule m $ do afields <- toAbstract fields printScope "rec" 15 "checked fields" return afields+ -- Andreas, 2017-07-13 issue #2642 disallow duplicate fields+ -- Check for duplicate fields. (See "Check for duplicate constructors")+ do let fs = catMaybes $ for fields $ \case+ C.NiceField _ _ _ _ _ f _ -> Just f+ _ -> Nothing+ let dups = nub $ fs \\ nub fs+ bad = filter (`elem` dups) fs+ unless (distinct fs) $+ setCurrentRange bad $+ typeError $ DuplicateFields dups bindModule p x m cm' <- mapM (\(ThingWithFixity c f, _) -> bindConstructorName m c f a p YesRec) cm let inst = caseMaybe cm NotInstanceDef snd@@ -1554,7 +1571,7 @@ return [ A.UnquoteDef [ mkDefInfo x fx PublicAccess a r | (fx, x) <- zip fxs xs ] ys e ] NicePatternSyn r fx n as p -> do- reportSLn "scope.pat" 10 $ "found nice pattern syn: " ++ show r+ reportSLn "scope.pat" 10 $ "found nice pattern syn: " ++ prettyShow n defn@(as, p) <- withLocalVars $ do p <- toAbstract =<< parsePatternSyn p checkPatternLinearity [p]@@ -1570,8 +1587,8 @@ bindName PublicAccess PatternSynName n y modifyPatternSyns (Map.insert y defn) return [A.PatternSynDef y as p] -- only for highlighting- where unVarName (VarName a) = return a- unVarName _ = typeError $ UnusedVariableInPatternSynonym+ where unVarName (VarName a _) = return a+ unVarName _ = typeError $ UnusedVariableInPatternSynonym where -- checking postulate or type sig. without checking safe flag@@ -1639,16 +1656,11 @@ case e of A.Def x -> return [ A.RewritePragma x ] A.Proj _ (AmbQ [x]) -> return [ A.RewritePragma x ]- A.Proj _ x -> genericError $ "REWRITE used on ambiguous name " ++ show x+ A.Proj _ x -> genericError $ "REWRITE used on ambiguous name " ++ prettyShow x A.Con (AmbQ [x]) -> return [ A.RewritePragma x ]- A.Con x -> genericError $ "REWRITE used on ambiguous name " ++ show x- A.Var x -> genericError $ "REWRITE used on parameter " ++ show x ++ " instead of on a defined symbol"+ A.Con x -> genericError $ "REWRITE used on ambiguous name " ++ prettyShow x+ A.Var x -> genericError $ "REWRITE used on parameter " ++ prettyShow x ++ " instead of on a defined symbol" _ -> __IMPOSSIBLE__- toAbstract (C.CompiledDeclareDataPragma _ x hs) = do- e <- toAbstract $ OldQName x Nothing- case e of- A.Def x -> return [ A.CompiledDeclareDataPragma x hs ]- _ -> fail $ "Bad compiled type: " ++ show x -- TODO: error message toAbstract (C.CompiledTypePragma _ x hs) = do e <- toAbstract $ OldQName x Nothing case e of@@ -1664,7 +1676,7 @@ y <- case e of A.Def x -> return x A.Proj _ (AmbQ [x]) -> return x -- TODO: do we need to do s.th. special for projections? (Andreas, 2014-10-12)- A.Proj _ x -> genericError $ "COMPILED on ambiguous name " ++ show x+ A.Proj _ x -> genericError $ "COMPILED on ambiguous name " ++ prettyShow x A.Con _ -> genericError "Use COMPILED_DATA for constructors" -- TODO _ -> __IMPOSSIBLE__ return [ A.CompiledPragma y hs ]@@ -1674,12 +1686,6 @@ A.Def x -> return x _ -> __IMPOSSIBLE__ return [ A.CompiledExportPragma y hs ]- toAbstract (C.CompiledEpicPragma _ x ep) = do- e <- toAbstract $ OldQName x Nothing- y <- case e of- A.Def x -> return x- _ -> __IMPOSSIBLE__- return [ A.CompiledEpicPragma y ep ] toAbstract (C.CompiledJSPragma _ x ep) = do e <- toAbstract $ OldQName x Nothing y <- case e of@@ -1702,7 +1708,22 @@ e <- toAbstract $ OldQName x Nothing case e of A.Def x -> return [ A.CompiledDataUHCPragma x crd crcs ]- _ -> fail $ "Bad compiled type: " ++ show x -- TODO: error message+ _ -> fail $ "Bad compiled type: " ++ prettyShow x -- TODO: error message+ toAbstract (C.ForeignPragma _ b s) = [] <$ addForeignCode b s+ toAbstract (C.CompilePragma _ b x s) = do+ e <- toAbstract $ OldQName x Nothing+ let err what = genericError $ "Cannot COMPILE " ++ what ++ " " ++ prettyShow x+ y <- case e of+ A.Def x -> return x+ A.Proj _ (AmbQ [x]) -> return x+ A.Proj _ x -> err "ambiguous projection"+ A.Con (AmbQ [x]) -> return x+ A.Con x -> err "ambiguous constructor"+ A.PatternSyn{} -> err "pattern synonym"+ A.Var{} -> err "local variable"+ _ -> __IMPOSSIBLE__+ return [ A.CompilePragma b y s ]+ toAbstract (C.StaticPragma _ x) = do e <- toAbstract $ OldQName x Nothing y <- case e of@@ -1712,6 +1733,15 @@ "STATIC used on ambiguous name " ++ prettyShow x _ -> genericError "Target of STATIC pragma should be a function" return [ A.StaticPragma y ]+ toAbstract (C.InjectivePragma _ x) = do+ e <- toAbstract $ OldQName x Nothing+ y <- case e of+ A.Def x -> return x+ A.Proj _ (AmbQ [x]) -> return x+ A.Proj _ x -> genericError $+ "INJECTIVE used on ambiguous name " ++ prettyShow x+ _ -> genericError "Target of INJECTIVE pragma should be a defined symbol"+ return [ A.InjectivePragma y ] toAbstract (C.InlinePragma _ x) = do e <- toAbstract $ OldQName x Nothing y <- case e of@@ -1752,6 +1782,14 @@ toAbstract (C.HaskellCodePragma _ s) = do addInlineHaskell s return []+ toAbstract (C.EtaPragma _ x) = do+ e <- toAbstract $ OldQName x Nothing+ case e of+ A.Def x -> return [ A.EtaPragma x ]+ _ -> do+ e <- showA e+ genericError $ "Pragma ETA: expected identifier, " +++ "but found expression " ++ e toAbstract (C.DisplayPragma _ lhs rhs) = withLocalVars $ do let err = genericError "DISPLAY pragma left-hand side must have form 'f e1 .. en'" getHead (C.IdentP x) = return x@@ -1763,12 +1801,12 @@ (isPatSyn, hd) <- do qx <- resolveName' allKindsOfNames Nothing top case qx of- VarName x' -> return . (False,) $ A.qnameFromList [x']+ VarName x' _ -> return . (False,) $ A.qnameFromList [x'] DefinedName _ d -> return . (False,) $ anameName d FieldName [d] -> return . (False,) $ anameName d- FieldName ds -> genericError $ "Ambiguous projection " ++ show top ++ ": " ++ show (map anameName ds)+ FieldName ds -> genericError $ "Ambiguous projection " ++ prettyShow top ++ ": " ++ prettyShow (map anameName ds) ConstructorName [d] -> return . (False,) $ anameName d- ConstructorName ds -> genericError $ "Ambiguous constructor " ++ show top ++ ": " ++ show (map anameName ds)+ ConstructorName ds -> genericError $ "Ambiguous constructor " ++ prettyShow top ++ ": " ++ prettyShow (map anameName ds) UnknownName -> notInScope top PatternSynResName d -> return . (True,) $ anameName d @@ -1828,7 +1866,7 @@ if not (null eqs) then do rhs <- toAbstract =<< toAbstractCtx TopCtx (RightHandSide eqs with wcs' rhs whds)- return $ A.Clause lhs' [] rhs [] catchall+ return $ A.Clause lhs' [] [] rhs [] catchall else do -- ASR (16 November 2015) Issue 1137: We ban termination -- pragmas inside `where` clause.@@ -1839,7 +1877,7 @@ (rhs, ds) <- whereToAbstract (getRange wh) whname whds $ toAbstractCtx TopCtx (RightHandSide eqs with wcs' rhs []) rhs <- toAbstract rhs- return $ A.Clause lhs' [] rhs ds catchall+ return $ A.Clause lhs' [] [] rhs ds catchall whereToAbstract :: Range -> Maybe (C.Name, Access) -> [C.Declaration] -> ScopeM a -> ScopeM (a, [A.Declaration]) whereToAbstract _ _ [] inner = (,[]) <$> inner@@ -1965,7 +2003,7 @@ UnknownName -> notInScope d _ -> genericError $ "head of copattern needs to be a field identifier, but "- ++ show d ++ " isn't one"+ ++ prettyShow d ++ " isn't one" A.LHSProj (AmbQ ds) <$> toAbstract l <*> toAbstract ps2 instance ToAbstract c a => ToAbstract (WithHiding c) (WithHiding a) where@@ -1992,17 +2030,7 @@ -- bound anywhere in the pattern. instance ToAbstract (A.Pattern' C.Expr) (A.Pattern' A.Expr) where- toAbstract (A.VarP x) = return $ A.VarP x- toAbstract (A.ConP i ds as) = A.ConP i ds <$> mapM toAbstract as- toAbstract (A.ProjP i o ds) = return $ A.ProjP i o ds- toAbstract (A.DefP i x as) = A.DefP i x <$> mapM toAbstract as- toAbstract (A.WildP i) = return $ A.WildP i- toAbstract (A.AsP i x p) = A.AsP i x <$> toAbstract p- toAbstract (A.DotP i o e) = A.DotP i o <$> insideDotPattern (toAbstract e)- toAbstract (A.AbsurdP i) = return $ A.AbsurdP i- toAbstract (A.LitP l) = return $ A.LitP l- toAbstract (A.PatternSynP i x as) = A.PatternSynP i x <$> mapM toAbstract as- toAbstract (A.RecP i fs) = A.RecP i <$> mapM (traverse toAbstract) fs+ toAbstract = traverse $ insideDotPattern . toAbstract resolvePatternIdentifier :: Range -> C.QName -> Maybe (Set A.Name) -> ScopeM (A.Pattern' C.Expr)@@ -2023,14 +2051,14 @@ toAbstract (AppP (QuoteP _) p) | IdentP x <- namedArg p,- getHiding p == NotHidden = do+ visible p = do e <- toAbstract (OldQName x Nothing) let quoted (A.Def x) = return x quoted (A.Macro x) = return x quoted (A.Proj _ (AmbQ [x])) = return x- quoted (A.Proj _ (AmbQ xs)) = genericError $ "quote: Ambigous name: " ++ show xs+ quoted (A.Proj _ (AmbQ xs)) = genericError $ "quote: Ambigous name: " ++ prettyShow xs quoted (A.Con (AmbQ [x])) = return x- quoted (A.Con (AmbQ xs)) = genericError $ "quote: Ambigous name: " ++ show xs+ quoted (A.Con (AmbQ xs)) = genericError $ "quote: Ambigous name: " ++ prettyShow xs quoted (A.ScopedExpr _ e) = quoted e quoted _ = genericError $ "quote: not a defined name" A.LitP . LitQName (getRange x) <$> quoted e@@ -2072,7 +2100,7 @@ toAbstract (C.ParenP _ p) = toAbstract p toAbstract (C.LitP l) = return $ A.LitP l toAbstract p0@(C.AsP r x p) = do- x <- toAbstract (NewName x)+ x <- toAbstract (NewName False x) p <- toAbstract p return $ A.AsP info x p where@@ -2114,7 +2142,7 @@ es <- left (notaFixity nota) nonBindingParts es -- Prepend the generated section binders (if any). let body = foldl' app op es- return $ foldr (A.Lam (ExprRange (getRange body))) body binders+ return $ foldr (A.Lam (defaultLamInfo (getRange body))) body binders where -- Build an application in the abstract syntax, with correct Range. app e arg = A.App (ExprRange (fuseRange e arg)) e arg@@ -2161,7 +2189,7 @@ replacePlaceholders as Placeholder _ -> do x <- freshName noRange "section"- let i = argInfo a+ let i = setOrigin Inserted $ argInfo a (ls, ns) <- replacePlaceholders as return ( A.DomainFree i x : ls , set (Left (Var x)) a : ns
src/full/Agda/Syntax/Translation/InternalToAbstract.hs view
@@ -1,8 +1,8 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE NondecreasingIndentation #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE NondecreasingIndentation #-}+{-# LANGUAGE TypeFamilies #-} -- for type equality ~+{-# LANGUAGE UndecidableInstances #-} {-| Translating from internal syntax to abstract syntax. Enables nice@@ -26,23 +26,25 @@ import Control.Monad.State hiding (mapM_, mapM) import Control.Monad.Reader hiding (mapM_, mapM) -import Data.Foldable (foldMap)-import Data.List hiding (null, sort)+import Data.Foldable (Foldable, foldMap)+import qualified Data.List as List import qualified Data.Map as Map import Data.Maybe import Data.Semigroup (Semigroup, Monoid, (<>), mempty, mappend) import Data.Set (Set) import qualified Data.Set as Set-import Data.Traversable (traverse, mapM)+import Data.Traversable (Traversable, traverse, mapM) import qualified Data.Traversable as Trav import Agda.Syntax.Literal import Agda.Syntax.Position import Agda.Syntax.Common import Agda.Syntax.Fixity+import qualified Agda.Syntax.Concrete.Name as C import Agda.Syntax.Concrete (FieldAssignment'(..), exprFieldA) import Agda.Syntax.Info as Info import Agda.Syntax.Abstract as A+import Agda.Syntax.Abstract.Pattern ( foldAPattern ) import Agda.Syntax.Abstract.Pretty import Agda.Syntax.Internal as I import Agda.Syntax.Internal.Pattern as I@@ -52,7 +54,7 @@ import Agda.TypeChecking.Monad.Builtin import Agda.TypeChecking.Reduce import {-# SOURCE #-} Agda.TypeChecking.Records-import Agda.TypeChecking.CompiledClause (CompiledClauses(Fail))+import Agda.TypeChecking.CompiledClause (CompiledClauses'(Fail)) import Agda.TypeChecking.DisplayForm import Agda.TypeChecking.Level import {-# SOURCE #-} Agda.TypeChecking.Datatypes@@ -63,6 +65,7 @@ import Agda.Interaction.Options ( optPostfixProjections ) +import Agda.Utils.Either import Agda.Utils.Except ( MonadError(catchError) ) import Agda.Utils.Function import Agda.Utils.Functor@@ -195,14 +198,14 @@ md <- liftTCM $ -- addContext (replicate (length ps) "x") $ displayForm f $ zipWith (\ p i -> I.Apply $ p $> I.var i) ps [0..] reportSLn "reify.display" 60 $- "display form of " ++ show f ++ " " ++ show ps ++ " " ++ show wps ++ ":\n " ++ show md+ "display form of " ++ prettyShow f ++ " " ++ show ps ++ " " ++ show wps ++ ":\n " ++ show md case md of Just d | okDisplayForm d -> do -- In the display term @d@, @var i@ should be a placeholder -- for the @i@th pattern of @ps@. -- Andreas, 2014-06-11: -- Are we sure that @d@ did not use @var i@ otherwise?- lhs' <- displayLHS (map namedArg ps) wps d+ lhs' <- displayLHS ps wps d reportSDoc "reify.display" 70 $ do doc <- prettyA lhs' return $ vcat@@ -220,6 +223,7 @@ -- can serve as a valid left-hand side. That means checking that it is a -- defined name applied to valid lhs eliminators (projections or -- applications to constructor patterns).+ okDisplayForm :: DisplayTerm -> Bool okDisplayForm (DWithApp d ds es) = okDisplayForm d && all okDisplayTerm ds && all okToDropE es -- Andreas, 2016-05-03, issue #1950.@@ -230,29 +234,36 @@ okDisplayForm DCon{} = False okDisplayForm DTerm{} = False + okDisplayTerm :: DisplayTerm -> Bool okDisplayTerm (DTerm v) = okTerm v okDisplayTerm DDot{} = True okDisplayTerm DCon{} = True okDisplayTerm DDef{} = False okDisplayTerm _ = False + okDElim :: Elim' DisplayTerm -> Bool okDElim (I.Apply v) = okDisplayTerm $ unArg v okDElim I.Proj{} = True + okToDropE :: Elim' Term -> Bool okToDropE (I.Apply v) = okToDrop v okToDropE I.Proj{} = False + okToDrop :: Arg I.Term -> Bool okToDrop arg = notVisible arg && case ignoreSharing $ unArg arg of I.Var _ [] -> True I.DontCare{} -> True -- no matching on irrelevant things. __IMPOSSIBLE__ anyway? I.Level{} -> True -- no matching on levels. __IMPOSSIBLE__ anyway? _ -> False + okArg :: Arg I.Term -> Bool okArg = okTerm . unArg + okElim :: Elim' I.Term -> Bool okElim (I.Apply a) = okArg a okElim (I.Proj{}) = True + okTerm :: I.Term -> Bool okTerm (I.Var _ []) = True okTerm (I.Con c ci vs) = all okArg vs okTerm (I.Def x []) = isNoName $ qnameToConcrete x -- Handling wildcards in display forms@@ -267,37 +278,45 @@ flattenWith (DTerm (I.Def f es)) = (f, map (fmap DTerm) es, []) flattenWith _ = __IMPOSSIBLE__ - displayLHS :: [A.Pattern] -> [A.Pattern] -> DisplayTerm -> TCM A.SpineLHS+ displayLHS :: [NamedArg A.Pattern] -> [A.Pattern] -> DisplayTerm -> TCM A.SpineLHS displayLHS ps wps d = do let (f, vs, es) = flattenWith d ds <- mapM (namedArg <.> elimToPat) es vs <- mapM elimToPat vs return $ SpineLHS i f vs (ds ++ wps) where- argToPat arg = fmap unnamed <$> traverse termToPat arg+ argToPat :: Arg DisplayTerm -> TCM (NamedArg A.Pattern)+ argToPat arg = traverse termToPat arg++ elimToPat :: I.Elim' DisplayTerm -> TCM (NamedArg A.Pattern) elimToPat (I.Apply arg) = argToPat arg elimToPat (I.Proj o d) = return $ defaultNamedArg $ A.ProjP patNoRange o $ AmbQ [d] - termToPat :: DisplayTerm -> TCM A.Pattern+ termToPat :: DisplayTerm -> TCM (Named_ A.Pattern) - termToPat (DTerm (I.Var n [])) = return $ case ps !!! n of- Nothing -> __IMPOSSIBLE__- Just p -> p+ termToPat (DTerm (I.Var n [])) = return $ unArg $ fromMaybe __IMPOSSIBLE__ $ ps !!! n - termToPat (DCon c ci vs) = tryRecPFromConP =<< do+ termToPat (DCon c ci vs) = fmap unnamed <$> tryRecPFromConP =<< do A.ConP (ConPatInfo ci patNoRange) (AmbQ [conName c]) <$> mapM argToPat vs - termToPat (DTerm (I.Con c ci vs)) = tryRecPFromConP =<< do+ termToPat (DTerm (I.Con c ci vs)) = fmap unnamed <$> tryRecPFromConP =<< do A.ConP (ConPatInfo ci patNoRange) (AmbQ [conName c]) <$> mapM (argToPat . fmap DTerm) vs - termToPat (DTerm (I.Def _ [])) = return $ A.WildP patNoRange- termToPat (DDef _ []) = return $ A.WildP patNoRange+ termToPat (DTerm (I.Def _ [])) = return $ unnamed $ A.WildP patNoRange+ termToPat (DDef _ []) = return $ unnamed $ A.WildP patNoRange - termToPat (DDot v) = A.DotP patNoRange Inserted <$> termToExpr v- termToPat v = A.DotP patNoRange Inserted <$> reify v -- __IMPOSSIBLE__+ -- Currently we don't keep track of the origin of a dot pattern in the internal syntax,+ -- so here we give __IMPOSSIBLE__. This is only used for printing purposes, the origin+ -- should not be used anyway after this point.+ -- Andreas, 2017-02-14: This crashes with -v 100.+ -- termToPat (DDot v) = A.DotP patNoRange __IMPOSSIBLE__ <$> termToExpr v+ -- termToPat v = A.DotP patNoRange __IMPOSSIBLE__ <$> reify v -- __IMPOSSIBLE__+ termToPat (DDot v) = unnamed . A.DotP patNoRange Inserted <$> termToExpr v+ termToPat v = unnamed . A.DotP patNoRange Inserted <$> reify v - len = genericLength ps+ len = length ps + argsToExpr :: I.Args -> TCM [Arg A.Expr] argsToExpr = mapM (traverse termToExpr) -- TODO: restructure this to avoid having to repeat the code for reify@@ -318,7 +337,7 @@ -- even the pattern variables @n < len@ can be -- applied to some args @vs@. e <- if n < len- then return $ A.patternToExpr $ ps !! n+ then return $ A.patternToExpr $ namedArg $ ps !! n else reify (I.var (n - len)) apps e =<< argsToExpr vs _ -> return underscore@@ -354,7 +373,7 @@ case isR || ci == ConORec of True -> do showImp <- showImplicitArguments- let keep (a, v) = showImp || notHidden a+ let keep (a, v) = showImp || visible a r <- getConstructorData x xs <- getRecordFieldNames r vs <- map unArg <$> reify vs@@ -403,13 +422,13 @@ -- I.Lam info b | isAbsurdBody b -> return $ A. AbsurdLam noExprInfo $ getHiding info I.Lam info b -> do (x,e) <- reify b- return $ A.Lam noExprInfo (DomainFree info x) e+ return $ A.Lam (setOrigin (getOrigin info) defaultLamInfo_) (DomainFree info x) e -- Andreas, 2011-04-07 we do not need relevance information at internal Lambda I.Lit l -> reify l I.Level l -> reify l I.Pi a b -> case b of NoAbs _ b'- | notHidden a -> uncurry (A.Fun $ noExprInfo) <$> reify (a, b')+ | visible a -> uncurry (A.Fun $ noExprInfo) <$> reify (a, b') -- Andreas, 2013-11-11 Hidden/Instance I.Pi must be A.Pi -- since (a) the syntax {A} -> B or {{A}} -> B is not legal -- and (b) the name of the binder might matter.@@ -449,14 +468,14 @@ YesReduction _ v -> do reportSLn "reify.anon" 60 $ unlines [ "reduction on defined ident. in anonymous module"- , "x = " ++ show x+ , "x = " ++ prettyShow x , "v = " ++ show v ] reify v NoReduction () -> do reportSLn "reify.anon" 60 $ unlines [ "no reduction on defined ident. in anonymous module"- , "x = " ++ show x+ , "x = " ++ prettyShow x , "es = " ++ show es ] reifyDef' x es@@ -464,13 +483,14 @@ reifyDef' :: QName -> I.Elims -> TCM Expr reifyDef' x es = do- reportSLn "reify.def" 60 $ "reifying call to " ++ show x+ reportSLn "reify.def" 60 $ "reifying call to " ++ prettyShow x -- We should drop this many arguments from the local context. n <- getDefFreeVars x+ reportSLn "reify.def" 70 $ "freeVars for " ++ prettyShow x ++ " = " ++ show n -- If the definition is not (yet) in the signature, -- we just do the obvious.- let fallback = elims (A.Def x) =<< reify (drop n es)- caseMaybeM (tryMaybe $ getConstInfo x) fallback $ \ defn -> do+ let fallback _ = elims (A.Def x) =<< reify (drop n es)+ caseEitherM (getConstInfo' x) fallback $ \ defn -> do let def = theDef defn -- Check if we have an absurd lambda.@@ -479,7 +499,7 @@ | isAbsurdLambdaName x -> do -- get hiding info from last pattern, which should be () let h = getHiding $ last $ namedClausePats cl- elims (A.AbsurdLam noExprInfo h) =<< reify (drop n es)+ elims (A.AbsurdLam defaultLamInfo_ h) =<< reify (drop n es) -- Otherwise (no absurd lambda): _ -> do@@ -504,6 +524,8 @@ (pad, nes :: [Elim' (Named_ Term)]) <- case def of Function{ funProjection = Just Projection{ projIndex = np } } | np > 0 -> do+ reportSLn "reify.def" 70 $ " def. is a projection with projIndex = " ++ show np+ -- This is tricky: -- * getDefFreeVars x tells us how many arguments -- are part of the local context@@ -547,7 +569,7 @@ let padVis = map (fmap (unnamed . namedThing)) padVisNamed -- Keep only the rest with the same visibility of @dom@...- let padTail = filter ((getHiding dom ==) . getHiding) padRest+ let padTail = filter (sameHiding dom) padRest -- ... and even the same name. let padSame = filter ((Just (fst (unDom dom)) ==) . fmap rangedThing . nameOf . unArg) padTail@@ -558,7 +580,12 @@ -- If it is not a projection(-like) function, we need no padding. _ -> return ([], map (fmap unnamed) $ drop n es)- let hd = foldl' (A.App noExprInfo) (A.Def x) pad++ reportSLn "reify.def" 70 $ unlines+ [ " pad = " ++ show pad+ , " nes = " ++ show nes+ ]+ let hd = List.foldl' (A.App noExprInfo) (A.Def x) pad nelims hd =<< reify nes -- Andreas, 2016-07-06 Issue #2047@@ -582,8 +609,8 @@ reifyExtLam :: QName -> Int -> [I.Clause] -> I.Elims -> TCM Expr reifyExtLam x npars cls es = do- reportSLn "reify.def" 10 $ "reifying extended lambda " ++ show x- reportSLn "reify.def" 50 $ show $ nest 2 $ vcat+ reportSLn "reify.def" 10 $ "reifying extended lambda " ++ prettyShow x+ reportSLn "reify.def" 50 $ render $ nest 2 $ vcat [ text "npars =" <+> pretty npars , text "es =" <+> fsep (map (prettyPrec 10) es) , text "def =" <+> vcat (map pretty cls) ]@@ -596,7 +623,7 @@ cls <- mapM (reify . NamedClause x False . (`applyE` pars)) cls let cx = nameConcrete $ qnameName x dInfo = mkDefInfo cx noFixity' PublicAccess ConcreteDef (getRange x)- elims (A.ExtendedLam noExprInfo dInfo x cls) =<< reify rest+ elims (A.ExtendedLam defaultLamInfo_ dInfo x cls) =<< reify rest -- | @nameFirstIfHidden (x:a) ({e} es) = {x = e} es@ nameFirstIfHidden :: Dom (ArgName, t) -> [Elim' a] -> [Elim' (Named_ a)]@@ -660,20 +687,28 @@ strip ps = stripArgs True ps where stripArgs _ [] = []- stripArgs fixedPos (a : as) =- if canStrip a- then if all canStrip $ takeWhile isUnnamedHidden as+ stripArgs fixedPos (a : as)+ -- Andreas, 2017-01-18, issue #819: preserves _ when splitting:+ -- An Inserted visible variable comes form a WildP and is restored as such.+ | visible a, getOrigin a == Inserted, varOrDot (namedArg a) = goWild+ -- A hidden non-UserWritten variable is removed if not needed for+ -- correct position of the following hidden arguments.+ | canStrip a =+ if all canStrip $ takeWhile isUnnamedHidden as then stripArgs False as- else let a' = fmap ($> A.WildP (Info.PatRange $ getRange a)) a- in stripName fixedPos a' : stripArgs True as- else stripName fixedPos (stripArg a) : stripArgs True as+ else goWild+ -- Other arguments are kept.+ | otherwise = stripName fixedPos (stripArg a) : stripArgs True as+ where+ a' = setNamedArg a $ A.WildP $ Info.PatRange $ getRange a+ goWild = stripName fixedPos a' : stripArgs True as stripName True = fmap (unnamed . namedThing) stripName False = id canStrip a = and [ notVisible a- , getOrigin a /= UserWritten+ , getOrigin a `notElem` [ UserWritten , CaseSplit ] , varOrDot (namedArg a) ] @@ -701,21 +736,22 @@ = all varOrDot $ map namedArg ps varOrDot _ = False --- | @blank bound x@ replaces all variables in @x@ that are not in @bound@ by+-- | @blank bound e@ replaces all variables in expression @e@ that are not in @bound@ by -- an underscore @_@. It is used for printing dot patterns: we don't want to -- make implicit variables explicit, so we blank them out in the dot patterns -- instead (this is fine since dot patterns can be inferred anyway).+ class BlankVars a where blank :: Set Name -> a -> a -instance BlankVars a => BlankVars (Arg a) where- blank bound = fmap $ blank bound--instance BlankVars a => BlankVars (Named s a) where- blank bound = fmap $ blank bound+ default blank :: (Functor f, BlankVars b, f b ~ a) => Set Name -> a -> a+ blank = fmap . blank -instance BlankVars a => BlankVars [a] where- blank bound = fmap $ blank bound+instance BlankVars a => BlankVars (Arg a) where+instance BlankVars a => BlankVars (Named s a) where+instance BlankVars a => BlankVars [a] where+instance BlankVars a => BlankVars (A.Pattern' a) where+instance BlankVars a => BlankVars (FieldAssignment' a) where instance (BlankVars a, BlankVars b) => BlankVars (a, b) where blank bound (x, y) = (blank bound x, blank bound y)@@ -727,13 +763,17 @@ instance BlankVars A.NamedDotPattern where blank bound = id +instance BlankVars A.StrippedDotPattern where+ blank bound = id+ instance BlankVars A.Clause where- blank bound (A.Clause lhs namedDots rhs [] ca) =+ blank bound (A.Clause lhs namedDots strippedDots rhs [] ca) = let bound' = varsBoundIn lhs `Set.union` bound in A.Clause (blank bound' lhs) (blank bound' namedDots)+ (blank bound' strippedDots) (blank bound' rhs) [] ca- blank bound (A.Clause lhs namedDots rhs (_:_) ca) = __IMPOSSIBLE__+ blank bound (A.Clause lhs namedDots strippedDots rhs (_:_) ca) = __IMPOSSIBLE__ instance BlankVars A.LHS where blank bound (A.LHS i core wps) = uncurry (A.LHS i) $ blank bound (core, wps)@@ -742,25 +782,11 @@ blank bound (A.LHSHead f ps) = A.LHSHead f $ blank bound ps blank bound (A.LHSProj p b ps) = uncurry (A.LHSProj p) $ blank bound (b, ps) -instance BlankVars A.Pattern where- blank bound p = case p of- A.VarP _ -> p -- do not blank pattern vars- A.ConP c i ps -> A.ConP c i $ blank bound ps- A.ProjP{} -> p- A.DefP i f ps -> A.DefP i f $ blank bound ps- A.DotP i o e -> A.DotP i o $ blank bound e- A.WildP _ -> p- A.AbsurdP _ -> p- A.LitP _ -> p- A.AsP i n p -> A.AsP i n $ blank bound p- A.PatternSynP _ _ _ -> __IMPOSSIBLE__- A.RecP i fs -> A.RecP i $ blank bound fs- instance BlankVars A.Expr where blank bound e = case e of A.ScopedExpr i e -> A.ScopedExpr i $ blank bound e A.Var x -> if x `Set.member` bound then e- else A.Underscore emptyMetaInfo+ else A.Underscore emptyMetaInfo -- Here is the action! A.Def _ -> e A.Proj{} -> e A.Con _ -> e@@ -793,9 +819,6 @@ A.PatternSyn {} -> e A.Macro {} -> e -instance BlankVars a => BlankVars (FieldAssignment' a) where- blank bound = over exprFieldA (blank bound)- instance BlankVars A.ModuleName where blank bound = id @@ -816,9 +839,15 @@ blank bound (TBind r n e) = TBind r n $ blank bound e blank bound (TLet _ _) = __IMPOSSIBLE__ -- Since the internal syntax has no let bindings left ++-- | Collect the binders in some abstract syntax lhs.+ class Binder a where varsBoundIn :: a -> Set Name + default varsBoundIn :: (Foldable f, Binder b, f b ~ a) => a -> Set Name+ varsBoundIn = foldMap varsBoundIn+ instance Binder A.LHS where varsBoundIn (A.LHS _ core ps) = varsBoundIn (core, ps) @@ -827,18 +856,18 @@ varsBoundIn (A.LHSProj _ b ps) = varsBoundIn (b, ps) instance Binder A.Pattern where- varsBoundIn p = case p of- A.VarP x -> if show x == "()" then empty else singleton x- A.ConP _ _ ps -> varsBoundIn ps- A.ProjP{} -> empty- A.DefP _ _ ps -> varsBoundIn ps- A.WildP{} -> empty- A.AsP _ _ p -> varsBoundIn p- A.DotP{} -> empty- A.AbsurdP{} -> empty- A.LitP{} -> empty- A.PatternSynP _ _ ps -> varsBoundIn ps- A.RecP _ fs -> varsBoundIn fs+ varsBoundIn = foldAPattern $ \case+ A.VarP x -> if prettyShow x == "()" then empty else singleton x -- TODO: get rid of this hack?+ A.AsP _ x _ -> empty+ A.ConP _ _ _ -> empty+ A.ProjP{} -> empty+ A.DefP _ _ _ -> empty+ A.WildP{} -> empty+ A.DotP{} -> empty+ A.AbsurdP{} -> empty+ A.LitP{} -> empty+ A.PatternSynP _ _ _ -> empty+ A.RecP _ _ -> empty instance Binder A.LamBinding where varsBoundIn (A.DomainFree _ x) = singleton x@@ -858,20 +887,13 @@ varsBoundIn LetOpen{} = empty varsBoundIn LetDeclaredVariable{} = empty -instance Binder a => Binder (FieldAssignment' a) where- varsBoundIn = varsBoundIn . (^. exprFieldA)--instance Binder a => Binder (Arg a) where- varsBoundIn = varsBoundIn . unArg--instance Binder a => Binder (Named x a) where- varsBoundIn = varsBoundIn . namedThing- instance Binder (WithHiding Name) where varsBoundIn (WithHiding _ x) = singleton x -instance Binder a => Binder [a] where- varsBoundIn xs = Set.unions $ map varsBoundIn xs+instance Binder a => Binder (FieldAssignment' a) where+instance Binder a => Binder (Arg a) where+instance Binder a => Binder (Named x a) where+instance Binder a => Binder [a] where instance (Binder a, Binder b) => Binder (a, b) where varsBoundIn (x, y) = varsBoundIn x `Set.union` varsBoundIn y@@ -884,19 +906,32 @@ where stripNameFromExplicit :: NamedArg p -> NamedArg p stripNameFromExplicit a- | getHiding a == NotHidden = fmap (unnamed . namedThing) a- | otherwise = a+ | visible a = fmap (unnamed . namedThing) a+ | otherwise = a reifyPat :: MonadTCM tcm => I.DeBruijnPattern -> tcm A.Pattern reifyPat p = do liftTCM $ reportSLn "reify.pat" 80 $ "reifying pattern " ++ show p case p of- I.VarP x | isAbsurdPatternName (dbPatVarName x)- -> return $ A.AbsurdP patNoRange -- HACK- I.VarP x -> liftTCM $ A.VarP <$> nameOfBV (dbPatVarIndex x)+ I.VarP x -> do+ n <- liftTCM $ nameOfBV $ dbPatVarIndex x+ case dbPatVarName x of+ "_" -> return $ A.VarP n+ -- Andreas, 2017-09-03: TODO for #2580+ -- Patterns @VarP "()"@ should have been replaced by @AbsurdP@, but the+ -- case splitter still produces them.+ y -> if prettyShow (nameConcrete n) == "()" then return $ A.VarP n else+ -- Andreas, 2017-09-03, issue #2729+ -- Restore original pattern name. AbstractToConcrete picks unique names.+ return $ A.VarP n { nameConcrete = C.Name noRange [ C.Id y ] } I.DotP v -> do t <- liftTCM $ reify v+ -- This is only used for printing purposes, so the Origin shouldn't be+ -- used after this point anyway. return $ A.DotP patNoRange Inserted t+ -- WAS: return $ A.DotP patNoRange __IMPOSSIBLE__ t+ -- Crashes on -v 100.+ I.AbsurdP p -> return $ A.AbsurdP patNoRange I.LitP l -> return $ A.LitP l I.ProjP o d -> return $ A.ProjP patNoRange o $ AmbQ [d] I.ConP c cpi ps -> do@@ -932,7 +967,7 @@ instance Reify NamedClause A.Clause where reify (NamedClause f toDrop cl) = addContext (clauseTel cl) $ do reportSLn "reify.clause" 60 $ "reifying NamedClause"- ++ "\n f = " ++ show f+ ++ "\n f = " ++ prettyShow f ++ "\n toDrop = " ++ show toDrop ++ "\n cl = " ++ show cl ps <- reifyPatterns $ namedClausePats cl@@ -947,14 +982,14 @@ rhs <- caseMaybe (clauseBody cl) (return AbsurdRHS) $ \ e -> do RHS <$> reify e <*> pure Nothing reportSLn "reify.clause" 60 $ "reifying NamedClause, rhs = " ++ show rhs- let result = A.Clause (spineToLhs lhs) [] rhs [] (I.clauseCatchall cl)+ let result = A.Clause (spineToLhs lhs) [] [] rhs [] (I.clauseCatchall cl) reportSLn "reify.clause" 60 $ "reified NamedClause, result = " ++ show result return result where perm = fromMaybe __IMPOSSIBLE__ $ clausePerm cl info = LHSRange noRange - dropParams n (SpineLHS i f ps wps) = SpineLHS i f (genericDrop n ps) wps+ dropParams n (SpineLHS i f ps wps) = SpineLHS i f (drop n ps) wps stripImps (SpineLHS i f ps wps) = do (ps, wps) <- stripImplicits (ps, wps) return $ SpineLHS i f ps wps
src/full/Agda/Syntax/Translation/ReflectedToAbstract.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -fwarn-missing-signatures #-} @@ -75,7 +74,7 @@ toAbstract (f, Apply arg) = do arg <- toAbstract arg showImp <- lift showImplicitArguments- return $ if showImp || getHiding arg == NotHidden+ return $ if showImp || visible arg then App (ExprRange noRange) f arg else f @@ -106,7 +105,7 @@ R.Lam h t -> do (e, name) <- toAbstract t let info = setHiding h $ setOrigin Reflected defaultArgInfo- return $ A.Lam exprNoRange (DomainFree info name) e+ return $ A.Lam (setOrigin Reflected defaultLamInfo_) (DomainFree info name) e R.ExtLam cs es -> do name <- freshName_ extendedLambdaName m <- lift $ getCurrentModule@@ -114,7 +113,7 @@ cname = nameConcrete name defInfo = mkDefInfo cname noFixity' PublicAccess ConcreteDef noRange cs <- toAbstract $ map (QNamed qname) cs- toAbstract (A.ExtendedLam exprNoRange defInfo qname cs, es)+ toAbstract (A.ExtendedLam (setOrigin Reflected defaultLamInfo_) defInfo qname cs, es) R.Pi a b -> do (b, name) <- toAbstract b a <- toAbstract (a, name)@@ -167,11 +166,11 @@ (names, pats) <- toAbstractPats pats rhs <- local (names++) $ toAbstract rhs let lhs = spineToLhs $ SpineLHS (LHSRange noRange) name pats []- return $ A.Clause lhs [] (RHS rhs Nothing) [] False+ return $ A.Clause lhs [] [] (RHS rhs Nothing) [] False toAbstract (QNamed name (R.AbsurdClause pats)) = do (_, pats) <- toAbstractPats pats let lhs = spineToLhs $ SpineLHS (LHSRange noRange) name pats []- return $ A.Clause lhs [] AbsurdRHS [] False+ return $ A.Clause lhs [] [] AbsurdRHS [] False instance ToAbstract [QNamed R.Clause] [A.Clause] where toAbstract = traverse toAbstract
src/full/Agda/Syntax/Treeless.hs view
@@ -14,6 +14,7 @@ import Control.Arrow (first, second) import Data.Map (Map)+import Data.Data (Data) import Data.Typeable (Typeable) import Agda.Syntax.Position@@ -23,7 +24,7 @@ data Compiled = Compiled { cTreeless :: TTerm , cArgUsage :: [Bool] }- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) type Args = [TTerm] @@ -53,7 +54,7 @@ | TErased | TError TError -- ^ A runtime error, something bad has happened.- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) -- | Compiler-related primitives. This are NOT the same thing as primitives -- in Agda's surface or internal syntax!@@ -80,7 +81,7 @@ | PEqQ | PIf | PSeq- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) isPrimEq :: TPrim -> Bool isPrimEq p = p `elem` [PEqI, PEqF, PEqS, PEqC, PEqQ]@@ -155,7 +156,7 @@ | CTString | CTFloat | CTQName- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) data TAlt = TACon { aCon :: QName, aArity :: Int, aBody :: TTerm }@@ -165,7 +166,7 @@ | TAGuard { aGuard :: TTerm, aBody :: TTerm } -- ^ Binds no variables | TALit { aLit :: Literal, aBody:: TTerm }- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) data TError = TUnreachable@@ -173,7 +174,7 @@ -- Runtime behaviour of unreachable code is undefined, but preferably -- the program will exit with an error message. The compiler is free -- to assume that this code is unreachable and to remove it.- deriving (Typeable, Show, Eq, Ord)+ deriving (Typeable, Data, Show, Eq, Ord) class Unreachable a where
src/full/Agda/Termination/CutOff.hs view
@@ -1,3 +1,9 @@+{-# LANGUAGE CPP #-}++#if __GLASGOW_HASKELL__ <= 708+{-# LANGUAGE DeriveDataTypeable #-}+#endif+ -- | Defines 'CutOff' type which is used in "Agda.Interaction.Options". -- This module's purpose is to eliminate the dependency of -- "Agda.TypeChecking.Monad.Base" on the termination checker and@@ -5,12 +11,21 @@ module Agda.Termination.CutOff where +#if __GLASGOW_HASKELL__ <= 708+import Data.Typeable ( Typeable )+#endif+ -- | Cut off structural order comparison at some depth in termination checker? data CutOff = CutOff Int -- ^ @c >= 0@ means: record decrease up to including @c+1@. | DontCutOff- deriving (Eq, Ord)+ deriving ( Eq+ , Ord+#if __GLASGOW_HASKELL__ <= 708+ , Typeable+#endif+ ) instance Show CutOff where show (CutOff k) = show k
src/full/Agda/Termination/Inlining.hs view
@@ -48,8 +48,9 @@ import Control.Applicative import Control.Monad.State +import qualified Data.List as List+import Data.Maybe import Data.Traversable (traverse)-import Data.List as List import Agda.Syntax.Common import Agda.Syntax.Internal@@ -70,10 +71,12 @@ import Agda.Utils.Impossible #include "undefined.h" -inlineWithClauses :: QName -> Clause -> TCM [Clause]+-- | Returns 'Nothing' if no inlining happened, otherwise, the new clauses.++inlineWithClauses :: QName -> Clause -> TCM (Maybe [Clause]) inlineWithClauses f cl = inTopContext $ do -- Clauses are relative to the empty context, so we operate @inTopContext@.- let noInline = return [cl]+ let noInline = return Nothing -- The de Bruijn indices of @body@ are relative to the @clauseTel cl@. body <- traverse instantiate $ clauseBody cl case body of@@ -104,9 +107,15 @@ reportSDoc "term.with.inline" 20 $ vcat $ text "inlinedClauses" : map (nest 2 . prettyTCM . QNamed f) cs2 - return $ cs1 ++ cs2+ return $ Just $ cs1 ++ cs2 _ -> noInline +-- | Returns the original clause if no inlining happened, otherwise,+-- the new clauses.++inlineWithClauses' :: QName -> Clause -> TCM [Clause]+inlineWithClauses' f cl = fromMaybe [cl] <$> inlineWithClauses f cl+ -- | @withExprClauses cl t as@ generates a clause containing a fake -- call to with-expression @a@ for each @a@ in @as@ that is not -- a variable (and thus cannot contain a recursive call).@@ -146,7 +155,7 @@ inlinedClauses f cl t wf = do -- @wf@ might define a with-function itself, so we first construct -- the with-inlined clauses @wcs@ of @wf@ recursively.- wcs <- concat <$> (mapM (inlineWithClauses wf) =<< defClauses <$> getConstInfo wf)+ wcs <- concat <$> (mapM (inlineWithClauses' wf) =<< defClauses <$> getConstInfo wf) reportSDoc "term.with.inline" 30 $ vcat $ text "With-clauses to inline" : map (nest 2 . prettyTCM . QNamed wf) wcs mapM (inline f cl t wf) wcs
src/full/Agda/Termination/Monad.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} -- | The monad for the termination checker.@@ -13,18 +14,18 @@ import Control.Applicative hiding (empty) import Control.Monad.Reader-import Control.Monad.Writer import Control.Monad.State import Data.Foldable (Foldable) import Data.Traversable (Traversable)-import Data.Semigroup (Semigroup)+import Data.Semigroup (Semigroup(..), Monoid(..)) import Agda.Interaction.Options import Agda.Syntax.Abstract (IsProjP(..), AllNames) import Agda.Syntax.Common import Agda.Syntax.Internal+import Agda.Syntax.Internal.Pattern import Agda.Syntax.Literal import Agda.Syntax.Position (noRange) @@ -35,7 +36,7 @@ import Agda.TypeChecking.Monad import Agda.TypeChecking.Monad.Benchmark import Agda.TypeChecking.Monad.Builtin-import Agda.TypeChecking.Pretty as TCP+import Agda.TypeChecking.Pretty hiding ((<>)) import Agda.TypeChecking.Records import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute@@ -46,6 +47,7 @@ import Agda.Utils.Lens import Agda.Utils.Maybe import Agda.Utils.Monad+import Agda.Utils.Monoid import Agda.Utils.Null import Agda.Utils.Pretty (Pretty, prettyShow) import qualified Agda.Utils.Pretty as P@@ -101,6 +103,9 @@ , terUserNames :: [QName] -- ^ The list of name actually appearing in the file (abstract syntax). -- Excludes the internally generated functions.+ , terHaveInlinedWith :: Bool+ -- ^ Does the actual clause result from with-inlining?+ -- (If yes, it may be ill-typed.) , terTarget :: Maybe Target -- ^ Target type of the function we are currently termination checking. -- Only the constructors of 'Target' are considered guarding.@@ -115,7 +120,7 @@ -- ^ How many @SIZELT@ relations do we have in the context -- (= clause telescope). Used to approximate termination -- for metas in call args.- , terPatterns :: MaskedDeBruijnPats+ , terPatterns :: MaskedDeBruijnPatterns -- ^ The patterns of the clause we are checking. , terPatternsRaise :: !Int -- ^ Number of additional binders we have gone under@@ -158,6 +163,7 @@ , terUserNames = __IMPOSSIBLE__ -- needs to be set! , terMutual = __IMPOSSIBLE__ -- needs to be set! , terCurrent = __IMPOSSIBLE__ -- needs to be set!+ , terHaveInlinedWith = False , terTarget = Nothing , terDelayed = NotDelayed , terMaskArgs = repeat False -- use all arguments (mask none)@@ -182,7 +188,7 @@ -- | Termination monad. newtype TerM a = TerM { terM :: ReaderT TerEnv TCM a }- deriving (Functor, Applicative, Monad, MonadBench Phase)+ deriving (Functor, Applicative, Monad, MonadBench Phase, HasOptions, MonadDebug) instance MonadTer TerM where terAsk = TerM $ ask@@ -249,6 +255,14 @@ getConstInfo = liftTCM . getConstInfo getRewriteRulesFor = liftTCM . getRewriteRulesFor +instance Semigroup m => Semigroup (TerM m) where+ (<>) = liftA2 (<>)++instance (Semigroup m, Monoid m) => Monoid (TerM m) where+ mempty = pure mempty+ mappend = (<>)+ mconcat = mconcat <.> sequence+ -- * Modifiers and accessors for the termination environment in the monad. terGetGuardingTypeConstructors :: TerM Bool@@ -290,6 +304,12 @@ terSetTarget :: Maybe Target -> TerM a -> TerM a terSetTarget t = terLocal $ \ e -> e { terTarget = t } +terGetHaveInlinedWith :: TerM Bool+terGetHaveInlinedWith = terAsks terHaveInlinedWith++terSetHaveInlinedWith :: TerM a -> TerM a+terSetHaveInlinedWith = terLocal $ \ e -> e { terHaveInlinedWith = True }+ terGetDelayed :: TerM Delayed terGetDelayed = terAsks terDelayed @@ -308,13 +328,13 @@ terSetMaskResult :: Bool -> TerM a -> TerM a terSetMaskResult b = terLocal $ \ e -> e { terMaskResult = b } -terGetPatterns :: TerM (MaskedDeBruijnPats)+terGetPatterns :: TerM (MaskedDeBruijnPatterns) terGetPatterns = do n <- terAsks terPatternsRaise mps <- terAsks terPatterns- return $ if n == 0 then mps else map (fmap (fmap (n +))) mps+ return $ if n == 0 then mps else map (fmap (raise n)) mps -terSetPatterns :: MaskedDeBruijnPats -> TerM a -> TerM a+terSetPatterns :: MaskedDeBruijnPatterns -> TerM a -> TerM a terSetPatterns ps = terLocal $ \ e -> e { terPatterns = ps } terRaise :: TerM a -> TerM a@@ -367,7 +387,10 @@ withUsableVars :: UsableSizeVars a => a -> TerM b -> TerM b withUsableVars pats m = do vars <- usableSizeVars pats- reportSLn "term.size" 20 $ "usableSizeVars = " ++ show vars+ reportSLn "term.size" 70 $ "usableSizeVars = " ++ show vars+ reportSDoc "term.size" 20 $ if null vars then text "no usuable size vars" else+ text "the size variables amoung these variables are usable: " <+>+ sep (map (prettyTCM . var) $ VarSet.toList vars) terSetUsableVars vars $ m -- | Set 'terUseSizeLt' when going under constructor @c@.@@ -408,7 +431,7 @@ else do mp <- isProjection qn case mp of- Just Projection{ projProper = True, projFromType = t }+ Just Projection{ projProper = Just{}, projFromType = t } -> isInductiveRecord (unArg t) _ -> return False @@ -428,11 +451,11 @@ if Just q == flat then return True else do pdef <- getConstInfo q case isProjection_ (theDef pdef) of- Just Projection{ projProper = True, projFromType = Arg _ r, projIndex = n } ->+ Just Projection{ projProper = Just{}, projFromType = Arg _ r, projIndex = n } -> caseMaybeM (isRecord r) __IMPOSSIBLE__ $ \ rdef -> do -- no for inductive or non-recursive record if recInduction rdef /= Just CoInductive then return False else do- reportSLn "term.guardedness" 40 $ prettyShow q ++ " is coinductive"+ reportSLn "term.guardedness" 40 $ prettyShow q ++ " is coinductive; record type is " ++ prettyShow r if not mustBeRecursive then return True else do reportSLn "term.guardedness" 40 $ prettyShow q ++ " must be recursive" if not (recRecursive rdef) then return False else do@@ -442,81 +465,45 @@ -- Now check if type of field mentions mutually recursive symbol. -- Get the type of the field by dropping record parameters and record argument. let TelV tel core = telView' (defType pdef)- tel' = drop n $ telToList tel+ (pars, tel') = splitAt n $ telToList tel+ mut = fromMaybe __IMPOSSIBLE__ $ recMutual rdef -- Check if any recursive symbols appear in the record type. -- Q (2014-07-01): Should we normalize the type?- reportSDoc "term.guardedness" 40 $ sep- [ text "looking for recursive occurrences in"- , prettyTCM (telFromList tel')+ -- A (2017-01-13): Yes, since we also normalize during positivity check?+ -- See issue #1899.+ reportSDoc "term.guardedness" 40 $ inTopContext $ sep+ [ text "looking for recursive occurrences of"+ , sep (map prettyTCM mut)+ , text "in"+ , addContext pars $ prettyTCM (telFromList tel') , text "and"- , prettyTCM core+ , addContext tel $ prettyTCM core ]- names <- anyDefs (r : recMutual rdef) (map (snd . unDom) tel', core)+ when (null mut) __IMPOSSIBLE__+ names <- anyDefs mut =<< normalise (map (snd . unDom) tel', core) reportSDoc "term.guardedness" 40 $- text "found" <+> sep (map prettyTCM names)+ text "found" <+> if null names then text "none" else sep (map prettyTCM names) return $ not $ null names _ -> do reportSLn "term.guardedness" 40 $ prettyShow q ++ " is not a proper projection" return False ---- * De Bruijn patterns.--type DeBruijnPats = [DeBruijnPat]---- | Patterns with variables as de Bruijn indices.-type DeBruijnPat = DeBruijnPat' Int--data DeBruijnPat' a- = VarDBP a- -- ^ De Bruijn Index.- | ConDBP QName [DeBruijnPat' a]- -- ^ The name refers to either an ordinary- -- constructor or the successor function on sized types.- | LitDBP Literal- -- ^ Literal. Also abused to censor part of a pattern.- | TermDBP Term- -- ^ Part of dot pattern that cannot be converted into a pattern.- | ProjDBP ProjOrigin QName- -- ^ Projection pattern.- deriving (Functor, Show)--instance IsProjP (DeBruijnPat' a) where- isProjP (ProjDBP o d) = Just (o, AmbQ [d])- isProjP _ = Nothing--instance PrettyTCM DeBruijnPat where- prettyTCM (VarDBP i) = prettyTCM $ var i- prettyTCM (ConDBP c ps) = parens $ do prettyTCM c <+> hsep (map prettyTCM ps)- prettyTCM (LitDBP l) = prettyTCM l- prettyTCM (TermDBP v) = parens $ prettyTCM v- prettyTCM (ProjDBP o d) = text "." TCP.<> prettyTCM d---- | How long is the path to the deepest variable?-patternDepth :: DeBruijnPat' a -> Int-patternDepth p =- case p of- ConDBP _ ps -> succ $ maximum $ 0 : map patternDepth ps- VarDBP{} -> 0- LitDBP{} -> 0- TermDBP{} -> 0- ProjDBP{} -> 0+-- * De Bruijn pattern stuff +-- | How long is the path to the deepest atomic pattern?+patternDepth :: forall a. Pattern' a -> Int+patternDepth = getMaxNat . foldrPattern depth where+ depth :: Pattern' a -> MaxNat -> MaxNat+ depth ConP{} = succ -- add 1 to the maximum of the depth of the subpatterns+ depth _ = id -- atomic pattern (leaf) has depth 0 -- | A dummy pattern used to mask a pattern that cannot be used -- for structural descent. -unusedVar :: DeBruijnPat-unusedVar = LitDBP (LitString noRange "term.unused.pat.var")---- | @raiseDBP n ps@ increases each de Bruijn index in @ps@ by @n@.--- Needed when going under a binder during analysis of a term.--raiseDBP :: Int -> DeBruijnPats -> DeBruijnPats-raiseDBP 0 = id-raiseDBP n = map $ fmap (n +)+unusedVar :: DeBruijnPattern+unusedVar = LitP (LitString noRange "term.unused.pat.var") --- | Extract variables from 'DeBruijnPat's that could witness a decrease+-- | Extract variables from 'DeBruijnPattern's that could witness a decrease -- via a SIZELT constraint. -- -- These variables must be under an inductive constructor (with no record@@ -526,44 +513,46 @@ class UsableSizeVars a where usableSizeVars :: a -> TerM VarSet -instance UsableSizeVars DeBruijnPat where- usableSizeVars p = do- let none = return mempty- case p of- VarDBP i -> ifM terGetUseSizeLt (return $ VarSet.singleton i) {- else -} none- ConDBP c ps -> conUseSizeLt c $ usableSizeVars ps- LitDBP{} -> none- TermDBP{} -> none- ProjDBP{} -> none+instance UsableSizeVars DeBruijnPattern where+ usableSizeVars = foldrPattern $ \case+ VarP x -> const $ ifM terGetUseSizeLt (return $ VarSet.singleton $ dbPatVarIndex x) $+ {-else-} return mempty+ ConP c _ _ -> conUseSizeLt $ conName c+ LitP{} -> none+ DotP{} -> none+ AbsurdP{} -> none+ ProjP{} -> none+ where none _ = return mempty -instance UsableSizeVars DeBruijnPats where+instance UsableSizeVars [DeBruijnPattern] where usableSizeVars ps = case ps of- [] -> return mempty- (ProjDBP _ q : ps) -> projUseSizeLt q $ usableSizeVars ps- (p : ps) -> mappend <$> usableSizeVars p <*> usableSizeVars ps+ [] -> return mempty+ (ProjP _ q : ps) -> projUseSizeLt q $ usableSizeVars ps+ (p : ps) -> mappend <$> usableSizeVars p <*> usableSizeVars ps -instance UsableSizeVars (Masked DeBruijnPat) where- usableSizeVars (Masked m p) = do- let none = return mempty- case p of- VarDBP i -> ifM terGetUseSizeLt (return $ VarSet.singleton i) {- else -} none- ConDBP c ps -> if m then none else conUseSizeLt c $ usableSizeVars ps- LitDBP{} -> none- TermDBP{} -> none- ProjDBP{} -> none+instance UsableSizeVars (Masked DeBruijnPattern) where+ usableSizeVars (Masked m p) = (`foldrPattern` p) $ \case+ VarP x -> const $ ifM terGetUseSizeLt (return $ VarSet.singleton $ dbPatVarIndex x) $+ {-else-} return mempty+ ConP c _ _ -> if m then none else conUseSizeLt $ conName c+ LitP{} -> none+ DotP{} -> none+ AbsurdP{} -> none+ ProjP{} -> none+ where none _ = return mempty -instance UsableSizeVars MaskedDeBruijnPats where+instance UsableSizeVars MaskedDeBruijnPatterns where usableSizeVars ps = case ps of- [] -> return mempty- (Masked _ (ProjDBP _ q) : ps) -> projUseSizeLt q $ usableSizeVars ps- (p : ps) -> mappend <$> usableSizeVars p <*> usableSizeVars ps+ [] -> return mempty+ (Masked _ (ProjP _ q) : ps) -> projUseSizeLt q $ usableSizeVars ps+ (p : ps) -> mappend <$> usableSizeVars p <*> usableSizeVars ps -- * Masked patterns (which are not eligible for structural descent, only for size descent) -- See issue #1023. -type MaskedDeBruijnPats = [Masked DeBruijnPat]+type MaskedDeBruijnPatterns = [Masked DeBruijnPattern] data Masked a = Masked { getMask :: Bool -- ^ True if thing not eligible for structural descent.
src/full/Agda/Termination/Order.hs view
@@ -8,7 +8,7 @@ module Agda.Termination.Order ( -- * Structural orderings Order(..), decr- , increase, decrease+ , increase, decrease, setUsability , (.*.) , supremum, infimum , orderSemiring@@ -55,18 +55,29 @@ -- -- TODO: document orders which are call-matrices themselves. data Order- = Decr {-# UNPACK #-} !Int+ = Decr !Bool {-# UNPACK #-} !Int -- ^ Decrease of callee argument wrt. caller parameter.+ --+ -- The @Bool@ indicates whether the decrease (if any) is usable.+ -- In any chain, there needs to be one usable decrease.+ -- Unusable decreases come from SIZELT constraints which are+ -- not in inductive pattern match or a coinductive copattern match.+ -- See issue #2331.+ --+ -- UPDATE: Andreas, 2017-07-26:+ -- Feature #2331 is unsound due to size quantification in terms.+ -- While the infrastructure for usable/unusable decrease remains in+ -- place, no unusable decreases are generated by TermCheck. | Unknown -- ^ No relation, infinite increase, or increase beyond termination depth. | Mat {-# UNPACK #-} !(Matrix Int Order) -- ^ Matrix-shaped order, currently UNUSED.- deriving (Eq,Ord)+ deriving (Eq, Ord, Show) -instance Show Order where- show (Decr k) = show (- k)- show Unknown = "."- show (Mat m) = "Mat " ++ show m+-- instance Show Order where+-- show (Decr u k) = if u then show (- k) else "(" ++ show (-k) ++ ")"+-- show Unknown = "."+-- show (Mat m) = "Mat " ++ show m instance HasZero Order where zeroElement = Unknown@@ -82,10 +93,15 @@ (Unknown, Unknown) -> POEQ (Unknown, _ ) -> POLT (_ , Unknown) -> POGT- (Decr k , Decr l ) -> comparableOrd k l+ (Decr u k, Decr u' l) -> comparableBool u u' `orPO` comparableOrd k l -- Matrix-shaped orders are no longer supported (Mat{} , _ ) -> __IMPOSSIBLE__ (_ , Mat{} ) -> __IMPOSSIBLE__+ where+ comparableBool = curry $ \case+ (False, True) -> POLT+ (True, False) -> POGT+ _ -> POEQ -- | A partial order, aimed at deciding whether a call graph gets -- worse during the completion.@@ -96,10 +112,10 @@ -- | It does not get worse then ``increase''. -- If we are still decreasing, it can get worse: less decreasing. instance NotWorse Order where- o `notWorse` Unknown = True -- we are unboundedly increasing- Unknown `notWorse` Decr k = k < 0 -- we are increasing- Decr l `notWorse` Decr k = k < 0 || l >= k -- we are increasing or- -- we are decreasing, but more+ o `notWorse` Unknown = True -- we are unboundedly increasing+ Unknown `notWorse` Decr _ k = k < 0 -- we are increasing+ Decr u l `notWorse` Decr u' k = k < 0 -- we are increasing or+ || l >= k && (u || not u') -- we are decreasing, but not less, and not less usable -- Matrix-shaped orders are no longer supported Mat m `notWorse` o = __IMPOSSIBLE__ o `notWorse` Mat m = __IMPOSSIBLE__@@ -125,28 +141,34 @@ -- | Raw increase which does not cut off. increase :: Int -> Order -> Order increase i o = case o of- Unknown -> Unknown- Decr k -> Decr $ k - i- Mat m -> Mat $ fmap (increase i) m+ Unknown -> Unknown+ Decr u k -> Decr u $ k - i -- TODO: should we set u to False if k - i < 0 ?+ Mat m -> Mat $ fmap (increase i) m -- | Raw decrease which does not cut off. decrease :: Int -> Order -> Order decrease i o = increase (-i) o +setUsability :: Bool -> Order -> Order+setUsability u o = case o of+ Decr _ k -> Decr u k+ Unknown -> o+ Mat{} -> o+ -- | Smart constructor for @Decr k :: Order@ which cuts off too big values. -- -- Possible values for @k@: @- ?cutoff '<=' k '<=' ?cutoff + 1@. -decr :: (?cutoff :: CutOff) => Int -> Order-decr k = case ?cutoff of+decr :: (?cutoff :: CutOff) => Bool -> Int -> Order+decr u k = case ?cutoff of CutOff c | k < -c -> Unknown- | k > c -> Decr $ c + 1- _ -> Decr k+ | k > c -> Decr u $ c + 1+ _ -> Decr u k -- | Smart constructor for matrix shaped orders, avoiding empty and singleton matrices. orderMat :: Matrix Int Order -> Order orderMat m- | Matrix.isEmpty m = Decr 0 -- 0x0 Matrix = neutral element+ | Matrix.isEmpty m = le -- 0x0 Matrix = neutral element | Just o <- isSingleton m = o -- 1x1 Matrix | otherwise = Mat m -- nxn Matrix @@ -156,30 +178,29 @@ CutOff c -> k >= -c && k <= c + 1 isOrder :: (?cutoff :: CutOff) => Order -> Bool-isOrder (Decr k) = withinCutOff k-isOrder Unknown = True-isOrder (Mat m) = False -- TODO: extend to matrices--prop_decr :: (?cutoff :: CutOff) => Int -> Bool-prop_decr = isOrder . decr+isOrder (Decr _ k) = withinCutOff k+isOrder Unknown = True+isOrder (Mat m) = False -- TODO: extend to matrices -- | @le@, @lt@, @decreasing@, @unknown@: for backwards compatibility, and for external use. le :: Order-le = Decr 0+le = Decr False 0 +-- | Usable decrease. lt :: Order-lt = Decr 1+lt = Decr True 1 unknown :: Order unknown = Unknown nonIncreasing :: Order -> Bool-nonIncreasing (Decr k) = k >= 0-nonIncreasing _ = False+nonIncreasing (Decr _ k) = k >= 0+nonIncreasing _ = False +-- | Decreasing and usable? decreasing :: Order -> Bool-decreasing (Decr k) = k > 0-decreasing _ = False+decreasing (Decr u k) = u && k > 0+decreasing _ = False -- | Matrix-shaped order is decreasing if any diagonal element is decreasing. isDecr :: Order -> Bool@@ -187,10 +208,10 @@ isDecr o = decreasing o instance Pretty Order where- pretty (Decr 0) = text "="- pretty (Decr k) = text $ show (0 - k)- pretty Unknown = text "?"- pretty (Mat m) = text "Mat" <+> pretty m+ pretty (Decr u 0) = text "="+ pretty (Decr u k) = mparens (not u) $ text $ show (0 - k)+ pretty Unknown = text "?"+ pretty (Mat m) = text "Mat" <+> pretty m -- | Multiplication of 'Order's.@@ -199,17 +220,17 @@ -- I think this funny pattern matching is because overlapping patterns -- are producing a warning and thus an error (strict compilation settings) (.*.) :: (?cutoff :: CutOff) => Order -> Order -> Order-Unknown .*. _ = Unknown-(Mat m) .*. Unknown = Unknown-(Decr k) .*. Unknown = Unknown-(Decr k) .*. (Decr l) = decr (k + l)-(Decr 0) .*. (Mat m) = Mat m-(Decr k) .*. (Mat m) = (Decr k) .*. (collapse m)-(Mat m1) .*. (Mat m2)- | okM m1 m2 = Mat $ mul orderSemiring m1 m2- | otherwise = (collapse m1) .*. (collapse m2)-(Mat m) .*. (Decr 0) = Mat m-(Mat m) .*. (Decr k) = (collapse m) .*. (Decr k)+Unknown .*. _ = Unknown+(Mat m) .*. Unknown = Unknown+(Decr _ k) .*. Unknown = Unknown+(Decr u k) .*. (Decr u' l) = decr (u || u') (k + l) -- if one is usable, so is the composition+(Decr _ 0) .*. (Mat m) = Mat m+(Decr u k) .*. (Mat m) = (Decr u k) .*. (collapse m)+(Mat m1) .*. (Mat m2)+ | okM m1 m2 = Mat $ mul orderSemiring m1 m2+ | otherwise = (collapse m1) .*. (collapse m2)+(Mat m) .*. (Decr _ 0) = Mat m+(Mat m) .*. (Decr u k) = (collapse m) .*. (Decr u k) -- | collapse @m@ --@@ -247,7 +268,12 @@ maxO :: (?cutoff :: CutOff) => Order -> Order -> Order maxO o1 o2 = case (o1,o2) of- (Decr k, Decr l) -> Decr (max k l) -- cut off not needed, within borders+ -- NOTE: strictly speaking the maximum does not exists+ -- which is better, an unusable decrease by 2 or a usable decrease by 1?+ -- We give the usable information priority if it is a decrease.+ (Decr False _, Decr True l) | l > 0 -> o2+ (Decr True k, Decr False _) | k > 0 -> o1+ (Decr u k, Decr u' l) -> if l > k then o2 else o1 (Unknown, _) -> o2 (_, Unknown) -> o1 (Mat m1, Mat m2) -> Mat (Matrix.add maxO m1 m2)@@ -266,7 +292,13 @@ minO o1 o2 = case (o1,o2) of (Unknown, _) -> Unknown (_, Unknown) -> Unknown- (Decr k, Decr l) -> Decr (min k l) -- cut off not needed, within borders+ -- different usability:+ -- We pick the unusable one if it is not a decrease or+ -- decreases not more than the usable one.+ (Decr False k, Decr True l) -> if k <= 0 || k <= l then o1 else o2+ (Decr True k, Decr False l) -> if l <= 0 || l <= k then o2 else o1+ -- same usability:+ (Decr u k, Decr _ l) -> Decr u (min k l) (Mat m1, Mat m2) | size m1 == size m2 -> Mat $ Matrix.intersectWith minO m1 m2 | otherwise -> minO (collapse m1) (collapse m2)
src/full/Agda/Termination/SparseMatrix.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} {- | Sparse matrices. @@ -43,6 +42,7 @@ , Diagonal(..) , toSparseRows , supSize+ , zipAssocWith -- * Modifying matrices , addRow , addColumn@@ -351,16 +351,6 @@ | i > j = interAssocWith f l m' | otherwise = (i, f a b) : interAssocWith f l' m' -interAssocWith2 :: Ord i => (a -> a -> a) -> [(i,a)] -> [(i,a)] -> [(i,a)]-interAssocWith2 f = zipAssocWith (const []) (const []) (const Nothing) (const Nothing) (\ a -> Just . f a)--prop_interAssocWith_correct2 :: [(Int,Int)] -> [(Int,Int)] -> Bool-prop_interAssocWith_correct2 xs ys =- interAssocWith (*) xs ys == interAssocWith2 (*) xs ys- where- l = List.sortBy (compare `on` fst) xs- l' = List.sortBy (compare `on` fst) ys- -- | @'mul' semiring m1 m2@ multiplies matrices @m1@ and @m2@. -- Uses the operations of the semiring @semiring@ to perform the -- multiplication.@@ -449,7 +439,7 @@ . Boxes.render . Boxes.hsep 1 Boxes.right . map ( Boxes.vcat Boxes.right- . map ( Boxes.alignHoriz Boxes.right 2+ . map ( Boxes.alignHoriz Boxes.right 4 . Boxes.text . render . pretty ) )
src/full/Agda/Termination/TermCheck.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE ImplicitParams #-} {-# LANGUAGE NondecreasingIndentation #-}@@ -13,7 +14,7 @@ module Agda.Termination.TermCheck ( termDecl , termMutual- , Result, DeBruijnPat+ , Result ) where import Prelude hiding (null)@@ -23,11 +24,10 @@ import Control.Monad.State import Data.Foldable (toList)-import Data.List hiding (null) import qualified Data.List as List-import Data.Monoid+import Data.Monoid hiding ((<>)) import qualified Data.Set as Set-import Data.Traversable (traverse)+import Data.Traversable (Traversable, traverse) import Agda.Syntax.Abstract (IsProjP(..), AllNames(..)) import qualified Agda.Syntax.Abstract as A@@ -51,18 +51,18 @@ import Agda.Termination.RecCheck import Agda.Termination.Inlining +import Agda.TypeChecking.Datatypes+import Agda.TypeChecking.EtaContract+import Agda.TypeChecking.Functions import Agda.TypeChecking.Monad+import Agda.TypeChecking.Monad.Builtin+import Agda.TypeChecking.Positivity.Occurrence import Agda.TypeChecking.Pretty-import Agda.TypeChecking.Reduce (reduce, normalise, instantiate, instantiateFull) import Agda.TypeChecking.Records -- (isRecordConstructor, isInductiveRecord)-import Agda.TypeChecking.Telescope-import Agda.TypeChecking.EtaContract-import Agda.TypeChecking.Monad.Builtin-import Agda.TypeChecking.Records-import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Reduce (reduce, normalise, instantiate, instantiateFull) import Agda.TypeChecking.SizedTypes-import Agda.TypeChecking.Datatypes-import Agda.TypeChecking.Positivity.Occurrence+import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Telescope import qualified Agda.Benchmarking as Benchmark import Agda.TypeChecking.Monad.Benchmark (billTo, billPureTo)@@ -162,7 +162,7 @@ -- (For error-reporting only.) -> TCM Result termMutual names0 = ifNotM (optTerminationCheck <$> pragmaOptions) (return mempty) $ {-else-}- disableDestructiveUpdate $ do+ inTopContext $ disableDestructiveUpdate $ do -- Get set of mutually defined names from the TCM. -- This includes local and auxiliary functions introduced@@ -182,25 +182,29 @@ -- Recursivity checker has to see through abstract definitions! ignoreAbstractMode $ do billTo [Benchmark.Termination, Benchmark.RecCheck] $ recursive allNames+ -- -- Andreas, 2017-03-24, use positivity info to skip non-recursive functions+ -- skip = ignoreAbstractMode $ allM allNames $ \ x -> do+ -- null <$> getMutual x+ -- PROBLEMS with test/Succeed/AbstractCoinduction.agda -- We set the range to avoid panics when printing error messages. setCurrentRange i $ do - reportSLn "term.mutual" 10 $ "Termination checking " ++ show allNames+ reportSLn "term.mutual" 10 $ "Termination checking " ++ prettyShow allNames -- NO_TERMINATION_CHECK if (Info.mutualTermCheck i `elem` [ NoTerminationCheck, Terminating ]) then do- reportSLn "term.warn.yes" 2 $ "Skipping termination check for " ++ show names+ reportSLn "term.warn.yes" 2 $ "Skipping termination check for " ++ prettyShow names forM_ allNames $ \ q -> setTerminates q True -- considered terminating! return mempty -- NON_TERMINATING else if (Info.mutualTermCheck i == NonTerminating) then do- reportSLn "term.warn.yes" 2 $ "Considering as non-terminating: " ++ show names+ reportSLn "term.warn.yes" 2 $ "Considering as non-terminating: " ++ prettyShow names forM_ allNames $ \ q -> setTerminates q False return mempty -- Trivially terminating (non-recursive) else ifM skip (do- reportSLn "term.warn.yes" 2 $ "Trivially terminating: " ++ show names+ reportSLn "term.warn.yes" 2 $ "Trivially terminating: " ++ prettyShow names forM_ allNames $ \ q -> setTerminates q True return mempty) $ {- else -} do@@ -212,7 +216,7 @@ } runTerm cont = runTerDefault $ do cutoff <- terGetCutOff- reportSLn "term.top" 10 $ "Termination checking " ++ show names +++ reportSLn "term.top" 10 $ "Termination checking " ++ prettyShow names ++ " with cutoff=" ++ show cutoff ++ "..." terLocal setNames cont @@ -268,18 +272,15 @@ Left calls -> return $ singleton $ terminationError names $ callInfos calls Right{} -> do liftTCM $ reportSLn "term.warn.yes" 2 $- show (names) ++ " does termination check"+ prettyShow (names) ++ " does termination check" return mempty -- | Smart constructor for 'TerminationError'. -- Removes 'termErrFunctions' that are not mentioned in 'termErrCalls'. terminationError :: [QName] -> [CallInfo] -> TerminationError terminationError names calls = TerminationError names' calls- where names' = names `intersect` toList (allNames calls)+ where names' = names `List.intersect` toList (allNames calls) --- ASR (08 November 2014). The type of the function could be------ @Either a b -> TerM (Either a b)@. billToTerGraph :: a -> TerM a billToTerGraph a = liftTCM $ billPureTo [Benchmark.Termination, Benchmark.Graph] a @@ -296,7 +297,7 @@ liftTCM $ do reportS "term.lex" 20 $ unlines- [ "Calls (" ++ no ++ "dot patterns): " ++ show calls+ [ "Calls (" ++ no ++ "dot patterns): " ++ prettyShow calls ] -- Print the whole completion phase.@@ -392,16 +393,16 @@ names <- terGetUserNames case r of- Left calls -> return $ singleton $ terminationError ([name] `intersect` names) calls+ Left calls -> return $ singleton $ terminationError ([name] `List.intersect` names) calls Right () -> do liftTCM $ reportSLn "term.warn.yes" 2 $- show name ++ " does termination check"+ prettyShow name ++ " does termination check" return mempty where reportTarget r = liftTCM $ reportSLn "term.target" 20 $ " target type " ++ caseMaybe r "not recognized" (\ q ->- "ends in " ++ show q)+ "ends in " ++ prettyShow q) -- | To process the target type. typeEndsInDef :: MonadTCM tcm => Type -> tcm (Maybe QName)@@ -471,27 +472,7 @@ return (ds, d) terSetMaskArgs (ds ++ repeat True) $ terSetMaskResult d $ cont -{- Termination check clauses: - For instance-- f x (cons y nil) = g x y-- Clause- [VarP "x", ConP "List.cons" [VarP "y", ConP "List.nil" []]]- Bind (Abs { absName = "x"- , absBody = Bind (Abs { absName = "y"- , absBody = Def "g" [ Var 1 []- , Var 0 []]})})-- Outline:- - create "De Bruijn pattern"- - collect recursive calls- - going under a binder, lift de Bruijn pattern- - compare arguments of recursive call to pattern---}- -- | Is the current target type among the given ones? targetElem :: [Target] -> TerM Bool@@ -517,97 +498,107 @@ -- -- The term is first normalized and stripped of all non-coinductive projections. -termToDBP :: Term -> TerM DeBruijnPat+termToDBP :: Term -> TerM DeBruijnPattern termToDBP t = ifNotM terGetUseDotPatterns (return unusedVar) $ {- else -} do- suc <- terGetSizeSuc- let- loop :: Term -> TCM DeBruijnPat- loop t = do- t <- constructorForm t- case ignoreSharing t of- -- Constructors.- Con c ci args -> ConDBP (conName c) <$> mapM (loop . unArg) args- Def s [Apply arg] | Just s == suc- -> ConDBP s . (:[]) <$> loop (unArg arg)- DontCare t -> __IMPOSSIBLE__ -- removed by stripAllProjections- -- Leaves.- Var i [] -> return $ VarDBP i- Lit l -> return $ LitDBP l- t -> return $ TermDBP t- liftTCM $ loop =<< stripAllProjections =<< normalise t+ termToPattern =<< do liftTCM $ stripAllProjections =<< normalise t +-- | Convert a term (from a dot pattern) to a pattern for the purposes of the termination checker.+--+-- @SIZESUC@ is treated as a constructor. --- | Masks coconstructor patterns in a deBruijn pattern.-stripCoConstructors :: DeBruijnPat -> TerM DeBruijnPat-stripCoConstructors p = do- case p of- ConDBP c args -> do- ind <- ifM ((Just c ==) <$> terGetSizeSuc) (return Inductive) {- else -}- (liftTCM $ whatInduction c)- case ind of- Inductive -> ConDBP c <$> mapM stripCoConstructors args- CoInductive -> return unusedVar- -- The remaining (atomic) patterns cannot contain coconstructors, obviously.- VarDBP{} -> return p- LitDBP{} -> return p- TermDBP{} -> return p -- Can contain coconstructors, but they do not count here.- ProjDBP{} -> return p+class TermToPattern a b where+ termToPattern :: a -> TerM b + default termToPattern :: (TermToPattern a' b', Traversable f, a ~ f a', b ~ f b') => a -> TerM b+ termToPattern = traverse termToPattern++instance TermToPattern a b => TermToPattern [a] [b] where+instance TermToPattern a b => TermToPattern (Arg a) (Arg b) where+instance TermToPattern a b => TermToPattern (Named c a) (Named c b) where++-- OVERLAPPING+-- instance TermToPattern a b => TermToPattern a (Named c b) where+-- termToPattern t = unnamed <$> termToPattern t++instance TermToPattern Term DeBruijnPattern where+ termToPattern t = (liftTCM $ ignoreSharing <$> constructorForm t) >>= \case+ -- Constructors.+ Con c _ args -> ConP c noConPatternInfo . map (fmap unnamed) <$> termToPattern args+ Def s [Apply arg] -> do+ suc <- terGetSizeSuc+ if Just s == suc then ConP (ConHead s Inductive []) noConPatternInfo . map (fmap unnamed) <$> termToPattern [arg]+ else return $ DotP t+ DontCare t -> termToPattern t -- OR: __IMPOSSIBLE__ -- removed by stripAllProjections+ -- Leaves.+ Var i [] -> VarP . (`DBPatVar` i) . prettyShow <$> nameOfBV i+ Lit l -> return $ LitP l+ t -> return $ DotP t++ -- | Masks all non-data/record type patterns if --without-K. -- See issue #1023.-maskNonDataArgs :: [DeBruijnPat] -> TerM [Masked DeBruijnPat]+maskNonDataArgs :: [DeBruijnPattern] -> TerM [Masked DeBruijnPattern] maskNonDataArgs ps = zipWith mask ps <$> terGetMaskArgs where- mask p@ProjDBP{} _ = Masked False p- mask p d = Masked d p+ mask p@ProjP{} _ = Masked False p+ mask p d = Masked d p --- | Convert patterns to the format used by the termination checker--- TODO: refactor termination checking to use regular patterns-convertPatterns :: [DeBruijnPattern] -> TerM [DeBruijnPat]-convertPatterns ps = mapM build ps- where- build :: DeBruijnPattern -> TerM DeBruijnPat- build (VarP x) = return $ VarDBP $ dbPatVarIndex x- build (ConP con _ ps) = ConDBP (conName con) <$> mapM (build . namedArg) ps- build (DotP t) = termToDBP t- build (LitP l) = return $ LitDBP l- build (ProjP o d) = return $ ProjDBP o d -- | Extract recursive calls from one clause.+ termClause :: Clause -> TerM Calls termClause clause = do- ifNotM (terGetInlineWithFunctions) (termClause' clause) $ {- else -} do++ -- If with-function inlining is disallowed (e.g. --without-K),+ -- we check the original clause.++ let fallback = termClause' clause+ ifNotM (terGetInlineWithFunctions) fallback $ {- else -} do++ -- Otherwise, we will do inlining, hence, can skip with-generated functions.+ name <- terGetCurrent- ifM (isJust <$> do isWithFunction name) (return mempty) $- mapM' termClause' =<< do liftTCM $ inlineWithClauses name clause+ ifM (isJust <$> isWithFunction name) (return mempty) $ {- else -} do + -- With inlining, the termination check for all subordinated+ -- with-functions is included in the parent function.++ (liftTCM $ inlineWithClauses name clause) >>= \case+ Nothing -> fallback+ Just cls -> terSetHaveInlinedWith $ mapM' termClause' cls+ termClause' :: Clause -> TerM Calls termClause' clause = do- cl <- introHiddenLambdas clause- let tel = clauseTel cl- argPats' = namedClausePats cl- body = clauseBody cl+ Clause{ clauseTel = tel, namedClausePats = ps, clauseBody = body } <- etaExpandClause clause liftTCM $ reportSDoc "term.check.clause" 25 $ vcat [ text "termClause"- , nest 2 $ text "tel =" <+> prettyTCM tel- , nest 2 $ text "argPats' =" <+> do- addContext tel $ do- aps <- reifyPatterns argPats'- fsep $ map prettyA aps+ , nest 2 $ text "tel =" <+> prettyTCM tel+ , nest 2 $ text "ps =" <+> do addContext tel $ prettyTCMPatternList ps ]- addContext tel $ do- dbpats <- convertPatterns $ map namedArg argPats'- case body of- Nothing -> return empty- Just v -> do- dbpats <- mapM stripCoConstructors dbpats- mdbpats <- maskNonDataArgs dbpats- terSetPatterns mdbpats $ do- terSetSizeDepth tel $ do- reportBody v- extract v+ forM' body $ \ v -> addContext tel $ do+ -- TODO: combine the following two traversals, avoid full normalisation.+ -- Parse dot patterns as patterns as far as possible.+ ps <- postTraversePatternM parseDotP ps+ -- Blank out coconstructors.+ ps <- preTraversePatternM stripCoCon ps+ -- Mask non-data arguments.+ mdbpats <- maskNonDataArgs $ map namedArg ps+ terSetPatterns mdbpats $ do+ terSetSizeDepth tel $ do+ reportBody v+ extract v where+ parseDotP = \case+ DotP t -> termToDBP t+ p -> return p+ stripCoCon p = case p of+ ConP (ConHead c _ _) _ _ -> do+ ifM ((Just c ==) <$> terGetSizeSuc) (return p) $ {- else -} do+ whatInduction c >>= \case+ Inductive -> return p+ CoInductive -> return unusedVar+ _ -> return p reportBody :: Term -> TerM () reportBody v = verboseS "term.check.clause" 6 $ do f <- terGetCurrent@@ -618,46 +609,11 @@ (if delayed == Delayed then "delayed " else "") ++ "clause of") <+> prettyTCM f- , nest 2 $ text "lhs:" <+> hsep (map prettyTCM pats)+ , nest 2 $ text "lhs:" <+> sep (map prettyTCM pats) , nest 2 $ text "rhs:" <+> prettyTCM v ] --- | Rewrite a clause @f ps =tel= \ {xs} -> v@ to @f ps {xs} =(tel {xs})= v@.--- The pupose is to move hidden size quantifications--- to the lhs such that the termination checker can make use of them.--- See, e.g., test/succeed/SizedTypesExtendedLambda.agda.-introHiddenLambdas :: MonadTCM tcm => Clause -> tcm Clause-introHiddenLambdas clause = liftTCM $ do- case clause of- Clause range ctel ps body Nothing catchall -> return clause - Clause range ctel ps Nothing (Just t) catchall -> return clause- Clause range ctel ps (Just body) (Just t) catchall -> do- case removeHiddenLambdas body of- -- nobody or no hidden lambdas- ([], _) -> return clause- -- hidden lambdas- (axs, body') -> do- -- n = number of hidden lambdas- let n = length axs- -- take n abstractions from rhs type- TelV ttel t' <- telViewUpTo n $ unArg t- when (size ttel < n) __IMPOSSIBLE__- -- join with lhs telescope- let ctel' = telFromList $ telToList ctel ++ telToList ttel- ps' = raise n ps ++ zipWith toPat (downFrom $ size axs) axs- return $ Clause range ctel' ps' (Just body') (Just (t $> t')) catchall- where- toPat i (Arg info x) = Arg info $ namedDBVarP i x-- removeHiddenLambdas :: Term -> ([Arg ArgName], Term)- removeHiddenLambdas v =- case ignoreSharing v of- Lam info b | getHiding info == Hidden ->- let (xs, b') = removeHiddenLambdas $ unAbs b- in (Arg info (absName b) : xs, b')- _ -> ([], v)- -- | Extract recursive calls from expressions. class ExtractCalls a where extract :: a -> TerM Calls@@ -721,14 +677,12 @@ constructor c ind args = do cutoff <- terGetCutOff let ?cutoff = cutoff- mapM' loopArg args- where- loopArg (arg, preserves) = terModifyGuarded g' $ extract arg where- g' = case (preserves, ind) of+ forM' args $ \ (arg, preserves) -> do+ let g' = case (preserves, ind) of (True, Inductive) -> id (True, CoInductive) -> (Order.lt .*.) (False, _) -> const Order.unknown-+ terModifyGuarded g' $ extract arg -- | Handle guardedness preserving type constructor. @@ -763,16 +717,16 @@ -- | Handles function applications @g es@. function :: QName -> Elims -> TerM Calls-function g es = ifM (terGetInlineWithFunctions `and2M` do isJust <$> isWithFunction g) (withFunction g es)+function g es0 = ifM (terGetInlineWithFunctions `and2M` do isJust <$> isWithFunction g) (withFunction g es0) $ {-else, no with function-} do f <- terGetCurrent names <- terGetMutual guarded <- terGetGuarded - let gArgs = Def g es+ -- let gArgs = Def g es0 liftTCM $ reportSDoc "term.function" 30 $- text "termination checking function call " <+> prettyTCM gArgs+ text "termination checking function call " <+> prettyTCM (Def g es0) -- First, look for calls in the arguments of the call gArgs. @@ -780,7 +734,7 @@ -- Andreas, Issue 1530: constructors have to be reduced deep inside terms, -- thus, we need to use traverseTermM. Sharing is handled by traverseTermM, -- so no ignoreSharing needed here.- let reduceCon = traverseTermM $ \ t -> case t of+ let (reduceCon :: Term -> TCM Term) = traverseTermM $ \ t -> case t of Con c ci vs -> (`apply` vs) <$> reduce (Con c ci []) -- make sure we don't reduce the arguments _ -> return t @@ -794,7 +748,7 @@ let unguards = repeat Order.unknown let guards = applyWhen isProj (guarded :) unguards -- Collect calls in the arguments of this call.- let args = map unArg $ argsFromElims es+ let args = map unArg $ argsFromElims es0 calls <- forM' (zip guards args) $ \ (guard, a) -> do terSetGuarded guard $ extract a @@ -815,10 +769,26 @@ Just gInd -> do delayed <- terGetDelayed pats <- terGetPatterns- -- 2014-03-25 Andreas, the costs seem small, benchmark turned off.- es <- liftTCM $ -- billTo [Benchmark.Termination, Benchmark.Reduce] $- forM es $- etaContract <=< traverse reduceCon <=< instantiateFull+ -- Andreas, 2017-02-14, issue #2458:+ -- If we have inlined with-functions, we could be illtyped,+ -- hence, do not reduce anything.+ -- Andreas, 2017-06-20 issue #2613:+ -- We still need to reduce constructors, even when with-inlining happened.+ es <- -- ifM terGetHaveInlinedWith (return es0) {-else-} $+ liftTCM $ forM es0 $+ etaContract <=< traverse reduceCon <=< instantiateFull+ -- 2017-05-16, issue #2403: Argument normalization is too expensive,+ -- even if we only expand non-recursive functions.+ -- Argument normalization TURNED OFF.+ -- liftTCM $ billTo [Benchmark.Termination, Benchmark.Reduce] $ do+ -- -- Andreas, 2017-01-13, issue #2403, normalize arguments for the structural ordering.+ -- -- Andreas, 2017-03-25, issue #2495, restrict this to non-recursive functions+ -- -- otherwise, the termination checking may run forever.+ -- reportSLn "term.reduce" 90 $ "normalizing call arguments"+ -- modifyAllowedReductions (List.\\ [UnconfirmedReductions,RecursiveReductions]) $+ -- forM es0 $ \ e -> do+ -- reportSDoc "term.reduce" 95 $ text "normalizing " <+> prettyTCM e+ -- etaContract =<< normalise e -- Compute the call matrix. @@ -849,7 +819,10 @@ -- Andreas, 2015-01-21 Issue 1410: Go to the module where g is defined -- otherwise its free variables with be prepended to the call -- in the error message.- doc <- liftTCM $ withCurrentModule (qnameModule g) $ buildClosure gArgs+ doc <- liftTCM $ withCurrentModule (qnameModule g) $ buildClosure $+ Def g $ filter ((/= Inserted) . getOrigin) es0+ -- Andreas, 2017-01-05, issue #2376+ -- Remove arguments inserted by etaExpandClause. let src = fromMaybe __IMPOSSIBLE__ $ List.elemIndex f names tgt = gInd@@ -860,8 +833,8 @@ , callInfoCall = doc }] liftTCM $ reportSDoc "term.kept.call" 5 $ vcat- [ text "kept call from" <+> text (show f) <+> hsep (map prettyTCM pats)- , nest 2 $ text "to" <+> text (show g) <+>+ [ text "kept call from" <+> text (prettyShow f) <+> hsep (map prettyTCM pats)+ , nest 2 $ text "to" <+> text (prettyShow g) <+> hsep (map (parens . prettyTCM) args) , nest 2 $ text "call matrix (with guardedness): " , nest 2 $ pretty cm@@ -889,13 +862,11 @@ -- in a type mutual with the current target -- then we count it as guarding. ind <- ifM ((Just c ==) <$> terGetSharp) (return CoInductive) $ do- r <- liftTCM $ isRecordConstructor c- case r of- Nothing -> return Inductive- Just (q, def) -> (\ b -> if b then CoInductive else Inductive) <$>- andM [ return $ recRecursive def- , return $ recInduction def == Just CoInductive- , targetElem (q : recMutual def)+ caseMaybeM (liftTCM $ isRecordConstructor c) (return Inductive) $ \ (q, def) -> do+ reportSLn "term.check.term" 50 $ "constructor " ++ prettyShow c ++ " has record type " ++ prettyShow q+ (\ b -> if b then CoInductive else Inductive) <$>+ andM [ return $ recInduction def == Just CoInductive+ , targetElem . fromMaybe __IMPOSSIBLE__ $ recMutual def ] constructor c ind argsg @@ -975,8 +946,11 @@ The guardedness is the number of projection patterns in @pats@ minus the number of projections in @es@. -}-compareArgs :: (Integral n) => [Elim] -> TerM (n, n, [[Order]])+compareArgs :: [Elim] -> TerM (Int, Int, [[Order]]) compareArgs es = do+ liftTCM $ reportSDoc "term.compareArgs" 90 $ vcat+ [ text $ "comparing " ++ show (length es) ++ " args"+ ] pats <- terGetPatterns -- apats <- annotatePatsWithUseSizeLt pats -- reportSDoc "term.compare" 20 $@@ -986,18 +960,18 @@ -- Count the number of coinductive projection(pattern)s in caller and callee. -- Only recursive coinductive projections are eligible (Issue 1209).- projsCaller <- genericLength <$> do+ projsCaller <- length <$> do filterM (isCoinductiveProjection True) $ mapMaybe (fmap (head . unAmbQ . snd) . isProjP . getMasked) pats- projsCallee <- genericLength <$> do+ projsCallee <- length <$> do filterM (isCoinductiveProjection True) $ mapMaybe (fmap snd . isProjElim) es cutoff <- terGetCutOff let ?cutoff = cutoff- let guardedness = decr $ projsCaller - projsCallee+ let guardedness = decr True $ projsCaller - projsCallee liftTCM $ reportSDoc "term.guardedness" 30 $ sep [ text "compareArgs:"- , nest 2 $ text $ "projsCaller = " ++ show projsCaller- , nest 2 $ text $ "projsCallee = " ++ show projsCallee- , nest 2 $ text $ "guardedness of call: " ++ show guardedness+ , nest 2 $ text $ "projsCaller = " ++ prettyShow projsCaller+ , nest 2 $ text $ "projsCallee = " ++ prettyShow projsCallee+ , nest 2 $ text $ "guardedness of call: " ++ prettyShow guardedness ] return $ addGuardedness guardedness (size es) (size pats) matrix @@ -1008,35 +982,41 @@ -- off, if inductive. -- -- UNUSED-annotatePatsWithUseSizeLt :: [DeBruijnPat] -> TerM [(Bool,DeBruijnPat)]+annotatePatsWithUseSizeLt :: [DeBruijnPattern] -> TerM [(Bool,DeBruijnPattern)] annotatePatsWithUseSizeLt = loop where loop [] = return []- loop (p@(ProjDBP _ q) : pats) = ((False,p) :) <$> do projUseSizeLt q $ loop pats+ loop (p@(ProjP _ q) : pats) = ((False,p) :) <$> do projUseSizeLt q $ loop pats loop (p : pats) = (\ b ps -> (b,p) : ps) <$> terGetUseSizeLt <*> loop pats -- | @compareElim e dbpat@ -compareElim :: Elim -> Masked DeBruijnPat -> TerM Order+compareElim :: Elim -> Masked DeBruijnPattern -> TerM Order compareElim e p = do liftTCM $ do reportSDoc "term.compare" 30 $ sep [ text "compareElim"- , nest 2 $ text "e = " <+> prettyTCM e- , nest 2 $ text "p = " <+> prettyTCM p+ , nest 2 $ text "e = " <> prettyTCM e+ , nest 2 $ text "p = " <> prettyTCM p ] reportSDoc "term.compare" 50 $ sep [ nest 2 $ text $ "e = " ++ show e , nest 2 $ text $ "p = " ++ show p ] case (e, getMasked p) of- (Proj _ d, ProjDBP _ d') -> do- d <- liftTCM $ getOriginalProjection d- d' <- liftTCM $ getOriginalProjection d'- compareProj d d'- (Proj{}, _ ) -> return Order.unknown- (Apply{}, ProjDBP{}) -> return Order.unknown- (Apply arg, _) -> compareTerm (unArg arg) p+ (Proj _ d, ProjP _ d') -> do+ d <- getOriginalProjection d+ d' <- getOriginalProjection d'+ o <- compareProj d d'+ reportSDoc "term.compare" 30 $ sep+ [ text $ "comparing callee projection " ++ prettyShow d+ , text $ "against caller projection " ++ prettyShow d'+ , text $ "yields order " ++ prettyShow o+ ]+ return o+ (Proj{}, _) -> return Order.unknown+ (Apply{}, ProjP{}) -> return Order.unknown+ (Apply arg, _) -> compareTerm (unArg arg) p -- | In dependent records, the types of later fields may depend on the -- values of earlier fields. Thus when defining an inhabitant of a@@ -1061,7 +1041,7 @@ case def of Record{ recFields = fs } -> do fs <- return $ map unArg fs- case (find (d==) fs, find (d'==) fs) of+ case (List.find (d==) fs, List.find (d'==) fs) of (Just i, Just i') -- earlier field is smaller | i < i' -> return Order.lt@@ -1084,10 +1064,10 @@ -} -- | 'addGuardedness' adds guardedness flag in the upper left corner (0,0).-addGuardedness :: Integral n => Order -> n -> n -> [[Order]] -> (n, n, [[Order]])+addGuardedness :: Order -> Int -> Int -> [[Order]] -> (Int, Int, [[Order]]) addGuardedness o nrows ncols m = (nrows + 1, ncols + 1,- (o : genericReplicate ncols Order.unknown) : map (Order.unknown :) m)+ (o : replicate ncols Order.unknown) : map (Order.unknown :) m) -- | Compose something with the upper-left corner of a call matrix composeGuardedness :: (?cutoff :: CutOff) => Order -> [[Order]] -> [[Order]]@@ -1101,16 +1081,18 @@ offsetFromConstructor c = maybe 1 (const 0) <$> do liftTCM $ isRecordConstructor c --- | Compute the proper subpatterns of a 'DeBruijnPat'.-subPatterns :: DeBruijnPat -> [DeBruijnPat]-subPatterns p = case p of- ConDBP c ps -> ps ++ concatMap subPatterns ps- VarDBP _ -> []- LitDBP _ -> []- TermDBP _ -> []- ProjDBP{} -> []+-- | Compute the proper subpatterns of a 'DeBruijnPattern'.+subPatterns :: DeBruijnPattern -> [DeBruijnPattern]+subPatterns = foldPattern $ \case+ ConP _ _ ps -> map namedArg ps+ VarP _ -> mempty+ LitP _ -> mempty+ DotP _ -> mempty+ AbsurdP _ -> mempty+ ProjP _ _ -> mempty -compareTerm :: Term -> Masked DeBruijnPat -> TerM Order++compareTerm :: Term -> Masked DeBruijnPattern -> TerM Order compareTerm t p = do -- reportSDoc "term.compare" 25 $ -- text " comparing term " <+> prettyTCM t <+>@@ -1120,13 +1102,8 @@ liftTCM $ reportSDoc "term.compare" 25 $ text " comparing term " <+> prettyTCM t <+> text " to pattern " <+> prettyTCM p <+>- text (" results in " ++ show o)+ text (" results in " ++ prettyShow o) return o-{--compareTerm t p = Order.supremum $ compareTerm' t p : map cmp (subPatterns p)- where- cmp p' = (Order..*.) Order.lt (compareTerm' t p')--} -- | Remove all non-coinductive projections from an algebraic term@@ -1137,15 +1114,7 @@ instance StripAllProjections a => StripAllProjections (Arg a) where stripAllProjections = traverse stripAllProjections- -- stripAllProjections (Arg info a) = Arg info <$> stripAllProjections a -{- DOES NOT WORK, since s.th. special is needed for Elims-instance StripAllProjections a => StripAllProjections [a] where- stripAllProjections = traverse stripAllProjections--instance StripAllProjections a => StripAllProjections (Elim' a) where--}- instance StripAllProjections Elims where stripAllProjections es = case es of@@ -1172,7 +1141,7 @@ -- -- Precondition: top meta variable resolved -compareTerm' :: Term -> Masked DeBruijnPat -> TerM Order+compareTerm' :: Term -> Masked DeBruijnPattern -> TerM Order compareTerm' v mp@(Masked m p) = do suc <- terGetSizeSuc cutoff <- terGetCutOff@@ -1196,13 +1165,13 @@ -- deepest variable in @p@. -- For sized types, the depth is maximally -- the number of SIZELT hypotheses one can have in a context.- (MetaV{}, p) -> Order.decr . max (if m then 0 else patternDepth p) . pred <$>+ (MetaV{}, p) -> Order.decr True . max (if m then 0 else patternDepth p) . pred <$> terAsks _terSizeDepth -- Successor on both sides cancel each other. -- We ignore the mask for sizes.- (Def s [Apply t], ConDBP s' [p]) | s == s' && Just s == suc ->- compareTerm' (unArg t) (notMasked p)+ (Def s [Apply t], ConP s' _ [p]) | s == conName s' && Just s == suc ->+ compareTerm' (unArg t) (notMasked $ namedArg p) -- Register also size increase. (Def s [Apply t], p) | Just s == suc ->@@ -1214,7 +1183,7 @@ _ | m -> return Order.unknown - (Lit l, LitDBP l')+ (Lit l, LitP l') | l == l' -> return Order.le | otherwise -> return Order.unknown @@ -1226,47 +1195,48 @@ -- Andreas, 2011-04-19 give subterm priority over matrix order - (Con{}, ConDBP c ps) | any (isSubTerm v) ps ->- decrease <$> offsetFromConstructor c <*> return Order.le+ (Con{}, ConP c _ ps) | any (isSubTerm v . namedArg) ps ->+ decr True <$> offsetFromConstructor (conName c) - (Con c ci ts, ConDBP c' ps) | conName c == c'->+ (Con c _ ts, ConP c' _ ps) | conName c == conName c'-> compareConArgs ts ps - (Con c ci [], _) -> return Order.le+ (Con _ _ [], _) -> return Order.le -- new case for counting constructors / projections -- register also increase- (Con c ci ts, _) -> do+ (Con c _ ts, _) -> do increase <$> offsetFromConstructor (conName c) <*> (infimum <$> mapM (\ t -> compareTerm' (unArg t) mp) ts) (t, p) -> return $ subTerm t p -- | @subTerm@ computes a size difference (Order)-subTerm :: (?cutoff :: CutOff) => Term -> DeBruijnPat -> Order+subTerm :: (?cutoff :: CutOff) => Term -> DeBruijnPattern -> Order subTerm t p = if equal t p then Order.le else properSubTerm t p where equal (Shared p) dbp = equal (derefPtr p) dbp- equal (Con c ci ts) (ConDBP c' ps) =- and $ (conName c == c')+ equal (Con c _ ts) (ConP c' _ ps) =+ and $ (conName c == conName c') : (length ts == length ps)- : zipWith equal (map unArg ts) ps- equal (Var i []) (VarDBP i') = i == i'- equal (Lit l) (LitDBP l') = l == l'+ : zipWith (\ t p -> equal (unArg t) (namedArg p)) ts ps+ equal (Var i []) (VarP x) = i == dbPatVarIndex x+ equal (Lit l) (LitP l') = l == l' -- Terms. -- Checking for identity here is very fragile. -- However, we cannot do much more, as we are not allowed to normalize t. -- (It might diverge, and we are just in the process of termination checking.)- equal t (TermDBP t') = t == t'+ equal t (DotP t') = t == t' equal _ _ = False - properSubTerm t (ConDBP _ ps) = decrease 1 $ supremum $ map (subTerm t) ps+ properSubTerm t (ConP _ _ ps) =+ setUsability True $ decrease 1 $ supremum $ map (subTerm t . namedArg) ps properSubTerm _ _ = Order.unknown -isSubTerm :: (?cutoff :: CutOff) => Term -> DeBruijnPat -> Bool+isSubTerm :: (?cutoff :: CutOff) => Term -> DeBruijnPattern -> Bool isSubTerm t p = nonIncreasing $ subTerm t p -compareConArgs :: Args -> [DeBruijnPat] -> TerM Order+compareConArgs :: Args -> [NamedArg DeBruijnPattern] -> TerM Order compareConArgs ts ps = do cutoff <- terGetCutOff let ?cutoff = cutoff@@ -1276,9 +1246,9 @@ (0,0) -> return Order.le -- c <= c (0,1) -> return Order.unknown -- c not<= c x (1,0) -> __IMPOSSIBLE__- (1,1) -> compareTerm' (unArg (head ts)) (notMasked (head ps))+ (1,1) -> compareTerm' (unArg (head ts)) (notMasked $ namedArg $ head ps) (_,_) -> foldl (Order..*.) Order.le <$>- zipWithM compareTerm' (map unArg ts) (map notMasked ps)+ zipWithM compareTerm' (map unArg ts) (map (notMasked . namedArg) ps) -- corresponds to taking the size, not the height -- allows examples like (x, y) < (Succ x, y) {- version which does an "order matrix"@@ -1287,7 +1257,7 @@ -- Trigges issue 787. (_,_) -> do -- build "call matrix" m <- mapM (\t -> mapM (compareTerm' suc (unArg t)) ps) ts- let m2 = makeCM (genericLength ps) (genericLength ts) m+ let m2 = makeCM (length ps) (length ts) m return $ Order.orderMat (Order.mat m2) -} {- version which takes height@@ -1295,34 +1265,45 @@ -- else Order.infimum (zipWith compareTerm' (map unArg ts) ps) -} -compareVar :: Nat -> Masked DeBruijnPat -> TerM Order+compareVar :: Nat -> Masked DeBruijnPattern -> TerM Order compareVar i (Masked m p) = do suc <- terGetSizeSuc cutoff <- terGetCutOff let ?cutoff = cutoff let no = return Order.unknown case p of- ProjDBP{} -> no- LitDBP{} -> no- TermDBP{} -> no- VarDBP j -> compareVarVar i (Masked m j)- ConDBP s [p] | Just s == suc -> decrease 1 <$> compareVar i (notMasked p)- ConDBP c ps -> if m then no else do- decrease <$> offsetFromConstructor c- <*> (Order.supremum <$> mapM (compareVar i . notMasked) ps)+ ProjP{} -> no+ LitP{} -> no+ DotP{} -> no+ AbsurdP{} -> no+ VarP x -> compareVarVar i (Masked m x) + ConP s _ [p] | Just (conName s) == suc ->+ setUsability True . decrease 1 <$> compareVar i (notMasked $ namedArg p)++ ConP c _ ps -> if m then no else setUsability True <$> do+ decrease <$> offsetFromConstructor (conName c)+ <*> (Order.supremum <$> mapM (compareVar i . notMasked . namedArg) ps)+ -- | Compare two variables. -- -- The first variable comes from a term, the second from a pattern.-compareVarVar :: Nat -> Masked Nat -> TerM Order-compareVarVar i (Masked m j)- | i == j = if not m then return Order.le else liftTCM $+compareVarVar :: Nat -> Masked DBPatVar -> TerM Order+compareVarVar i (Masked m x@(DBPatVar _ j))+ | i == j = if not m then return Order.le else liftTCM $ -- If j is a size, we ignore the mask. ifM (isJust <$> do isSizeType =<< reduce =<< typeOfBV j) {- then -} (return Order.le) {- else -} (return Order.unknown)- | otherwise = ifNotM ((i `VarSet.member`) <$> terGetUsableVars) (return Order.unknown) $ {- else -} do+ | otherwise = do+ -- record usability of variable+ u <- (i `VarSet.member`) <$> terGetUsableVars+ -- Andreas, 2017-07-26, issue #2331.+ -- The usability logic is refuted by bounded size quantification in terms.+ -- Thus, it is switched off (the infrastructure remains in place for now).+ if not u then return Order.unknown else do+ -- Only if usable: res <- isBounded i case res of BoundedNo -> return Order.unknown- BoundedLt v -> decrease 1 <$> compareTerm' v (Masked m (VarDBP j))+ BoundedLt v -> setUsability u . decrease 1 <$> compareTerm' v (Masked m $ VarP x)
src/full/Agda/TypeChecking/Abstract.hs view
@@ -55,9 +55,10 @@ piAbstract :: (Term, EqualityView) -> Type -> TCM Type piAbstract (v, OtherType a) b = piAbstractTerm v a b-piAbstract (prf, eqt@(EqualityType s _ _ a v _)) b = do+piAbstract (prf, eqt@(EqualityType _ _ _ (Arg _ a) v _)) b = do+ s <- inferSort a let prfTy = equalityUnview eqt- vTy = El s (unArg a)+ vTy = El s a b <- abstractType prfTy prf b b <- addContext ("w", defaultDom prfTy) $ abstractType (raise 1 vTy) (unArg $ raise 1 v) b return . funType vTy . funType eqTy' . swap01 $ b@@ -108,7 +109,7 @@ let n = length args let abstr b v = do- m <- size <$> getContext+ m <- getContextSize let (a', u') = raise (m - n) (a, u) case isPrefixOf u' v of Nothing -> return v@@ -129,6 +130,11 @@ , nest 2 $ (prettyTCM =<< getContextTelescope) <+> text "⊢" , nest 2 $ sep [ prettyTCM v <+> text ":", nest 2 $ prettyTCM b ] , nest 2 $ prettyTCM err ]+ reportSDoc "impossible" 60 $+ vcat [ text "Type error in term to abstract (raw)"+ , nest 2 $ ((text . show) =<< getContextTelescope) <+> text "⊢"+ , nest 2 $ sep [ (text . show) v <+> text ":", nest 2 $ (text . show) b ]+ ] __IMPOSSIBLE__ reportSDoc "tc.abstract" 50 $ sep [ text "Resulting abstraction", nest 2 $ prettyTCM v ] modifySignature $ updateDefinitions $ HMap.delete hole
src/full/Agda/TypeChecking/CheckInternal.hs view
@@ -12,8 +12,9 @@ ( checkType , checkInternal , checkInternal'- , defaultAction, Action(..)+ , Action(..), defaultAction, eraseUnusedAction , infer+ , inferSort ) where import Control.Arrow ((&&&), (***), first, second)@@ -24,7 +25,7 @@ import Agda.Syntax.Internal import Agda.TypeChecking.Conversion-import Agda.TypeChecking.Datatypes (getConType)+import Agda.TypeChecking.Datatypes -- (getConType, getFullyAppliedConType) import Agda.TypeChecking.Level import Agda.TypeChecking.Monad import Agda.TypeChecking.Monad.Builtin@@ -42,6 +43,8 @@ #include "undefined.h" import Agda.Utils.Impossible +-- * Bidirectional rechecker+ -- -- | Entry point for e.g. checking WithFunctionType. -- checkType :: Type -> TCM () -- checkType t = -- dontAssignMetas $ ignoreSorts $@@ -96,12 +99,44 @@ checkTypeSpine :: Type -> Term -> Elims -> TCM Sort checkTypeSpine a self es = shouldBeSort =<< do snd <$> inferSpine a self es -data Action = Action { preAction :: Type -> Term -> TCM Term- , postAction :: Type -> Term -> TCM Term } +-- | 'checkInternal' traverses the whole 'Term', and we can use this+-- traversal to modify the term.+data Action = Action+ { preAction :: Type -> Term -> TCM Term+ -- ^ Called on each subterm before the checker runs.+ , postAction :: Type -> Term -> TCM Term+ -- ^ Called on each subterm after the type checking.+ , relevanceAction :: Relevance -> Relevance -> Relevance+ -- ^ Called for each @ArgInfo@.+ -- The first 'Relevance' is from the type,+ -- the second from the term.+ }++-- | The default action is to not change the 'Term' at all. defaultAction :: Action-defaultAction = Action (\ _ v -> return v) (\ _ v -> return v)+defaultAction = Action+ { preAction = \ _ -> return+ , postAction = \ _ -> return+ , relevanceAction = \ _ -> id+ } +eraseUnusedAction :: Action+eraseUnusedAction = defaultAction { postAction = eraseUnused }+ where+ eraseUnused :: Type -> Term -> TCM Term+ eraseUnused t v = case ignoreSharing v of+ Def f es -> do+ pols <- getPolarity f+ return $ Def f $ eraseIfNonvariant pols es+ _ -> return v++ eraseIfNonvariant :: [Polarity] -> Elims -> Elims+ eraseIfNonvariant [] es = es+ eraseIfNonvariant pols [] = []+ eraseIfNonvariant (Nonvariant : pols) (e : es) = (fmap DontCare e) : eraseIfNonvariant pols es+ eraseIfNonvariant (_ : pols) (e : es) = e : eraseIfNonvariant pols es+ -- | Entry point for term checking. checkInternal :: Term -> Type -> TCM () checkInternal v t = void $ checkInternal' defaultAction v t@@ -126,20 +161,16 @@ a <- metaType x checkSpine action a (MetaV x []) es t Con c ci vs -> do- -- we need to fully apply the constructor to make getConType work- TelV tel t <- telView t- addContext tel $ do- let failure = typeError $ DoesNotConstructAnElementOf (conName c) t- vs' = raise (size tel) vs ++ teleArgs tel- a <- maybe failure return =<< getConType c t+ -- We need to fully apply the constructor to make getConType work!+ fullyApplyCon c vs t $ \ _d _dt _pars a vs' tel t -> do Con c ci vs2 <- checkArgs action a (Con c ci []) vs' t- -- Strip away the extra arguments+ -- Strip away the extra arguments return $ applySubst (strengthenS __IMPOSSIBLE__ (size tel))- $ Con c ci (take (length vs) vs2)+ $ Con c ci $ take (length vs) vs2 Lit l -> Lit l <$ ((`subtype` t) =<< litType l) Lam ai vb -> do (a, b) <- shouldBePi t- checkArgInfo ai $ domInfo a+ ai <- checkArgInfo action ai $ domInfo a addContext (suggest vb b, a) $ do Lam ai . Abs (absName vb) <$> checkInternal' action (absBody vb) (absBody b) Pi a b -> do@@ -165,7 +196,41 @@ DontCare v -> DontCare <$> checkInternal' action v t Shared{} -> __IMPOSSIBLE__ -checkSpine :: Action -> Type -> Term -> Elims -> Type -> TCM Term+-- | Make sure a constructor is fully applied+-- and infer the type of the constructor.+-- Raises a type error if the constructor does not belong to the given type.+fullyApplyCon+ :: ConHead -- ^ Constructor.+ -> Args -- ^ Constructor arguments.+ -> Type -- ^ Type of the constructor application.+ -> (QName -> Type -> Args -> Type -> Args -> Telescope -> Type -> TCM a)+ -- ^ Name of the data/record type,+ -- type of the data/record type,+ -- reconstructed parameters,+ -- type of the constructor (applied to parameters),+ -- full application arguments,+ -- types of missing arguments (already added to context),+ -- type of the full application.+ -> TCM a+fullyApplyCon c vs t0 ret = do+ TelV tel t <- telView t0+ -- The type of the constructor application may still be a function+ -- type. In this case, we introduce the domains @tel@ into the context+ -- and apply the constructor to these fresh variables.+ addContext tel $ do+ getFullyAppliedConType c t >>= \case+ Nothing ->+ typeError $ DoesNotConstructAnElementOf (conName c) t+ Just ((d, dt, pars), a) ->+ ret d dt pars a (raise (size tel) vs ++ teleArgs tel) tel t++checkSpine+ :: Action+ -> Type -- ^ Type of the head @self@.+ -> Term -- ^ The head @self@.+ -> Elims -- ^ The eliminations @es@.+ -> Type -- ^ Expected type of the application @self es@.+ -> TCM Term -- ^ The application after modification by the @Action@. checkSpine action a self es t = do reportSDoc "tc.check.internal" 20 $ sep [ text "checking spine "@@ -174,27 +239,45 @@ , nest 4 $ prettyTCM es <+> text ":" , nest 2 $ prettyTCM t ] ] ((v, v'), t') <- inferSpine' action a self self es+ t' <- reduce t' v' <$ coerceSize subtype v t' t -checkArgs :: Action -> Type -> Term -> Args -> Type -> TCM Term+checkArgs+ :: Action+ -> Type -- ^ Type of the head.+ -> Term -- ^ The head.+ -> Args -- ^ The arguments.+ -> Type -- ^ Expected type of the application.+ -> TCM Term -- ^ The application after modification by the @Action@. checkArgs action a self vs t = checkSpine action a self (map Apply vs) t -- | @checkArgInfo actual expected@.-checkArgInfo :: ArgInfo -> ArgInfo -> TCM ()-checkArgInfo ai ai' = do+--+-- The @expected@ 'ArgInfo' comes from the type.+-- The @actual@ 'ArgInfo' comes from the term and can be updated+-- by an action.+checkArgInfo :: Action -> ArgInfo -> ArgInfo -> TCM ArgInfo+checkArgInfo action ai ai' = do checkHiding (getHiding ai) (getHiding ai')- checkRelevance (getRelevance ai) (getRelevance ai')+ r <- checkRelevance action (getRelevance ai) (getRelevance ai')+ return $ setRelevance r ai checkHiding :: Hiding -> Hiding -> TCM ()-checkHiding h h' = unless (h == h') $ typeError $ HidingMismatch h h'+checkHiding h h' = unless (sameHiding h h') $ typeError $ HidingMismatch h h' -checkRelevance :: Relevance -> Relevance -> TCM ()-checkRelevance r0 r0' = unless (r == r') $ typeError $ RelevanceMismatch r r'+-- | @checkRelevance action term type@.+--+-- The @term@ 'Relevance' can be updated by the @action@.+-- Note that the relevances might not match precisedly,+-- because of the non-semantic 'Forced' relevance.+checkRelevance :: Action -> Relevance -> Relevance -> TCM Relevance+checkRelevance action r0 r0' = do+ unless (r == r') $ typeError $ RelevanceMismatch r r'+ return $ relevanceAction action r0' r0 -- Argument order for actions: @type@ @term@ where r = canon r0 r' = canon r0' canon Forced{} = Relevant- canon UnusedArg = Relevant canon r = r -- | Infer type of a neutral term.@@ -252,7 +335,7 @@ case e of Apply (Arg ai v) -> do (a, b) <- shouldBePi t- checkArgInfo ai $ domInfo a+ ai <- checkArgInfo action ai $ domInfo a v' <- checkInternal' action v $ unDom a inferSpine' action (b `absApp` v) (self `applyE` [e]) (self' `applyE` [Apply (Arg ai v')]) es -- case: projection or projection-like@@ -321,5 +404,47 @@ -- | Universe subsumption and type equality (subtyping for sizes, resp.). subtype :: Type -> Type -> TCM () subtype t1 t2 = do- ifIsSort t1 (\ s1 -> (s1 `leqSort`) =<< shouldBeSort t2) $- leqType t1 t2+ ifIsSort t1 (\ s1 -> (s1 `leqSort`) =<< shouldBeSort t2) $ do+ -- Andreas, 2017-03-09, issue #2493+ -- Only check subtyping, do not solve any metas!+ -- TODO: NEED? disableDestructiveUpdate+ dontAssignMetas $ leqType t1 t2++-- | Compute the sort of a type.++inferSort :: Term -> TCM Sort+inferSort t = case ignoreSharing t of+ Var i es -> do+ a <- typeOfBV i+ (_, s) <- eliminate (Var i []) a es+ shouldBeSort s+ Def f es -> do -- f is not projection(-like)!+ a <- defType <$> getConstInfo f+ (_, s) <- eliminate (Def f []) a es+ shouldBeSort s+ MetaV x es -> do+ a <- metaType x+ (_, s) <- eliminate (MetaV x []) a es+ shouldBeSort s+ Pi a b -> return $ dLub (getSort a) (getSort <$> b)+ Sort s -> return $ sSuc s+ Con{} -> __IMPOSSIBLE__+ Lit{} -> __IMPOSSIBLE__+ Lam{} -> __IMPOSSIBLE__+ Level{} -> __IMPOSSIBLE__+ DontCare{} -> __IMPOSSIBLE__+ Shared{} -> __IMPOSSIBLE__++-- | @eliminate t self es@ eliminates value @self@ of type @t@ by spine @es@+-- and returns the remaining value and its type.+eliminate :: Term -> Type -> Elims -> TCM (Term, Type)+eliminate self t [] = return (self, t)+eliminate self t (e : es) = case e of+ Apply (Arg _ v) -> do+ (_, b) <- shouldBePi t+ eliminate (self `apply1` v) (b `absApp` v) es+ -- case: projection or projection-like+ Proj o f -> do+ (Dom ai _, b) <- shouldBePi =<< shouldBeProjectible t f+ u <- applyDef o f $ Arg ai self+ eliminate u (b `absApp` self) es
src/full/Agda/TypeChecking/CheckInternal.hs-boot view
@@ -3,6 +3,12 @@ import Agda.Syntax.Internal import Agda.TypeChecking.Monad.Base (TCM) +data Action++defaultAction :: Action+eraseUnusedAction :: Action+ checkType :: Type -> TCM () checkInternal :: Term -> Type -> TCM ()+checkInternal' :: Action -> Term -> Type -> TCM Term infer :: Term -> TCM Type
src/full/Agda/TypeChecking/CompiledClause.hs view
@@ -14,12 +14,15 @@ import qualified Data.Map as Map import Data.Map (Map) import Data.Semigroup (Semigroup, Monoid, (<>), mempty, mappend, Any(..))-import Data.Typeable (Typeable) import Data.Foldable (Foldable, foldMap)-import Data.Traversable (Traversable)+import Data.Traversable (Traversable, traverse) +import Data.Data (Data)+import Data.Typeable (Typeable)+ import Agda.Syntax.Common import Agda.Syntax.Internal+import Agda.Syntax.Internal.Generic import Agda.Syntax.Literal import Agda.Syntax.Position @@ -30,7 +33,7 @@ import Agda.Utils.Impossible data WithArity c = WithArity { arity :: Int, content :: c }- deriving (Typeable, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Functor, Foldable, Traversable, Show) -- | Branches in a case tree. @@ -46,25 +49,27 @@ , catchAllBranch :: Maybe c -- ^ (Possibly additional) catch-all clause. }- deriving (Typeable, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Functor, Foldable, Traversable, Show) -- | Case tree with bodies. -data CompiledClauses- = Case (Arg Int) (Case CompiledClauses)+data CompiledClauses' a+ = Case (Arg Int) (Case (CompiledClauses' a)) -- ^ @Case n bs@ stands for a match on the @n@-th argument -- (counting from zero) with @bs@ as the case branches. -- If the @n@-th argument is a projection, we have only 'conBranches' -- with arity 0.- | Done [Arg ArgName] Term+ | Done [Arg ArgName] a -- ^ @Done xs b@ stands for the body @b@ where the @xs@ contains hiding -- and name suggestions for the free variables. This is needed to build -- lambdas on the right hand side for partial applications which can -- still reduce. | Fail -- ^ Absurd case.- deriving (Typeable)+ deriving (Typeable, Data, Functor, Traversable, Foldable, Show) +type CompiledClauses = CompiledClauses' Term+ litCase :: Literal -> c -> Case c litCase l x = Branches False Map.empty (Map.singleton l x) Nothing @@ -86,24 +91,24 @@ Done{} -> mempty Case _ br -> maybe (foldMap loop br) (const $ Any True) $ catchAllBranch br -instance Monoid c => Semigroup (WithArity c) where+instance Semigroup c => Semigroup (WithArity c) where WithArity n1 c1 <> WithArity n2 c2- | n1 == n2 = WithArity n1 $ mappend c1 c2+ | n1 == n2 = WithArity n1 (c1 <> c2) | otherwise = __IMPOSSIBLE__ -- arity must match! -instance Monoid c => Monoid (WithArity c) where- mempty = WithArity __IMPOSSIBLE__ mempty+instance (Semigroup c, Monoid c) => Monoid (WithArity c) where+ mempty = WithArity __IMPOSSIBLE__ mempty mappend = (<>) -instance Monoid m => Semigroup (Case m) where+instance Semigroup m => Semigroup (Case m) where Branches cop cs ls m <> Branches cop' cs' ls' m' = Branches (cop || cop') -- for @projCase <> mempty@- (Map.unionWith mappend cs cs')- (Map.unionWith mappend ls ls')- (mappend m m')+ (Map.unionWith (<>) cs cs')+ (Map.unionWith (<>) ls ls')+ (m <> m') -instance Monoid m => Monoid (Case m) where- mempty = empty+instance (Semigroup m, Monoid m) => Monoid (Case m) where+ mempty = empty mappend = (<>) instance Null (Case m) where@@ -112,12 +117,6 @@ -- * Pretty instances. -instance Pretty a => Show (Case a) where- show = show . pretty--instance Show CompiledClauses where- show = show . pretty- instance Pretty a => Pretty (WithArity a) where pretty = pretty . content @@ -129,10 +128,10 @@ prC Nothing = [] prC (Just x) = [text "_ ->" <+> pretty x] -prettyMap :: (Show k, Pretty v) => Map k v -> [Doc]-prettyMap m = [ sep [ text (show x ++ " ->")+prettyMap :: (Pretty k, Pretty v) => Map k v -> [Doc]+prettyMap m = [ sep [ pretty k <+> text "->" , nest 2 $ pretty v ]- | (x, v) <- Map.toList m ]+ | (k, v) <- Map.toList m ] instance Pretty CompiledClauses where pretty (Done hs t) = text ("done" ++ show hs) <+> pretty t@@ -142,7 +141,7 @@ , nest 2 $ pretty bs ] pretty (Case n bs) =- sep [ text ("case " ++ show n ++ " of")+ sep [ text ("case " ++ prettyShow n ++ " of") , nest 2 $ pretty bs ] @@ -161,3 +160,17 @@ killRange (Case i br) = killRange2 Case i br killRange (Done xs v) = killRange2 Done xs v killRange Fail = Fail++-- * TermLike instances++instance TermLike a => TermLike (WithArity a) where+ traverseTermM = traverse . traverseTermM+ foldTerm = foldMap . foldTerm++instance TermLike a => TermLike (Case a) where+ traverseTermM = traverse . traverseTermM+ foldTerm = foldMap . foldTerm++instance TermLike a => TermLike (CompiledClauses' a) where+ traverseTermM = traverse . traverseTermM+ foldTerm = foldMap . foldTerm
src/full/Agda/TypeChecking/CompiledClause/Compile.hs view
@@ -4,6 +4,8 @@ import Prelude hiding (null) +import Control.Monad+ import Data.Maybe import Data.Monoid import qualified Data.Map as Map@@ -46,17 +48,18 @@ compileClauses mt cs = do -- Construct clauses with pattern variables bound in left-to-right order. -- Discard de Bruijn indices in patterns.- cs <- normaliseProjP cs let unBruijn cs = [ Cl (map (fmap (fmap dbPatVarName . namedThing)) $ namedClausePats c) (compiledClauseBody c) | c <- cs ] shared <- sharedFun case mt of- Nothing -> return $ compile shared $ unBruijn cs+ Nothing -> compile shared . unBruijn <$> normaliseProjP cs Just (q, t) -> do splitTree <- coverageCheck q t cs -- The coverage checker might have added some clauses (#2288)!- cs <- normaliseProjP =<< defClauses <$> getConstInfo q+ -- Throw away the unreachable clauses (#2723).+ let notUnreachable = (Just True /=) . clauseUnreachable+ cs <- normaliseProjP =<< filter notUnreachable . defClauses <$> getConstInfo q let cls = unBruijn cs reportSDoc "tc.cc" 30 $ sep $ do@@ -69,7 +72,7 @@ let cc = compileWithSplitTree shared splitTree cls reportSDoc "tc.cc" 12 $ sep [ text "compiled clauses (still containing record splits)"- , nest 2 $ text (show cc)+ , nest 2 $ return $ P.pretty cc ] cc <- translateCompiledClauses cc return cc@@ -126,6 +129,7 @@ c = headWithDefault __IMPOSSIBLE__ cs name (VarP x) = x name (DotP _) = underscore+ name AbsurdP{} = absurdPatternName name ConP{} = __IMPOSSIBLE__ name LitP{} = __IMPOSSIBLE__ name ProjP{} = __IMPOSSIBLE__@@ -144,6 +148,7 @@ properSplit LitP{} = Just False properSplit ProjP{} = Just False properSplit VarP{} = Nothing+properSplit AbsurdP{} = Nothing -- for purposes of compilation properSplit DotP{} = Nothing -- | Is this a variable pattern?@@ -152,6 +157,7 @@ isVar :: Pattern' a -> Bool isVar VarP{} = True isVar DotP{} = True+isVar AbsurdP{} = True isVar ConP{} = False isVar LitP{} = False isVar ProjP{} = False@@ -171,6 +177,7 @@ LitP l -> litCase l $ Cl (ps0 ++ ps1) b VarP{} -> fallback DotP{} -> fallback+ AbsurdP{} -> fallback where (ps0, rest) = splitAt n ps mp = unArg <$> headMaybe rest@@ -264,9 +271,15 @@ expansions = nubBy ((==) `on` (classify . unArg . snd)) . mapMaybe (notVarNth . clPats) $ cs- notVarNth ps = caseMaybe (headMaybe ps2) Nothing $ \ p ->- if isVar (unArg p) then Nothing else Just (ps1, p)- where (ps1, ps2) = splitAt n ps+ notVarNth+ :: [Arg Pattern]+ -> Maybe ([Arg Pattern] -- First @n@ patterns.+ , Arg Pattern) -- @n+1@st pattern, not a variable+ notVarNth ps = do+ let (ps1, ps2) = splitAt n ps+ p <- headMaybe ps2+ guard $ not $ isVar $ unArg p+ return (ps1, p) expand cl (qs, q) = case unArg q of@@ -293,6 +306,7 @@ count VarP{} = 1 count (ConP _ _ ps) = countVars $ map (fmap namedThing) ps count DotP{} = 1 -- dot patterns are treated as variables in the clauses+ count (AbsurdP p) = count p count _ = 0 -- | Make sure (by eta-expansion) that clause has arity at least @n@
src/full/Agda/TypeChecking/CompiledClause/Match.hs view
@@ -1,19 +1,18 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} module Agda.TypeChecking.CompiledClause.Match where import Control.Applicative import Control.Monad.Reader (asks) -import Data.List+import qualified Data.List as List import qualified Data.Map as Map import Agda.Syntax.Internal import Agda.Syntax.Common import Agda.TypeChecking.CompiledClause-import Agda.TypeChecking.Monad hiding (reportSDoc, reportSLn)+import Agda.TypeChecking.Monad import Agda.TypeChecking.Pretty import Agda.TypeChecking.Reduce import Agda.TypeChecking.Reduce.Monad as RedM@@ -97,7 +96,7 @@ -- splitting on the @n@th elimination Case (Arg _ n) bs -> do- case genericSplitAt n es of+ case splitAt n es of -- if the @n@th elimination is not supplied, no match (_, []) -> no (NotBlocked Underapplied) es -- if the @n@th elimination is @e0@@@ -172,6 +171,10 @@ -- If we reach the empty stack, then pattern matching was incomplete match' [] = {- new line here since __IMPOSSIBLE__ does not like the ' in match' -} caseMaybeM (asks envAppDef) __IMPOSSIBLE__ $ \ f -> do- traceSLn "impossible" 10- ("Incomplete pattern matching when applying " ++ show f)- __IMPOSSIBLE__+ pds <- getPartialDefs+ if f `elem` pds+ then return (NoReduction $ NotBlocked MissingClauses [])+ else do+ traceSLn "impossible" 10+ ("Incomplete pattern matching when applying " ++ show f)+ __IMPOSSIBLE__
src/full/Agda/TypeChecking/Constraints.hs view
@@ -12,7 +12,8 @@ import Control.Monad.State import Control.Monad.Trans.Maybe -import Data.List as List hiding (null)+import qualified Data.List as List+import qualified Data.Set as Set import Agda.Syntax.Internal @@ -24,6 +25,8 @@ import Agda.TypeChecking.Substitute import Agda.TypeChecking.LevelConstraints import Agda.TypeChecking.SizedTypes+import Agda.TypeChecking.MetaVars.Mention+import Agda.TypeChecking.Warnings import {-# SOURCE #-} Agda.TypeChecking.Rules.Term import {-# SOURCE #-} Agda.TypeChecking.Conversion@@ -61,7 +64,7 @@ pids <- asks envActiveProblems reportSDoc "tc.constr.add" 20 $ hsep [ text "adding constraint"- , text (show pids)+ , text (show $ Set.toList pids) , prettyTCM c ] -- Need to reduce to reveal possibly blocking metas c <- reduce =<< instantiateFull c@@ -90,7 +93,6 @@ -- Try to simplify a level constraint simpl :: Constraint -> TCM Constraint simpl c = if not $ isLvl c then return c else do- n <- genericLength <$> getContext cs <- map theConstraint <$> getAllConstraints lvls <- instantiateFull $ List.filter (isLvl . clValue) cs when (not $ null lvls) $ do@@ -149,7 +151,7 @@ -- | Wake up the constraints depending on the given meta. wakeupConstraints :: MetaId -> TCM () wakeupConstraints x = do- wakeConstraints (return . const True) -- (mentionsMeta x) -- TODO: needs fixing to cope with shared updates+ wakeConstraints (return . mentionsMeta x) solveAwakeConstraints -- | Wake up all constraints.@@ -163,12 +165,12 @@ solveAwakeConstraints' :: Bool -> TCM () solveAwakeConstraints' force = do- verboseS "profile.constraints" 10 $ liftTCM $ tickMax "max-open-constraints" . genericLength =<< getAllConstraints+ verboseS "profile.constraints" 10 $ liftTCM $ tickMax "max-open-constraints" . List.genericLength =<< getAllConstraints whenM ((force ||) . not <$> isSolvingConstraints) $ nowSolvingConstraints $ do -- solveSizeConstraints -- Andreas, 2012-09-27 attacks size constrs too early -- Ulf, 2016-12-06: Don't inherit problems here! Stored constraints -- already contain all their dependencies.- locally eActiveProblems (const []) solve+ locally eActiveProblems (const Set.empty) solve where solve = do reportSDoc "tc.constr.solve" 10 $ hsep [ text "Solving awake constraints."@@ -183,7 +185,7 @@ verboseS "profile.constraints" 10 $ liftTCM $ tick "attempted-constraints" verboseBracket "tc.constr.solve" 20 "solving constraint" $ do pids <- asks envActiveProblems- reportSDoc "tc.constr.solve" 20 $ text (show pids) <+> prettyTCM c+ reportSDoc "tc.constr.solve" 20 $ text (show $ Set.toList pids) <+> prettyTCM c solveConstraint_ c solveConstraint_ :: Constraint -> TCM ()@@ -194,8 +196,13 @@ solveConstraint_ (SortCmp cmp s1 s2) = compareSort cmp s1 s2 solveConstraint_ (LevelCmp cmp a b) = compareLevel cmp a b solveConstraint_ c0@(Guarded c pid) = do- ifM (isProblemSolved pid) (solveConstraint_ c)- (addConstraint c0)+ ifM (isProblemSolved pid)+ {-then-} (do+ reportSLn "tc.constr.solve" 50 $ "Guarding problem " ++ show pid ++ " is solved, moving on..."+ solveConstraint_ c)+ {-else-} $ do+ reportSLn "tc.constr.solve" 50 $ "Guarding problem " ++ show pid ++ " is still unsolved."+ addConstraint c0 solveConstraint_ (IsEmpty r t) = isEmptyType r t solveConstraint_ (CheckSizeLtSat t) = checkSizeLtSat t solveConstraint_ (UnBlock m) =@@ -217,6 +224,10 @@ -- -- already solved metavariables: should only happen for size -- metas (not sure why it does, Andreas?)+ -- Andreas, 2017-07-11:+ -- I think this is because the size solver instantiates+ -- some metas with infinity but does not clean up the UnBlock constraints.+ -- See also issue #2637. InstV{} -> return () -- Open (whatever that means) Open -> __IMPOSSIBLE__
src/full/Agda/TypeChecking/Conversion.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE NondecreasingIndentation #-} module Agda.TypeChecking.Conversion where @@ -7,7 +8,6 @@ import Control.Monad.Reader import Control.Monad.State -import Data.List hiding (sort) import qualified Data.List as List import Data.Traversable hiding (mapM, sequence) @@ -18,7 +18,7 @@ import Agda.TypeChecking.Monad import Agda.TypeChecking.Monad.Builtin-import Agda.TypeChecking.CompiledClause (CompiledClauses(Fail))+import Agda.TypeChecking.CompiledClause (CompiledClauses'(Fail)) import Agda.TypeChecking.MetaVars import Agda.TypeChecking.MetaVars.Occurs (killArgs,PruneResult(..)) import Agda.TypeChecking.Reduce@@ -29,7 +29,7 @@ import {-# SOURCE #-} Agda.TypeChecking.CheckInternal (infer) import Agda.TypeChecking.Errors import Agda.TypeChecking.Free-import Agda.TypeChecking.Datatypes (getConType)+import Agda.TypeChecking.Datatypes (getConType, getFullyAppliedConType) import Agda.TypeChecking.Records import Agda.TypeChecking.Pretty import Agda.TypeChecking.Injectivity@@ -169,10 +169,8 @@ ] ifM (isInstantiatedMeta x) patternViolation {-else-} $ do assignE dir x es v $ compareTermDir dir a- _ <- instantiate u- -- () <- seq u' $ return ()- reportSLn "tc.conv.term.shortcut" 50 $- "shortcut successful\n result: " ++ show u+ reportSDoc "tc.conv.term.shortcut" 50 $+ text "shortcut successful" $$ nest 2 (text "result:" <+> (pretty =<< instantiate (MetaV x es))) -- Should be ok with catchError_ but catchError is much safer since we don't -- rethrow errors. orelse m h = catchError m (\_ -> h)@@ -237,8 +235,8 @@ s <- reduce $ getSort a' mlvl <- tryMaybe primLevel reportSDoc "tc.conv.level" 60 $ nest 2 $ sep- [ text $ "a' = " ++ show a'- , text $ "mlvl = " ++ show mlvl+ [ text "a' =" <+> pretty a'+ , text "mlvl =" <+> pretty mlvl , text $ "(Just (ignoreSharing $ unEl a') == mlvl) = " ++ show (Just (ignoreSharing $ unEl a') == mlvl) ] case s of@@ -307,7 +305,7 @@ equalFun (Shared p) m n = equalFun (derefPtr p) m n equalFun (Pi dom@(Dom info _) b) m n = do name <- freshName_ $ suggest (absName b) "x"- addContext (name, dom) $ compareTerm cmp (absBody b) m' n'+ addContext' (name, dom) $ compareTerm cmp (absBody b) m' n' where (m',n') = raise 1 (m,n) `apply` [Arg info $ var 0] equalFun _ _ _ = __IMPOSSIBLE__@@ -376,6 +374,31 @@ compareAtomDir :: CompareDirection -> Type -> Term -> Term -> TCM () compareAtomDir dir a = dirToCmp (`compareAtom` a) dir +-- | Compute the head type of an elimination. For projection-like functions+-- this requires inferring the type of the principal argument.+computeElimHeadType :: QName -> Elims -> Elims -> TCM Type+computeElimHeadType f es es' = do+ def <- getConstInfo f+ -- To compute the type @a@ of a projection-like @f@,+ -- we have to infer the type of its first argument.+ if projectionArgs (theDef def) <= 0 then return $ defType def else do+ -- Find an first argument to @f@.+ let arg = case (es, es') of+ (Apply arg : _, _) -> arg+ (_, Apply arg : _) -> arg+ _ -> __IMPOSSIBLE__+ -- Infer its type.+ reportSDoc "tc.conv.infer" 30 $+ text "inferring type of internal arg: " <+> prettyTCM arg+ targ <- infer $ unArg arg+ reportSDoc "tc.conv.infer" 30 $+ text "inferred type: " <+> prettyTCM targ+ -- getDefType wants the argument type reduced.+ -- Andreas, 2016-02-09, Issue 1825: The type of arg might be+ -- a meta-variable, e.g. in interactive development.+ -- In this case, we postpone.+ fromMaybeM patternViolation $ getDefType f =<< reduce targ+ -- | Syntax directed equality on atomic values -- compareAtom :: Comparison -> Type -> Term -> Term -> TCM ()@@ -492,26 +515,7 @@ compareElims [] a (var i) es es' (Def f [], Def f' []) | f == f' -> return () (Def f es, Def f' es') | f == f' -> do- def <- getConstInfo f- -- To compute the type @a@ of a projection-like @f@,- -- we have to infer the type of its first argument.- a <- if projectionArgs (theDef def) <= 0 then return $ defType def else do- -- Find an first argument to @f@.- let arg = case (es, es') of- (Apply arg : _, _) -> arg- (_, Apply arg : _) -> arg- _ -> __IMPOSSIBLE__- -- Infer its type.- reportSDoc "tc.conv.infer" 30 $- text "inferring type of internal arg: " <+> prettyTCM arg- targ <- infer $ unArg arg- reportSDoc "tc.conv.infer" 30 $- text "inferred type: " <+> prettyTCM targ- -- getDefType wants the argument type reduced.- -- Andreas, 2016-02-09, Issue 1825: The type of arg might be- -- a meta-variable, e.g. in interactive development.- -- In this case, we postpone.- fromMaybeM patternViolation $ getDefType f =<< reduce targ+ a <- computeElimHeadType f es es' -- The polarity vector of projection-like functions -- does not include the parameters. pol <- getPolarity' cmp f@@ -519,6 +523,7 @@ (Def f es, Def f' es') -> unlessM (bothAbsurd f f') $ do trySizeUniv cmp t m n f es f' es'+ -- Due to eta-expansion, these constructors are fully applied. (Con x ci xArgs, Con y _ yArgs) | x == y -> do -- Get the type of the constructor instantiated to the datatype parameters.@@ -533,7 +538,7 @@ let impossible = do reportSDoc "impossible" 10 $ text "expected data/record type, found " <+> prettyTCM t- reportSLn "impossible" 70 $ " raw = " ++ show t+ reportSDoc "impossible" 70 $ nest 2 $ text "raw =" <+> pretty t -- __IMPOSSIBLE__ -- Andreas, 2013-10-20: in case termination checking fails -- we might get some unreduced types here.@@ -541,7 +546,7 @@ -- to solve left-over constraints. -- Thus, instead of crashing, just give up gracefully. patternViolation- maybe impossible return =<< getConType c t+ maybe impossible (return . snd) =<< getFullyAppliedConType c t equalFun t1 t2 = case (ignoreSharing t1, ignoreSharing t2) of (Pi dom1 b1, Pi dom2 b2) -> do verboseBracket "tc.conv.fun" 15 "compare function types" $ do@@ -579,7 +584,7 @@ -> TCM () -- ^ Continuation if comparison is successful. -> TCM () compareDom cmp dom1@(Dom i1 a1) dom2@(Dom i2 a2) b1 b2 errH errR cont- | getHiding dom1 /= getHiding dom2 = errH+ | not (sameHiding dom1 dom2) = errH -- Andreas 2010-09-21 compare r1 and r2, but ignore forcing annotations! | not $ compareRelevance cmp (ignoreForced $ getRelevance dom1) (ignoreForced $ getRelevance dom2) = errR@@ -594,7 +599,7 @@ -- We only need to require a1 == a2 if b2 is dependent -- If it's non-dependent it doesn't matter what we add to the context. name <- freshName_ $ suggest b1 b2- addContext (name, dom) $ cont+ addContext' (name, dom) $ cont stealConstraints pid -- Andreas, 2013-05-15 Now, comparison of codomains is not -- blocked any more by getting stuck on domains.@@ -605,6 +610,79 @@ compareRelevance CmpEq = (==) compareRelevance CmpLeq = (<=) +-- | When comparing argument spines (in compareElims) where the first arguments+-- don't match, we keep going, substituting the anti-unification of the two+-- terms in the telescope. More precisely:+--+-- @@+-- (u = v : A)[pid] w = antiUnify pid A u v us = vs : Δ[w/x]+-- -------------------------------------------------------------+-- u us = v vs : (x : A) Δ+-- @@+--+-- The simplest case of anti-unification is to return a fresh metavariable+-- (created by blockTermOnProblem), but if there's shared structure between+-- the two terms we can expose that.+--+-- This is really a crutch that lets us get away with things that otherwise+-- would require heterogenous conversion checking. See for instance issue+-- #2384.+antiUnify :: ProblemId -> Type -> Term -> Term -> TCM Term+antiUnify pid a u v = do+ ((u, v), eq) <- runReduceM (SynEq.checkSyntacticEquality u v)+ if eq then return u else do+ (u, v) <- reduce (u, v)+ case (ignoreSharing u, ignoreSharing v) of+ (Pi ua ub, Pi va vb) -> do+ wa0 <- antiUnifyType pid (unDom ua) (unDom va)+ let wa = wa0 <$ ua+ wb <- addContext wa $ antiUnifyType pid (unAbs ub) (unAbs vb)+ return $ Pi wa (wb <$ ub)+ (Lam i u, Lam _ v) ->+ case ignoreSharing $ unEl a of+ Pi a b -> Lam i . (<$ u) <$> addContext a (antiUnify pid (unAbs b) (unAbs u) (unAbs v))+ _ -> fallback+ (Var i us, Var j vs) | i == j -> maybeGiveUp $ do+ a <- typeOfBV i+ antiUnifyElims pid a (var i) us vs+ -- Andreas, 2017-07-27:+ -- It seems that nothing guarantees here that the constructors are fully+ -- applied!? Thus, @a@ could be a function type and we need the robust+ -- @getConType@ here.+ -- (Note that @patternViolation@ swallows exceptions coming from @getConType@+ -- thus, we would not see clearly if we used @getFullyAppliedConType@ instead.)+ (Con x ci us, Con y _ vs) | x == y -> maybeGiveUp $ do+ a <- maybe patternViolation (return . snd) =<< getConType x a+ antiUnifyElims pid a (Con x ci []) (map Apply us) (map Apply vs)+ (Def f us, Def g vs) | f == g, length us == length vs -> maybeGiveUp $ do+ a <- computeElimHeadType f us vs+ antiUnifyElims pid a (Def f []) us vs+ _ -> fallback+ where+ fallback = blockTermOnProblem a u pid+ maybeGiveUp m = m `catchError_` \ err ->+ case err of+ PatternErr{} -> fallback+ _ -> throwError err++antiUnifyType :: ProblemId -> Type -> Type -> TCM Type+antiUnifyType pid (El s a) (El _ b) = El s <$> antiUnify pid (sort s) a b++antiUnifyElims :: ProblemId -> Type -> Term -> Elims -> Elims -> TCM Term+antiUnifyElims pid a self [] [] = return self+antiUnifyElims pid a self (Proj o f : es1) (Proj _ g : es2) | f == g = do+ res <- projectTyped self a o f+ case res of+ Just (_, self, a) -> antiUnifyElims pid a self es1 es2+ Nothing -> patternViolation -- can fail for projection like+antiUnifyElims pid a self (Apply u : es1) (Apply v : es2) = do+ case ignoreSharing $ unEl a of+ Pi a b -> do+ w <- antiUnify pid (unDom a) (unArg u) (unArg v)+ antiUnifyElims pid (b `lazyAbsApp` w) (apply self [w <$ u]) es1 es2+ _ -> patternViolation+antiUnifyElims _ _ _ _ _ = patternViolation -- trigger maybeGiveUp in antiUnify+ -- | @compareElims pols a v els1 els2@ performs type-directed equality on eliminator spines. -- @t@ is the type of the head @v@. compareElims :: [Polarity] -> Type -> Term -> [Elim] -> [Elim] -> TCM ()@@ -640,9 +718,9 @@ , text "arg2 =" <+> prettyTCM arg2 ] reportSDoc "tc.conv.elim" 50 $ nest 2 $ vcat- [ text "v =" <+> text (show v)- , text "arg1 =" <+> text (show arg1)- , text "arg2 =" <+> text (show arg2)+ [ text "v =" <+> pretty v+ , text "arg1 =" <+> pretty arg1+ , text "arg2 =" <+> pretty arg2 , text "" ] let (pol, pols) = nextPolarity pols0@@ -667,13 +745,18 @@ pid <- newProblem_ $ applyRelevanceToContext r $ case r of Forced{} -> return ()- r | irrelevantOrUnused r ->+ r | irrelevant r -> compareIrrelevant b (unArg arg1) (unArg arg2) _ -> compareWithPol pol (flip compareTerm b) (unArg arg1) (unArg arg2) -- if comparison got stuck and function type is dependent, block arg- arg <- if dependent- then (arg1 $>) <$> blockTermOnProblem b (unArg arg1) pid+ solved <- isProblemSolved pid+ arg <- if dependent && not solved+ then do+ arg <- (arg1 $>) <$> antiUnify pid b (unArg arg1) (unArg arg2)+ reportSDoc "tc.conv.elims" 30 $ hang (text "Anti-unification:") 2 (prettyTCM arg)+ reportSDoc "tc.conv.elims" 70 $ nest 2 $ text "raw:" <+> pretty arg+ return arg else return arg1 -- continue, possibly with blocked instantiation compareElims pols (codom `lazyAbsApp` unArg arg) (apply v [arg]) els1 els2@@ -693,7 +776,7 @@ let checkArg = applyRelevanceToContext r $ case r of Forced -> return ()- r | irrelevantOrUnused r ->+ r | irrelevant r -> compareIrrelevant b (unArg arg1) (unArg arg2) _ -> compareWithPol pol (flip compareTerm b) (unArg arg1) (unArg arg2)@@ -708,7 +791,7 @@ a -> do reportSDoc "impossible" 10 $ text "unexpected type when comparing apply eliminations " <+> prettyTCM a- reportSLn "impossible" 50 $ "raw type: " ++ show a+ reportSDoc "impossible" 50 $ text "raw type:" <+> pretty a patternViolation -- Andreas, 2013-10-22 -- in case of disabled reductions (due to failing termination check)@@ -752,8 +835,8 @@ , nest 2 $ text "w =" <+> prettyTCM w ] reportSDoc "tc.conv.irr" 50 $ vcat- [ nest 2 $ text $ "v = " ++ show v- , nest 2 $ text $ "w = " ++ show w+ [ nest 2 $ text "v =" <+> pretty v+ , nest 2 $ text "w =" <+> pretty w ] try v w $ try w v $ return () where@@ -766,9 +849,9 @@ _ -> False reportSDoc "tc.conv.irr" 20 $ vcat [ nest 2 $ text $ "rel = " ++ show rel- , nest 2 $ text $ "inst = " ++ show inst+ , nest 2 $ text "inst =" <+> pretty inst ]- if not (irrelevantOrUnused rel) || inst+ if not (irrelevant rel) || inst then fallback -- Andreas, 2016-08-08, issue #2131: -- Mining for solutions for irrelevant metas is not definite.@@ -850,6 +933,8 @@ -- -- In principle, this function can host coercive subtyping, but -- currently it only tries to fix problems with hidden function types.+--+-- Precondition: @a@ and @b@ are reduced. coerce :: Term -> Type -> Type -> TCM Term coerce v t1 t2 = blockTerm t2 $ do verboseS "tc.conv.coerce" 10 $ do@@ -861,10 +946,16 @@ , text "from type t1 =" <+> prettyTCM a1 , text "to type t2 =" <+> prettyTCM a2 ]+ reportSDoc "tc.conv.coerce" 70 $+ text "coerce" <+> vcat+ [ text "term v =" <+> pretty v+ , text "from type t1 =" <+> pretty t1+ , text "to type t2 =" <+> pretty t2+ ] -- v <$ do workOnTypes $ leqType t1 t2 -- take off hidden/instance domains from t1 and t2- TelV tel1 b1 <- telViewUpTo' (-1) ((NotHidden /=) . getHiding) t1- TelV tel2 b2 <- telViewUpTo' (-1) ((NotHidden /=) . getHiding) t2+ TelV tel1 b1 <- telViewUpTo' (-1) notVisible t1+ TelV tel2 b2 <- telViewUpTo' (-1) notVisible t2 let n = size tel1 - size tel2 -- the crude solution would be -- v' = λ {tel2} → v {tel1}@@ -873,7 +964,7 @@ -- insert n many hidden args if n <= 0 then fallback else do ifBlockedType b2 (\ _ _ -> fallback) $ \ _ -> do- (args, t1') <- implicitArgs n (NotHidden /=) t1+ (args, t1') <- implicitArgs n notVisible t1 coerceSize leqType (v `apply` args) t1' t2 where fallback = coerceSize leqType v t1 t2@@ -886,18 +977,32 @@ -- TODO. -- -- For now, we do a cheap heuristics.+--+-- Precondition: types are reduced. coerceSize :: (Type -> Type -> TCM ()) -> Term -> Type -> Type -> TCM Term coerceSize leqType v t1 t2 = workOnTypes $ do+ reportSDoc "tc.conv.coerce" 70 $+ text "coerceSize" <+> vcat+ [ text "term v =" <+> pretty v+ , text "from type t1 =" <+> pretty t1+ , text "to type t2 =" <+> pretty t2+ ] let fallback = v <$ leqType t1 t2 done = caseMaybeM (isSizeType t1) fallback $ \ b1 -> return v -- Andreas, 2015-07-22, Issue 1615: -- If t1 is a meta and t2 a type like Size< v2, we need to make sure we do not miss -- the constraint v < v2! caseMaybeM (isSizeType t2) fallback $ \ b2 -> do+ -- Andreas, 2017-01-20, issue #2329:+ -- If v is not a size suitable for the solver, like a neutral term,+ -- we can only rely on the type.+ mv <- sizeMaxView v+ if any (\case{ DOtherSize{} -> True; _ -> False }) mv then fallback else do -- Andreas, 2015-02-11 do not instantiate metas here (triggers issue 1203). ifM (tryConversion $ dontAssignMetas $ leqType t1 t2) (return v) $ {- else -} do -- A (most probably weaker) alternative is to just check syn.eq. -- ifM (snd <$> checkSyntacticEquality t1 t2) (return v) $ {- else -} do+ reportSDoc "tc.conv.coerce" 20 $ text "coercing to a size type" case b2 of -- @t2 = Size@. We are done! BoundedNo -> done@@ -985,8 +1090,8 @@ leqView a@(Max as) b@(Max bs) = catchConstraint (LevelCmp CmpLeq a b) $ do reportSDoc "tc.conv.nat" 30 $ text "compareLevelView" <+>- sep [ text (show a) <+> text "=<"- , text (show b) ]+ sep [ pretty a <+> text "=<"+ , pretty b ] wrap $ case (as, bs) of -- same term@@ -1015,7 +1120,7 @@ -- remove subsumed -- Andreas, 2014-04-07: This is ok if we do not go back to equalLevel (as, bs)- | not $ null subsumed -> leqView (Max $ as \\ subsumed) (Max bs)+ | not $ null subsumed -> leqView (Max $ as List.\\ subsumed) (Max bs) where subsumed = [ a | a@(Plus m l) <- as, n <- findN l, m <= n ] -- @findN a@ finds the unique(?) term @Plus n a@ in @bs@, if any.@@ -1100,7 +1205,7 @@ -- | Precondition: levels are 'normalise'd. equalLevel' :: Level -> Level -> TCM () equalLevel' a b = do- reportSLn "tc.conv.level" 50 $ "equalLevel (" ++ show a ++ ") (" ++ show b ++ ")"+ reportSDoc "tc.conv.level" 50 $ sep [ text "equalLevel", nest 2 $ parens $ pretty a, nest 2 $ parens $ pretty b ] liftTCM $ catchConstraint (LevelCmp CmpEq a b) $ check a b where@@ -1132,8 +1237,8 @@ ] reportSDoc "tc.conv.level" 50 $ sep [ text "equalLevel"- , vcat [ nest 2 $ sep [ text (show (Max as)) <+> text "=="- , text (show (Max bs))+ , vcat [ nest 2 $ sep [ pretty (Max as) <+> text "=="+ , pretty (Max bs) ] ] ]@@ -1198,7 +1303,7 @@ notok = unlessM typeInType notOk notOk = typeError $ UnequalSorts (Type a) (Type b) postpone = do- reportSLn "tc.conv.level" 30 $ "postponing: " ++ show a ++ " == " ++ show b+ reportSDoc "tc.conv.level" 30 $ hang (text "postponing:") 2 $ hang (pretty a <+> text "==") 0 (pretty b) patternViolation closed0 [] = [ClosedLevel 0]@@ -1207,7 +1312,7 @@ -- perform assignment (Plus n (MetaLevel x as)) := bs meta n x as bs = do reportSLn "tc.meta.level" 30 $ "Assigning meta level"- reportSLn "tc.meta.level" 50 $ "meta " ++ show as ++ " " ++ show bs+ reportSDoc "tc.meta.level" 50 $ text "meta" <+> sep [prettyList $ map pretty as, prettyList $ map pretty bs] bs' <- mapM (subtr n) bs assignE DirEq x as (levelTm (Max bs')) (===) -- fallback: check equality as atoms @@ -1291,8 +1396,8 @@ [ text "equalSort" , vcat [ nest 2 $ fsep [ prettyTCM s1 <+> text "==" , prettyTCM s2 ]- , nest 2 $ fsep [ text (show s1) <+> text "=="- , text (show s2) ]+ , nest 2 $ fsep [ pretty s1 <+> text "=="+ , pretty s2 ] ] ]
src/full/Agda/TypeChecking/Coverage.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE NondecreasingIndentation #-} {-| Coverage checking, case splitting, and splitting for refine tactics.@@ -25,7 +25,8 @@ import Control.Applicative hiding (empty) #endif -import Data.List hiding (null)+import Data.Either (lefts)+import qualified Data.List as List import Data.Monoid (Any(..)) import Data.Map (Map) import qualified Data.Map as Map@@ -40,7 +41,6 @@ import Agda.Syntax.Internal.Pattern import Agda.TypeChecking.Monad-import Agda.TypeChecking.Monad.Exception import Agda.TypeChecking.Rules.LHS.Problem (allFlexVars) import Agda.TypeChecking.Rules.LHS.Unify@@ -55,17 +55,25 @@ import Agda.TypeChecking.Records import Agda.TypeChecking.Telescope import Agda.TypeChecking.MetaVars+import Agda.TypeChecking.Warnings import Agda.Interaction.Options import Agda.Utils.Either+import Agda.Utils.Except+ ( ExceptT+ , MonadError(catchError, throwError)+ , runExceptT+ ) import Agda.Utils.Functor import Agda.Utils.List import Agda.Utils.Maybe import Agda.Utils.Monad import Agda.Utils.Null import Agda.Utils.Permutation+import Agda.Utils.Pretty (prettyShow) import Agda.Utils.Size+import Agda.Utils.Suffix (nameVariant) import Agda.Utils.Tuple import Agda.Utils.Lens @@ -124,9 +132,16 @@ , scTarget = clauseType cl } -type CoverM = ExceptionT SplitError TCM+type CoverM = ExceptT SplitError TCM -- | Top-level function for checking pattern coverage.+--+-- Effects:+--+-- - Marks unreachable clauses as such in the signature.+--+-- - Adds missing instances clauses to the signature.+-- coverageCheck :: QName -> Type -> [Clause] -> TCM SplitTree coverageCheck f t cs = do TelV gamma a <- telView t@@ -145,54 +160,93 @@ let prCl cl = addContext (clauseTel cl) $ prettyTCMPatternList $ namedClausePats cl vcat- [ text $ "Coverage checking " ++ show f ++ " with patterns:"+ [ text $ "Coverage checking " ++ prettyShow f ++ " with patterns:" , nest 2 $ vcat $ map prCl cs ] -- used = actually used clauses for cover -- pss = uncovered cases- (splitTree, used, pss) <- cover f cs sc+ CoverResult splitTree used pss noex <- cover f cs sc+ reportSDoc "tc.cover.top" 10 $ vcat+ [ text "cover computed!"+ , text $ "used clauses: " ++ show used+ , text $ "non-exact clauses: " ++ show noex+ ] reportSDoc "tc.cover.splittree" 10 $ vcat [ text "generated split tree for" <+> prettyTCM f- , text $ show splitTree+ , text $ prettyShow splitTree ]- -- report an error if there are uncovered cases+ -- report a warning if there are uncovered cases,+ -- generate a catch-all clause with a metavariable as its body to avoid+ -- internal errors in the reduction machinery. unless (null pss) $ setCurrentRange cs $- typeError $ CoverageFailure f pss+ warning $ CoverageIssue f pss++ -- Andreas, 2017-08-28, issue #2723:+ -- Mark clauses as reachable or unreachable in the signature.+ let (is0, cs1) = unzip $ for (zip [0..] cs) $ \ (i, cl) ->+ let unreachable = i `Set.notMember` used in+ (boolToMaybe unreachable i, cl { clauseUnreachable = Just unreachable }) -- is = indices of unreachable clauses- let is = Set.toList $ Set.difference (Set.fromList [0..genericLength cs - 1]) used- -- report an error if there are unreachable clauses+ let is = catMaybes is0+ reportSDoc "tc.cover.top" 10 $ vcat+ [ text $ "unreachable clauses: " ++ if null is then "(none)" else show is+ ]+ -- Replace the first clauses by @cs1@. There might be more+ -- added by @inferMissingClause@.+ modifyFunClauses f $ \ cs0 -> cs1 ++ drop (length cs1) cs0++ -- Warn if there are unreachable clauses and mark them as unreachable. unless (null is) $ do- let unreached = map (cs !!) is- setCurrentRange unreached $- typeError $ UnreachableClauses f $ map namedClausePats unreached+ -- Warn about unreachable clauses.+ let unreached = filter ((Just True ==) . clauseUnreachable) cs1+ setCurrentRange (map clauseFullRange unreached) $+ warning $ UnreachableClauses f $ map namedClausePats unreached++ -- report a warning if there are clauses that are not preserved as+ -- definitional equalities and --exact-split is enabled+ unless (null noex) $ do+ let noexclauses = map (cs1 !!) $ Set.toList noex+ setCurrentRange (map clauseLHSRange noexclauses) $+ warning $ CoverageNoExactSplit f $ noexclauses return splitTree -- | Top-level function for eliminating redundant clauses in the interactive -- case splitter isCovered :: QName -> [Clause] -> SplitClause -> TCM Bool isCovered f cs sc = do- (_, _, missing) <- cover f cs sc+ CoverResult { coverMissingClauses = missing } <- cover f cs sc return $ null missing +data CoverResult = CoverResult+ { coverSplitTree :: SplitTree+ , coverUsedClauses :: Set Nat+ , coverMissingClauses :: [(Telescope, [NamedArg DeBruijnPattern])]+ , coverNoExactClauses :: Set Nat+ }+ -- | @cover f cs (SClause _ _ ps _) = return (splitTree, used, pss)@. -- checks that the list of clauses @cs@ covers the given split clause. -- Returns the @splitTree@, the @used@ clauses, and missing cases @pss@.+--+-- Effect: adds missing instance clauses for @f@ to signature.+-- cover :: QName -> [Clause] -> SplitClause ->- TCM (SplitTree, Set Nat, [[NamedArg DeBruijnPattern]])+ TCM CoverResult cover f cs sc@(SClause tel ps _ _ target) = do- reportSDoc "tc.cover.cover" 10 $ vcat+ reportSDoc "tc.cover.cover" 10 $ inTopContext $ vcat [ text "checking coverage of pattern:" , nest 2 $ text "tel =" <+> prettyTCM tel , nest 2 $ text "ps =" <+> do addContext tel $ prettyTCMPatternList ps ]- exactSplitEnabled <- optExactSplit <$> pragmaOptions cs' <- normaliseProjP cs case match cs' ps of- Yes (i,(mps,ls0))- | not exactSplitEnabled || (clauseCatchall (cs !! i) || all isTrivialPattern mps)- -> do+ Yes (i,(mps,ls0)) -> do+ exact <- allM mps isTrivialPattern+ let noExactClause = if exact || clauseCatchall (cs !! i)+ then Set.empty+ else Set.singleton i reportSLn "tc.cover.cover" 10 $ "pattern covered by clause " ++ show i -- Check if any earlier clauses could match with appropriate literals let lsis = mapMaybe (\(j,c) -> (,j) <$> matchLits c ps) $ zip [0..i-1] cs@@ -201,57 +255,45 @@ -- If we have several literal matches with the same literals -- only take the first matching clause of these. let is = Map.elems $ Map.fromListWith min $ (ls0,i) : lsis- return (SplittingDone (size tel), Set.fromList is, [])-- | otherwise -> do- reportSDoc "tc.cover.cover" 10 $ vcat- [ text $ "pattern covered by clause " ++ show i ++ " but case splitting was not exact. remaining mpats: "- , nest 2 $ vcat $ map (text . show) mps- ]- setCurrentRange (cs !! i) $- typeError $ CoverageNoExactSplit f (cs !! i)+ return $ CoverResult (SplittingDone (size tel)) (Set.fromList is) [] noExactClause No -> do reportSLn "tc.cover" 20 $ "pattern is not covered" case fmap getHiding target of- Just h | h == Instance -> do+ Just h | isInstance h -> do -- Ulf, 2016-10-31: For now we only infer instance clauses. It would -- make sense to do it also for hidden, but since the value of a -- hidden clause is expected to be forced by later clauses, it's too -- late to add it now. If it was inferrable we would have gotten a -- type error before getting to this point. inferMissingClause f sc- return (SplittingDone (size tel), Set.empty, [])- _ -> return (SplittingDone (size tel), Set.empty, [ps])+ return $ CoverResult (SplittingDone (size tel)) Set.empty [] Set.empty+ _ -> return $ CoverResult (SplittingDone (size tel)) Set.empty [(tel, ps)] Set.empty -- We need to split! -- If all clauses have an unsplit copattern, we try that first. Block res bs -> tryIf (getAny res) splitRes $ do- let done = return (SplittingDone (size tel), Set.empty, [ps])+ let done = return $ CoverResult (SplittingDone (size tel)) Set.empty [(tel, ps)] Set.empty if null bs then done else do -- Otherwise, if there are variables to split, we try them -- in the order determined by a split strategy.- reportSLn "tc.cover.strategy" 20 $ "blocking vars = " ++ show bs+ reportSLn "tc.cover.strategy" 20 $ "blocking vars = " ++ prettyShow bs -- xs is a non-empty lists of blocking variables -- try splitting on one of them xs <- splitStrategy bs tel r <- altM1 (split Inductive sc) xs case r of- Left err -> case err of- CantSplit c tel us vs -> typeError $ CoverageCantSplitOn c tel us vs- NotADatatype a -> enterClosure a $ typeError . CoverageCantSplitType- IrrelevantDatatype a -> enterClosure a $ typeError . CoverageCantSplitIrrelevantType- CoinductiveDatatype a -> enterClosure a $ typeError . CoverageCantSplitType-{- UNUSED- NoRecordConstructor a -> typeError $ CoverageCantSplitType a- -}- GenericSplitError s -> fail $ "failed to split: " ++ s+ Left err -> typeError $ SplitError err -- If we get the empty covering, we have reached an impossible case -- and are done. Right (Covering n []) ->- return (SplittingDone (size tel), Set.empty, [])+ return $ CoverResult (SplittingDone (size tel)) Set.empty [] Set.empty Right (Covering n scs) -> do- (trees, useds, psss) <- unzip3 <$> mapM (cover f cs) (map snd scs)+ results <- mapM (cover f cs) (map snd scs)+ let trees = map coverSplitTree results+ useds = map coverUsedClauses results+ psss = map coverMissingClauses results+ noex = map coverNoExactClauses results -- Jesper, 2016-03-10 We need to remember which variables were -- eta-expanded by the unifier in order to generate a correct split -- tree (see Issue 1872).@@ -265,7 +307,7 @@ ] let trees' = zipWith (etaRecordSplits (unArg n) ps) scs trees tree = SplitAt n trees'- return (tree, Set.unions useds, concat psss)+ return $ CoverResult tree (Set.unions useds) (concat psss) (Set.unions noex) where tryIf :: Monad m => Bool -> m (Maybe a) -> m a -> m a@@ -273,21 +315,25 @@ tryIf False me m = m -- Try to split result- splitRes :: TCM (Maybe (SplitTree, Set Nat, [[NamedArg DeBruijnPattern]]))+ splitRes :: TCM (Maybe CoverResult) splitRes = do reportSLn "tc.cover" 20 $ "blocked by projection pattern" -- forM is a monadic map over a Maybe here mcov <- splitResult f sc Trav.forM mcov $ \ (Covering n scs) -> do -- If result splitting was successful, continue coverage checking.- (projs, (trees, useds, psss)) <- mapSnd unzip3 . unzip <$> do+ (projs, results) <- unzip <$> do mapM (traverseF $ cover f cs <=< (snd <.> fixTarget)) scs -- OR: -- forM scs $ \ (proj, sc') -> (proj,) <$> do -- cover f cs =<< do -- snd <$> fixTarget sc'- let tree = SplitAt n $ zip projs trees- return (tree, Set.unions useds, concat psss)+ let trees = map coverSplitTree results+ useds = map coverUsedClauses results+ psss = map coverMissingClauses results+ noex = map coverNoExactClauses results+ tree = SplitAt n $ zip projs trees+ return $ CoverResult tree (Set.unions useds) (concat psss) (Set.unions noex) gatherEtaSplits :: Int -> SplitClause -> [NamedArg DeBruijnPattern] -> [NamedArg DeBruijnPattern]@@ -300,6 +346,7 @@ | n == 0 -> case p' of -- this is the main split VarP _ -> __IMPOSSIBLE__ DotP _ -> __IMPOSSIBLE__+ AbsurdP _ -> __IMPOSSIBLE__ ConP _ _ qs -> qs ++ gatherEtaSplits (-1) sc ps LitP _ -> __IMPOSSIBLE__ ProjP{} -> __IMPOSSIBLE__@@ -307,6 +354,7 @@ updateNamedArg (\ _ -> p') p : gatherEtaSplits (n-1) sc ps where p' = lookupS (scSubst sc) $ dbPatVarIndex x DotP _ -> p : gatherEtaSplits (n-1) sc ps -- count dot patterns+ AbsurdP _ -> p : gatherEtaSplits (n-1) sc ps ConP _ _ qs -> gatherEtaSplits n sc (qs ++ ps) LitP _ -> gatherEtaSplits n sc ps ProjP{} -> gatherEtaSplits n sc ps@@ -316,6 +364,7 @@ addEtaSplits k (p:ps) t = case namedArg p of VarP _ -> addEtaSplits (k+1) ps t DotP _ -> addEtaSplits (k+1) ps t+ AbsurdP _ -> addEtaSplits (k+1) ps t ConP c cpi qs -> SplitAt (p $> k) [(conName c , addEtaSplits k (qs ++ ps) t)] LitP _ -> __IMPOSSIBLE__ ProjP{} -> __IMPOSSIBLE__@@ -325,21 +374,30 @@ etaRecordSplits n ps (q , sc) t = (q , addEtaSplits 0 (gatherEtaSplits n sc ps) t) -inferMissingClause :: QName -> SplitClause -> TCM ()+-- | Append a instance clause to the clauses of a function.+inferMissingClause+ :: QName+ -- ^ Function name.+ -> SplitClause+ -- ^ Clause to add. Clause hiding (in 'clauseType') must be 'Instance'.+ -> TCM () inferMissingClause f (SClause tel ps _ mpsub (Just t)) = setCurrentRange f $ do reportSDoc "tc.cover.infer" 20 $ addContext tel $ text "Trying to infer right-hand side of type" <+> prettyTCM t cl <- addContext tel $ withModuleParameters mpsub $ do- (x, rhs) <- case getHiding t of- Instance -> newIFSMeta "" (unArg t)- Hidden -> __IMPOSSIBLE__- NotHidden -> __IMPOSSIBLE__- return $ Clause { clauseRange = noRange+ (_x, rhs) <- case getHiding t of+ Instance{} -> newIFSMeta "" (unArg t)+ Hidden -> __IMPOSSIBLE__+ NotHidden -> __IMPOSSIBLE__+ return $ Clause { clauseLHSRange = noRange+ , clauseFullRange = noRange , clauseTel = tel , namedClausePats = ps , clauseBody = Just rhs , clauseType = Just t- , clauseCatchall = False }- addClauses f [cl]+ , clauseCatchall = False+ , clauseUnreachable = Just False -- missing, thus, not unreachable+ }+ addClauses f [cl] -- Important: add at the end. inferMissingClause _ (SClause _ _ _ _ Nothing) = __IMPOSSIBLE__ splitStrategy :: BlockingVars -> Telescope -> TCM BlockingVars@@ -362,12 +420,12 @@ -- | Check that a type is a non-irrelevant datatype or a record with -- named constructor. Unless the 'Induction' argument is 'CoInductive' -- the data type must be inductive.-isDatatype :: (MonadTCM tcm, MonadException SplitError tcm) =>+isDatatype :: (MonadTCM tcm, MonadError SplitError tcm) => Induction -> Dom Type -> tcm (QName, [Arg Term], [Arg Term], [QName]) isDatatype ind at = do let t = unDom at- throw f = throwException . f =<< do liftTCM $ buildClosure t+ throw f = throwError . f =<< do liftTCM $ buildClosure t t' <- liftTCM $ reduce t case ignoreSharing $ unEl t' of Def d es -> do@@ -382,7 +440,7 @@ | isIrrelevant at && not splitOnIrrelevantDataAllowed -> throw IrrelevantDatatype | otherwise -> do- let (ps, is) = genericSplitAt np args+ let (ps, is) = splitAt np args return (d, ps, is, cs) Record{recPars = np, recConHead = con, recInduction = i} | i == Just CoInductive && ind /= CoInductive ->@@ -420,7 +478,7 @@ let n = size tel -- Andreas, 2016-10-04 issue #2236 -- Need to set origin to "Inserted" to avoid printing of hidden patterns.- xs = map (setOrigin Inserted) $ teleNamedArgs tel+ xs = map (mapArgInfo hiddenInserted) $ teleNamedArgs tel -- Compute new split clause sctel' = telFromList $ telToList (raise n sctel) ++ telToList tel -- Dot patterns in @ps@ need to be raised! (Issue 1298)@@ -455,6 +513,13 @@ ] return $ if n == 0 then (empty, sc { scTarget = newTarget }) else (tel, sc') +-- Andreas, 2017-01-18, issue #819, set visible arguments to UserWritten.+-- Otherwise, they will be printed as _.+hiddenInserted :: ArgInfo -> ArgInfo+hiddenInserted ai+ | visible ai = setOrigin UserWritten ai+ | otherwise = setOrigin Inserted ai+ -- | @computeNeighbourhood delta1 delta2 d pars ixs hix tel ps mpsub con@ -- -- @@@ -490,13 +555,9 @@ dtype <- liftTCM $ (`piApply` pars) . defType <$> getConstInfo d -- Get the real constructor name- con <- liftTCM $ getConForm c+ con <- liftTCM $ fromRight __IMPOSSIBLE__ <$> getConForm c con <- return $ con { conName = c } -- What if we restore the current name? -- Andreas, 2013-11-29 changes nothing!-{-- con <- conSrcCon . theDef <$> getConstInfo con- Con con ci [] <- liftTCM $ ignoreSharing <$> (constructorForm =<< normalise (Con con ci []))--} -- Get the type of the constructor ctype <- liftTCM $ defType <$> getConInfo con@@ -513,7 +574,7 @@ let preserve (x, t@(El _ (Def d' _))) | d == d' = (n, t) preserve (x, (El s (Shared p))) = preserve (x, El s $ derefPtr p)- preserve p = p+ preserve (x, t) = (x, t) gammal = map (fmap preserve) . telToList $ gamma0 gamma = telFromList gammal delta1Gamma = delta1 `abstract` gamma@@ -537,20 +598,21 @@ case r of NoUnify {} -> debugNoUnify $> Nothing - DontKnow{} -> do+ DontKnow errs -> do debugCantSplit- throwException $ CantSplit (conName con) (delta1 `abstract` gamma) conIxs givenIxs+ throwError $ UnificationStuck (conName con) (delta1 `abstract` gamma) conIxs givenIxs errs Unifies (delta1',rho0,_) -> do debugSubst "rho0" rho0 -- We have Δ₁' ⊢ ρ₀ : Δ₁Γ, so split it into the part for Δ₁ and the part for Γ let (rho1,rho2) = splitS (size gamma) rho0 - -- Andreas, 2015-05-01 I guess it is fine to use @noConPatternInfo@+ -- Andreas, 2015-05-01 I guess it is fine to use no @conPType@ -- as the result of splitting is never used further down the pipeline. -- After splitting, Agda reloads the file.- let conp = ConP con noConPatternInfo $ applySubst rho2 $- map (setOrigin Inserted) $ tele2NamedArgs gamma0 gamma+ -- Andreas, 2017-09-03, issue #2729: remember that pattern was generated by case split.+ let conp = ConP con (ConPatternInfo (Just ConOSplit) Nothing) $ applySubst rho2 $+ map (mapArgInfo hiddenInserted) $ tele2NamedArgs gamma0 gamma -- Andreas, 2016-09-08, issue #2166: use gamma0 for correct argument names -- Compute final context and substitution@@ -561,11 +623,11 @@ debugTel "delta'" delta' debugSubst "rho" rho- addContext tel $ debugPs ps+ debugPs tel ps -- Apply the substitution let ps' = applySubst rho ps- addContext delta' $ debugPlugged ps'+ debugPlugged delta' ps' let mpsub' = applySubst (fromPatternSubstitution rho) mpsub @@ -579,14 +641,14 @@ [ text "context=" <+> (inTopContext . prettyTCM =<< getContextTelescope) , text "con =" <+> prettyTCM con , text "ctype =" <+> prettyTCM ctype- , text "ps =" <+> do addContext tel $ prettyTCMPatternList ps+ , text "ps =" <+> do inTopContext $ addContext tel $ prettyTCMPatternList ps , text "d =" <+> prettyTCM d- , text "pars =" <+> prettyList (map prettyTCM pars)- , text "ixs =" <+> addContext delta1 (prettyList (map prettyTCM ixs))- , text "cixs =" <+> do addContext gamma $ prettyList (map prettyTCM cixs)- , text "delta1 =" <+> prettyTCM delta1- , text "delta2 =" <+> prettyTCM delta2- , text "gamma =" <+> prettyTCM gamma+ , text "pars =" <+> do prettyList $ map prettyTCM pars+ , text "ixs =" <+> do addContext delta1 $ prettyList $ map prettyTCM ixs+ , text "cixs =" <+> do addContext gamma $ prettyList $ map prettyTCM cixs+ , text "delta1 =" <+> do inTopContext $ prettyTCM delta1+ , text "delta2 =" <+> do inTopContext $ addContext delta1 $ addContext gamma $ prettyTCM delta2+ , text "gamma =" <+> do inTopContext $ addContext delta1 $ prettyTCM gamma , text "hix =" <+> text (show hix) ] ]@@ -607,15 +669,17 @@ [ text (s ++ " =") <+> prettyTCM tel ] - debugPs ps =- liftTCM $ reportSDoc "tc.cover.split.con" 20 $ nest 2 $ vcat- [ text "ps =" <+> prettyTCMPatternList ps- ]+ debugPs tel ps =+ liftTCM $ reportSDoc "tc.cover.split.con" 20 $+ inTopContext $ addContext tel $ nest 2 $ vcat+ [ text "ps =" <+> prettyTCMPatternList ps+ ] - debugPlugged ps' =- liftTCM $ reportSDoc "tc.cover.split.con" 20 $ nest 2 $ vcat- [ text "ps' =" <+> do prettyTCMPatternList ps'- ]+ debugPlugged delta' ps' =+ liftTCM $ reportSDoc "tc.cover.split.con" 20 $+ inTopContext $ addContext delta' $ nest 2 $ vcat+ [ text "ps' =" <+> do prettyTCMPatternList ps'+ ] -- | Entry point from @Interaction.MakeCase@. splitClauseWithAbsurd :: SplitClause -> Nat -> TCM (Either SplitError (Either SplitClause Covering))@@ -691,14 +755,14 @@ -> SplitClause -> BlockingVar -> TCM (Either SplitError (Either SplitClause Covering))-split' ind fixtarget sc@(SClause tel ps _ mpsub target) (BlockingVar x mcons) = liftTCM $ runExceptionT $ do+split' ind fixtarget sc@(SClause tel ps _ mpsub target) (BlockingVar x mcons) = liftTCM $ runExceptT $ do debugInit tel x ps mpsub -- Split the telescope at the variable -- t = type of the variable, Δ₁ ⊢ t (n, t, delta1, delta2) <- do- let (tel1, Dom info (n, t) : tel2) = genericSplitAt (size tel - x - 1) $ telToList tel+ let (tel1, Dom info (n, t) : tel2) = splitAt (size tel - x - 1) $ telToList tel return (n, Dom info t, telFromList tel1, telFromList tel2) -- Check that t is a datatype or a record@@ -735,7 +799,7 @@ -- if more than one constructor matches, we cannot be irrelevant -- (this piece of code is unreachable if --experimental-irrelevance is off) (_ : _ : _) | unusableRelevance (getRelevance t) ->- throwException . IrrelevantDatatype =<< do liftTCM $ buildClosure (unDom t)+ throwError . IrrelevantDatatype =<< do liftTCM $ buildClosure (unDom t) -- Andreas, 2012-10-10 fail if precomputed constructor set does not cover -- all the data type constructors@@ -749,7 +813,7 @@ [ hsep $ text "pcons =" : map prettyTCM pcons , hsep $ text "cons =" : map prettyTCM cons ]- throwException (GenericSplitError "precomputed set of constructors does not cover all cases")+ throwError (GenericSplitError "precomputed set of constructors does not cover all cases") _ -> return $ Right $ Covering (lookupPatternVar sc x) ns @@ -761,12 +825,12 @@ inContextOfDelta2 = addContext tel . escapeContext x -- Debug printing- debugInit tel x ps mpsub = liftTCM $ do+ debugInit tel x ps mpsub = liftTCM $ inTopContext $ do reportSDoc "tc.cover.top" 10 $ vcat [ text "TypeChecking.Coverage.split': split" , nest 2 $ vcat [ text "tel =" <+> prettyTCM tel- , text "x =" <+> text (show x)+ , text "x =" <+> prettyTCM x , text "ps =" <+> do addContext tel $ prettyTCMPatternList ps , text "mpsub =" <+> prettyTCM mpsub ]@@ -775,7 +839,7 @@ debugHoleAndType delta1 delta2 s ps t = liftTCM $ reportSDoc "tc.cover.top" 10 $ nest 2 $ vcat $ [ text "p =" <+> text (patVarNameToString s)- , text "ps =" <+> text (show ps)+ , text "ps =" <+> text (show ps) , text "delta1 =" <+> prettyTCM delta1 , text "delta2 =" <+> inContextOfDelta2 (prettyTCM delta2) , text "t =" <+> inContextOfT (prettyTCM t)@@ -791,7 +855,7 @@ splitResult f sc@(SClause tel ps _ _ target) = do reportSDoc "tc.cover.split" 10 $ vcat [ text "splitting result:"- , nest 2 $ text "f =" <+> text (show f)+ , nest 2 $ text "f =" <+> prettyTCM f , nest 2 $ text "target =" <+> (addContext tel $ maybe empty prettyTCM target) ] -- if we want to split projections, but have no target type, we give up@@ -801,9 +865,9 @@ case isR of Just (_r, vs, Record{ recFields = fs }) -> do reportSDoc "tc.cover" 20 $ sep- [ text $ "we are of record type _r = " ++ show _r+ [ text $ "we are of record type _r = " ++ prettyShow _r , text "applied to parameters vs = " <+> (addContext tel $ prettyTCM vs)- , text $ "and have fields fs = " ++ show fs+ , text $ "and have fields fs = " ++ prettyShow fs ] let es = patternsToElims ps -- Note: module parameters are part of ps
src/full/Agda/TypeChecking/Coverage/Match.hs view
@@ -16,11 +16,15 @@ import Agda.Syntax.Internal.Pattern () import Agda.Syntax.Literal +import Agda.TypeChecking.Monad+import Agda.TypeChecking.Records import Agda.TypeChecking.Substitute import Agda.Utils.Permutation+import Agda.Utils.Pretty ( Pretty(pretty), text, (<+>) ) import Agda.Utils.Size import Agda.Utils.List+import Agda.Utils.Monad #include "undefined.h" import Agda.Utils.Impossible@@ -68,13 +72,15 @@ buildPattern _ = Nothing -- | A pattern that matches anything (modulo eta).-isTrivialPattern :: Pattern' a -> Bool+isTrivialPattern :: (HasConstInfo m) => Pattern' a -> m Bool isTrivialPattern p = case p of- VarP{} -> True- DotP{} -> True- ConP c i ps -> isJust (conPRecord i) && all (isTrivialPattern . namedArg) ps- LitP{} -> False- ProjP{} -> False+ VarP{} -> return True+ DotP{} -> return True+ AbsurdP{} -> return True+ ConP c i ps -> andM $ (isEtaCon $ conName c)+ : (map (isTrivialPattern . namedArg) ps)+ LitP{} -> return False+ ProjP{} -> return False -- | If matching succeeds, we return the instantiation of the clause pattern vector -- to obtain the split clause pattern vector, plus the literals of the clause patterns@@ -105,6 +111,13 @@ -- @Just cons@ means that it is an non-overlapping match and -- @cons@ are the encountered constructors. } deriving (Show)++instance Pretty BlockingVar where+ pretty (BlockingVar i mcs) = case mcs of+ Nothing -> text $ "blocking var " ++ show i ++ " (overlapping)"+ Just cs -> text ("blocking var " ++ show i ++ " (non-overlapping); constructors:")+ <+> pretty cs+ type BlockingVars = [BlockingVar] -- | Lens for 'blockingVarCons'.@@ -156,6 +169,7 @@ yesMatchLit l (DotP t) = maybe No (yesMatchLit l) $ buildPattern t yesMatchLit _ ConP{} = No yesMatchLit _ ProjP{} = No+yesMatchLit _ AbsurdP{} = __IMPOSSIBLE__ yesMatchLit _ LitP{} = __IMPOSSIBLE__ -- | Check if a clause could match given generously chosen literals@@ -246,15 +260,15 @@ -- that have to be instantiated (an projection names of copattern matches) -- to make the split clause an instance of the function clause. -instance Monoid a => Semigroup (Match a) where- Yes a <> Yes b = Yes $ mappend a b+instance Semigroup a => Semigroup (Match a) where+ Yes a <> Yes b = Yes (a <> b) Yes _ <> m = m No <> _ = No Block{} <> No = No- Block r xs <> Block s ys = Block (mappend r s) $ mappend xs ys+ Block r xs <> Block s ys = Block (r <> s) (xs <> ys) m@Block{} <> Yes{} = m -instance Monoid a => Monoid (Match a) where+instance (Semigroup a, Monoid a) => Monoid (Match a) where mempty = Yes mempty mappend = (<>) @@ -281,6 +295,7 @@ matchPat _ VarP{} q = Yes ([q],[]) matchPat _ DotP{} q = mempty+matchPat _ AbsurdP{} q = mempty -- Jesper, 2014-11-04: putting 'Yes [q]' here triggers issue 1333. -- Not checking for trivial patterns should be safe here, as dot patterns are -- guaranteed to match if the rest of the pattern does, so some extra splitting@@ -294,5 +309,6 @@ | c == c' -> matchPats mlit ps qs | otherwise -> No DotP t -> maybe No (matchPat mlit p) $ buildPattern t+ AbsurdP{} -> __IMPOSSIBLE__ -- excluded by typing LitP _ -> __IMPOSSIBLE__ -- split clause has no literal patterns ProjP{} -> __IMPOSSIBLE__ -- excluded by typing
src/full/Agda/TypeChecking/Coverage/SplitTree.hs view
@@ -20,6 +20,7 @@ import Agda.Syntax.Internal as I import Agda.Utils.Monad+import Agda.Utils.Pretty #include "undefined.h" import Agda.Utils.Impossible@@ -53,12 +54,13 @@ , lblSplitArg :: Maybe (Arg Int) , lblBindings :: Maybe Int }-instance Show a => Show (SplitTreeLabel a) where- show (SplitTreeLabel Nothing Nothing (Just n)) = "done, " ++ show n ++ " bindings"- show (SplitTreeLabel Nothing (Just n) Nothing) = "split at " ++ show n- show (SplitTreeLabel (Just q) Nothing (Just n)) = show q ++ " -> done, " ++ show n ++ " bindings"- show (SplitTreeLabel (Just q) (Just n) Nothing) = show q ++ " -> split at " ++ show n- show _ = __IMPOSSIBLE__+instance Pretty a => Pretty (SplitTreeLabel a) where+ pretty = \case+ SplitTreeLabel Nothing Nothing (Just n) -> text $ "done, " ++ show n ++ " bindings"+ SplitTreeLabel Nothing (Just n) Nothing -> text $ "split at " ++ show n+ SplitTreeLabel (Just q) Nothing (Just n) -> pretty q <+> text (" -> done, " ++ show n ++ " bindings")+ SplitTreeLabel (Just q) (Just n) Nothing -> pretty q <+> text (" -> split at " ++ show n)+ _ -> __IMPOSSIBLE__ -- | Convert a split tree into a 'Data.Tree' (for printing). toTree :: SplitTree' a -> Tree (SplitTreeLabel a)@@ -72,5 +74,5 @@ setCons :: a -> Tree (SplitTreeLabel a) -> Tree (SplitTreeLabel a) setCons c (Node l ts) = Node (l { lblConstructorName = Just c }) ts -instance Show a => Show (SplitTree' a) where- show = drawTree . fmap show . toTree+instance Pretty a => Pretty (SplitTree' a) where+ pretty = text . drawTree . fmap prettyShow . toTree
src/full/Agda/TypeChecking/Datatypes.hs view
@@ -3,6 +3,7 @@ module Agda.TypeChecking.Datatypes where import Data.Maybe (fromMaybe)+import qualified Data.List as List import Agda.Syntax.Common import Agda.Syntax.Internal@@ -11,9 +12,12 @@ import Agda.TypeChecking.Monad.Builtin (constructorForm) import Agda.TypeChecking.Telescope import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Pretty -import Agda.Utils.Size+import Agda.Utils.Either import Agda.Utils.Functor+import Agda.Utils.Pretty ( prettyShow )+import Agda.Utils.Size #include "undefined.h" import Agda.Utils.Impossible@@ -23,21 +27,20 @@ --------------------------------------------------------------------------- -- | Get true constructor with record fields.-getConHead :: QName -> TCM ConHead-getConHead c = conSrcCon . theDef <$> getConstInfo c+getConHead :: QName -> TCM (Either SigError ConHead)+getConHead c = mapRight (conSrcCon . theDef) <$> getConstInfo' c -- | Get true constructor with fields, expanding literals to constructors -- if possible.-getConForm :: QName -> TCM ConHead-getConForm c = do- ch <- getConHead c+getConForm :: QName -> TCM (Either SigError ConHead)+getConForm c = caseEitherM (getConHead c) (return . Left) $ \ ch -> do Con con _ [] <- ignoreSharing <$> constructorForm (Con ch ConOCon [])- return con+ return $ Right con -- | Augment constructor with record fields (preserve constructor name). -- The true constructor might only surface via 'reduce'.-getOrigConHead :: QName -> TCM ConHead-getOrigConHead c = setConName c <$> getConHead c+getOrigConHead :: QName -> TCM (Either SigError ConHead)+getOrigConHead c = mapRight (setConName c) <$> getConHead c -- | Get the name of the datatype constructed by a given constructor. -- Precondition: The argument must refer to a constructor@@ -50,31 +53,96 @@ _ -> __IMPOSSIBLE__ -- | @getConType c t@ computes the constructor parameters from type @t@--- and returns the instantiated type of constructor @c@.+-- and returns them plus the instantiated type of constructor @c@.+-- This works also if @t@ is a function type ending in a data/record type;+-- the term from which @c@ comes need not be fully applied+-- -- @Nothing@ if @t@ is not a data/record type or does not have -- a constructor @c@.--- Precondition: @t@ is reduced.-getConType :: ConHead -> Type -> TCM (Maybe Type)+getConType+ :: ConHead -- ^ Constructor.+ -> Type -- ^ Ending in data/record type.+ -> TCM (Maybe ((QName, Type, Args), Type))+ -- ^ @Nothing@ if not ends in data or record type.+ --+ -- @Just ((d, dt, pars), ct)@ otherwise, where+ -- @d@ is the data or record type name,+ -- @dt@ is the type of the data or record name,+ -- @pars@ are the reconstructed parameters,+ -- @ct@ is the type of the constructor instantiated to the parameters. getConType c t = do- c <- getConHead $ conName c+ reportSDoc "tc.getConType" 30 $ sep $+ [ text "getConType: constructor "+ , prettyTCM c+ , text " at type "+ , prettyTCM t+ ]+ TelV tel t <- telView t+ -- Now @t@ lives under @tel@, we need to remove the dependency on @tel@.+ -- This will succeed if @t@ is indeed a data/record type that is the+ -- type of a constructor coming from a term+ -- (applied to at least the parameters).+ -- Note: @t@ will have some unbound deBruijn indices if view outside of @tel@.+ reportSLn "tc.getConType" 35 $ " target type: " ++ prettyShow t+ applySubst (strengthenS __IMPOSSIBLE__ (size tel)) <$> do+ addContext tel $ getFullyAppliedConType c t+ -- Andreas, 2017-08-18, issue #2703:+ -- The original code+ -- getFullyAppliedConType c $ applySubst (strengthenS __IMPOSSIBLE__ (size tel)) t+ -- crashes because substitution into @Def@s is slightly too strict+ -- (see @defApp@ and @canProject@).+ -- Strengthening the parameters after the call to @getFullyAppliedConType@+ -- does not produce intermediate terms with __IMPOSSIBLE__s and this thus+ -- robust wrt. strictness/laziness of substitution.++-- | @getFullyAppliedConType c t@ computes the constructor parameters+-- from data type @t@ and returns them+-- plus the instantiated type of constructor @c@.+--+-- @Nothing@ if @t@ is not a data/record type or does not have+-- a constructor @c@.+--+-- Precondition: @t@ is reduced.+getFullyAppliedConType+ :: ConHead -- ^ Constructor.+ -> Type -- ^ Reduced type of the fully applied constructor.+ -> TCM (Maybe ((QName, Type, Args), Type))+ -- ^ @Nothing@ if not data or record type.+ --+ -- @Just ((d, dt, pars), ct)@ otherwise, where+ -- @d@ is the data or record type name,+ -- @dt@ is the type of the data or record name,+ -- @pars@ are the reconstructed parameters,+ -- @ct@ is the type of the constructor instantiated to the parameters.+getFullyAppliedConType c t = do+ reportSLn "tc.getConType" 35 $ List.intercalate " " $+ [ "getFullyAppliedConType", prettyShow c, prettyShow t ]+ c <- fromRight __IMPOSSIBLE__ <$> do getConHead $ conName c case ignoreSharing $ unEl t of+ -- Note that if we come e.g. from getConType,+ -- then the non-parameter arguments of @es@ might contain __IMPOSSIBLE__+ -- coming from strengthening. (Thus, printing them is not safe.) Def d es -> do- def <- theDef <$> getConstInfo d- case def of+ reportSLn "tc.getConType" 35 $ List.intercalate " " $+ [ "getFullyAppliedConType: case Def", prettyShow d, prettyShow es ]+ def <- getConstInfo d+ let cont n = do+ -- At this point we can be sure that the parameters are well-scoped.+ let pars = fromMaybe __IMPOSSIBLE__ $ allApplyElims $ take n es+ Just . ((d, defType def, pars),) <$> do+ (`piApplyM` pars) . defType =<< getConInfo c+ case theDef def of Datatype { dataPars = n, dataCons = cs } | conName c `elem` cs -> cont n Record { recPars = n, recConHead = con } | c == con -> cont n _ -> return Nothing- where- cont n = do- let pars = fromMaybe __IMPOSSIBLE__ $ allApplyElims $ take n es- Just <$> do (`piApplyM` pars) . defType =<< getConInfo c _ -> return Nothing data HasEta = NoEta | YesEta deriving (Eq) -data ConstructorInfo = DataCon Nat -- arity- | RecordCon HasEta [Arg QName]+data ConstructorInfo+ = DataCon Nat -- ^ Arity.+ | RecordCon HasEta [Arg QName] -- ^ List of field names. -- | Return the number of non-parameter arguments to a data constructor, -- or the field names of a record constructor.@@ -83,28 +151,16 @@ -- use @either id size <$> getConstructorArity c@. getConstructorInfo :: QName -> TCM ConstructorInfo getConstructorInfo c = do- Defn{ defType = t, theDef = def } <- getConstInfo c- case def of- Constructor{ conData = d, conPars = n } -> do- def <- theDef <$> getConstInfo d- case def of+ (theDef <$> getConstInfo c) >>= \case+ Constructor{ conData = d, conArity = n } -> do+ (theDef <$> getConstInfo d) >>= \case r@Record{ recFields = fs } -> return $ RecordCon (if recEtaEquality r then YesEta else NoEta) fs- Datatype{} -> do- -- TODO: I do not want to take the type of constructor apart- -- to see its arity!- TelV tel _ <- telView t- return $ DataCon $ size tel - n+ Datatype{} ->+ return $ DataCon n _ -> __IMPOSSIBLE__ _ -> __IMPOSSIBLE__ -getConstructorArity :: QName -> TCM Nat-getConstructorArity c =- for (getConstructorInfo c) $ \i ->- case i of- DataCon n -> n- RecordCon _ fs -> size fs- --------------------------------------------------------------------------- -- * Data types ---------------------------------------------------------------------------@@ -117,9 +173,6 @@ Datatype{} -> return True Record{recNamedCon = namedC} -> return namedC _ -> return False--data DataOrRecord = IsData | IsRecord- deriving (Eq, Ord, Show) -- | Check if a name refers to a datatype or a record. isDataOrRecordType :: QName -> TCM (Maybe DataOrRecord)
src/full/Agda/TypeChecking/Datatypes.hs-boot view
@@ -5,5 +5,5 @@ import Agda.TypeChecking.Monad.Signature import Agda.Syntax.Internal -getConHead :: QName -> TCM ConHead+getConHead :: QName -> TCM (Either SigError ConHead) getConstructorData :: HasConstInfo m => QName -> m QName
src/full/Agda/TypeChecking/DisplayForm.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE UndecidableInstances #-} -- for Arg a => Elim' a -- | Tools for 'DisplayTerm' and 'DisplayForm'. @@ -22,10 +23,11 @@ import Agda.TypeChecking.Level import Agda.TypeChecking.Reduce (instantiate) -import Agda.Utils.List-import Agda.Utils.Maybe import Agda.Utils.Except import Agda.Utils.Functor+import Agda.Utils.List+import Agda.Utils.Maybe+import Agda.Utils.Pretty ( prettyShow ) #include "undefined.h" import Agda.Utils.Impossible@@ -56,7 +58,7 @@ unless (null odfs) $ verboseS "tc.display.top" 100 $ do n <- getContextId reportSLn "tc.display.top" 100 $- "displayForm for " ++ show q ++ ": context = " ++ show n +++ "displayForm for " ++ prettyShow q ++ ": context = " ++ show n ++ ", dfs = " ++ show odfs -- Use only the display forms that can be opened in the current context. dfs <- catMaybes <$> mapM getLocal odfs@@ -68,7 +70,7 @@ -- Not safe when printing non-terminating terms. -- (nfdfs, us) <- normalise (dfs, es) unless (null odfs) $ reportSLn "tc.display.top" 100 $ unlines- [ "name : " ++ show q+ [ "name : " ++ prettyShow q , "displayForms: " ++ show dfs , "arguments : " ++ show es , "matches : " ++ show ms@@ -103,8 +105,8 @@ | length ps > length es = mzero | otherwise = do let (es0, es1) = splitAt (length ps) es- us <- match ps $ raise 1 es0- return (d, applySubst (parallelS $ reverse us) v `applyE` es1)+ us <- reverse <$> do match ps $ raise 1 es0+ return (d, substWithOrigin (parallelS $ map woThing us) us v `applyE` es1) -- | Class @Match@ for matching a term @p@ in the role of a pattern -- against a term @v@.@@ -122,13 +124,13 @@ -- (It has been substituted by __IMPOSSIBLE__ which corresponds to -- a raise by -1). class Match a where- match :: a -> a -> MaybeT TCM [Term]+ match :: a -> a -> MaybeT TCM [WithOrigin Term] instance Match a => Match [a] where match xs ys = concat <$> zipWithM match xs ys instance Match a => Match (Arg a) where- match p v = match (unArg p) (unArg v)+ match p v = map (setOrigin (getOrigin v)) <$> match (unArg p) (unArg v) instance Match a => Match (Elim' a) where match p v =@@ -139,7 +141,7 @@ instance Match Term where match p v = lift (instantiate v) >>= \ v -> case (ignoreSharing p, ignoreSharing v) of- (Var 0 [], v) -> return [strengthen __IMPOSSIBLE__ v]+ (Var 0 [], v) -> return [ WithOrigin Inserted $ strengthen __IMPOSSIBLE__ v ] (Var i ps, Var j vs) | i == j -> match ps vs (Def c ps, Def d vs) | c == d -> match ps vs (Con c _ ps, Con d _ vs) | c == d -> match ps vs@@ -161,3 +163,74 @@ p <- reallyUnLevelView p v <- reallyUnLevelView v match p v++-- | Substitute terms with origin into display terms,+-- replacing variables along with their origins.+--+-- The purpose is to replace the pattern variables in a with-display form,+-- and only on the top level of the lhs. Thus, we are happy to fall back+-- to ordinary substitution where it does not matter.+-- This fixes issue #2590.++class SubstWithOrigin a where+ substWithOrigin :: Substitution -> [WithOrigin Term] -> a -> a++instance SubstWithOrigin a => SubstWithOrigin [a] where+ substWithOrigin rho ots = map (substWithOrigin rho ots)++instance SubstWithOrigin (Arg a) => SubstWithOrigin (Elim' a) where+ substWithOrigin rho ots (Apply arg) = Apply $ substWithOrigin rho ots arg+ substWithOrigin rho ots e@Proj{} = e++instance SubstWithOrigin (Arg Term) where+ substWithOrigin rho ots (Arg ai v) =+ case ignoreSharing v of+ -- pattern variable: replace origin if better+ Var x [] -> case ots !!! x of+ Just (WithOrigin o u) -> Arg (mapOrigin (replaceOrigin o) ai) u+ Nothing -> Arg ai $ applySubst rho v -- Issue #2717, not __IMPOSSIBLE__+ -- constructor: recurse+ Con c ci args -> Arg ai $ Con c ci $ substWithOrigin rho ots args+ -- def: recurse+ Def q es -> Arg ai $ Def q $ substWithOrigin rho ots es+ -- otherwise: fall back to ordinary substitution+ _ -> Arg ai $ applySubst rho v+ where+ replaceOrigin _ UserWritten = UserWritten+ replaceOrigin o _ = o++instance SubstWithOrigin Term where+ substWithOrigin rho ots v =+ case ignoreSharing v of+ -- constructor: recurse+ Con c ci args -> Con c ci $ substWithOrigin rho ots args+ -- def: recurse+ Def q es -> Def q $ substWithOrigin rho ots es+ -- otherwise: fall back to oridinary substitution+ _ -> applySubst rho v++-- Do not go into dot pattern, otherwise interaction test #231 fails+instance SubstWithOrigin DisplayTerm where+ substWithOrigin rho ots dt =+ case dt of+ DTerm v -> DTerm $ substWithOrigin rho ots v+ DDot v -> DDot $ applySubst rho v+ DDef q es -> DDef q $ substWithOrigin rho ots es+ DCon c ci args -> DCon c ci $ substWithOrigin rho ots args+ DWithApp t ts es -> DWithApp+ (substWithOrigin rho ots t)+ (substWithOrigin rho ots ts)+ (substWithOrigin rho ots es)++-- Do not go into dot pattern, otherwise interaction test #231 fails+instance SubstWithOrigin (Arg DisplayTerm) where+ substWithOrigin rho ots (Arg ai dt) =+ case dt of+ DTerm v -> fmap DTerm $ substWithOrigin rho ots $ Arg ai v+ DDot v -> Arg ai $ DDot $ applySubst rho v+ DDef q es -> Arg ai $ DDef q $ substWithOrigin rho ots es+ DCon c ci args -> Arg ai $ DCon c ci $ substWithOrigin rho ots args+ DWithApp t ts es -> Arg ai $ DWithApp+ (substWithOrigin rho ots t)+ (substWithOrigin rho ots ts)+ (substWithOrigin rho ots es)
src/full/Agda/TypeChecking/Empty.hs view
@@ -1,9 +1,13 @@ -module Agda.TypeChecking.Empty where+module Agda.TypeChecking.Empty (isEmptyType) where import Control.Applicative import Control.Monad+import Control.Monad.Except +import Data.Semigroup+import Data.Monoid+ import Agda.Syntax.Common import Agda.Syntax.Internal import Agda.Syntax.Internal.Pattern@@ -12,31 +16,75 @@ import Agda.TypeChecking.Monad import Agda.TypeChecking.Coverage import Agda.TypeChecking.Constraints+import Agda.TypeChecking.Records import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope +import Agda.Utils.Either+import Agda.Utils.Monad++data ErrorNonEmpty+ = Fail -- ^ Generic failure+ | FailBecause TCErr -- ^ Failure with informative error+ | DontKnow -- ^ Emptyness check blocked++instance Semigroup ErrorNonEmpty where+ DontKnow <> _ = DontKnow+ _ <> DontKnow = DontKnow+ FailBecause err <> _ = FailBecause err+ Fail <> err = err++instance Monoid ErrorNonEmpty where+ mempty = Fail+ mappend = (Data.Semigroup.<>)+ -- | Check whether a type is empty. -- This check may be postponed as emptiness constraint.- isEmptyType :: Range -> Type -> TCM ()-isEmptyType r t = do- let postpone t = addConstraint $ IsEmpty r t- -- If t is blocked or a meta, we cannot decide emptiness now. Postpone.- ifBlockedType t (\ _ t -> postpone t) $ {- else -} \ t -> do- -- from the current context xs:ts, create a pattern list- -- xs _ : ts t and try to split on _ (the last variable)- tel0 <- getContextTelescope- let gamma = telToList tel0 ++ [domFromArg $ defaultArg (underscore, t)]- tel = telFromList gamma- ps = teleNamedArgs tel+isEmptyType r t = caseEitherM (loop t) failure return+ where+ failure DontKnow = addConstraint $ IsEmpty r t+ failure (FailBecause err) = throwError err+ failure Fail = typeError $ ShouldBeEmpty t [] - dontAssignMetas $ do- r <- splitLast Inductive tel ps- case r of- Left (CantSplit c tel us vs) -> postpone t- Left _ -> typeError $ ShouldBeEmpty t []- Right cov -> do- let cs = splitClauses cov- unless (null cs) $- typeError $ ShouldBeEmpty t $ map (namedArg . last . scPats) cs+ -- Either the type is possibly non-empty (Left err) or it is really empty+ -- (Right ()).+ loop :: Type -> TCM (Either ErrorNonEmpty ())+ loop t = do+ mr <- tryRecordType t+ case mr of++ -- If t is blocked or a meta, we cannot decide emptiness now. Postpone.+ Left Nothing -> return $ Left DontKnow++ -- If t is not a record type, try to split+ Left (Just t) -> do+ -- from the current context xs:ts, create a pattern list+ -- xs _ : ts t and try to split on _ (the last variable)+ tel0 <- getContextTelescope+ let gamma = telToList tel0 ++ [domFromArg $ defaultArg (underscore, t)]+ tel = telFromList gamma+ ps = teleNamedArgs tel++ dontAssignMetas $ do+ r <- splitLast Inductive tel ps+ case r of+ Left UnificationStuck{} -> return $ Left DontKnow+ Left _ -> return $ Left Fail+ Right cov -> do+ let ps = map (namedArg . last . scPats) $ splitClauses cov+ if (null ps) then return (Right ()) else+ Left . FailBecause <$> do typeError_ $ ShouldBeEmpty t ps++ -- If t is a record type, see if any of the field types is empty+ Right (r, pars, def) -> do+ if not $ recEtaEquality def then return $ Left Fail else do+ checkTel $ recTel def `apply` pars++ checkTel :: Telescope -> TCM (Either ErrorNonEmpty ())+ checkTel EmptyTel = return $ Left Fail+ checkTel (ExtendTel dom tel) = orEitherM+ [ loop (unDom dom)+ , underAbstraction dom tel checkTel+ ]
src/full/Agda/TypeChecking/Errors.hs view
@@ -5,10 +5,15 @@ module Agda.TypeChecking.Errors ( prettyError+ , prettyWarning , tcErrString+ , prettyTCWarnings' , prettyTCWarnings , tcWarningsToError , applyFlagsToTCWarnings+ , dropTopLevelModule+ , stringTCErr+ , sayWhen ) where import Prelude hiding (null)@@ -16,6 +21,10 @@ import Control.Monad.Reader import Control.Monad.State +#if __GLASGOW_HASKELL__ <= 708+import Data.Foldable (foldMap)+#endif+ import Data.Function import Data.List (nub, sortBy, intersperse, isInfixOf) import Data.Maybe@@ -42,23 +51,27 @@ import Agda.TypeChecking.Monad.Base import Agda.TypeChecking.Monad.Closure import Agda.TypeChecking.Monad.Context+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.Options import Agda.TypeChecking.Monad.Builtin import Agda.TypeChecking.Monad.State import Agda.TypeChecking.Positivity import Agda.TypeChecking.Pretty import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Telescope ( ifPiType ) import Agda.TypeChecking.Reduce (instantiate) import Agda.Utils.Except ( MonadError(catchError, throwError) ) import Agda.Utils.FileName import Agda.Utils.Function+import Agda.Utils.Functor import Agda.Utils.List import Agda.Utils.Maybe import Agda.Utils.Monad import Agda.Utils.Null-import Agda.Utils.Size+import Agda.Utils.Pretty ( prettyShow ) import qualified Agda.Utils.Pretty as P+import Agda.Utils.Size #include "undefined.h" import Agda.Utils.Impossible@@ -86,15 +99,15 @@ --------------------------------------------------------------------------- instance PrettyTCM TCWarning where- prettyTCM (TCWarning tcst clw) = localState $ do- put tcst- sayWhen (envRange $ clEnv clw)- (envCall $ clEnv clw)- (prettyTCM $ clValue clw)+ prettyTCM = return . tcWarningPrintedWarning instance PrettyTCM Warning where- prettyTCM wng = case wng of+ prettyTCM = prettyWarning +{-# SPECIALIZE prettyWarning :: Warning -> TCM Doc #-}+prettyWarning :: MonadTCM tcm => Warning -> tcm Doc+prettyWarning wng = liftTCM $ case wng of+ UnsolvedMetaVariables ms -> fsep ( pwords "Unsolved metas at the following locations:" ) $$ nest 2 (vcat $ map prettyTCM ms)@@ -115,19 +128,38 @@ then d else d $$ nest 4 (text "[ at" <+> prettyTCM r <+> text "]") - TerminationIssue tes ->+ TerminationIssue tes -> do+ dropTopLevel <- topLevelModuleDropper fwords "Termination checking failed for the following functions:"- $$ (nest 2 $ fsep $ punctuate comma $- map (pretty . dropTopLevelModule) $- concatMap termErrFunctions tes)- $$ fwords "Problematic calls:"- $$ (nest 2 $ fmap (P.vcat . nub) $- mapM prettyTCM $ sortBy (compare `on` callInfoRange) $- concatMap termErrCalls tes)+ $$ (nest 2 $ fsep $ punctuate comma $+ map (pretty . dropTopLevel) $+ concatMap termErrFunctions tes)+ $$ fwords "Problematic calls:"+ $$ (nest 2 $ fmap (P.vcat . nub) $+ mapM prettyTCM $ sortBy (compare `on` callInfoRange) $+ concatMap termErrCalls tes) + UnreachableClauses f pss -> fsep $+ pwords "Unreachable" ++ pwords (plural (length pss) "clause")+ where+ plural 1 thing = thing+ plural n thing = thing ++ "s"++ CoverageIssue f pss -> fsep (+ pwords "Incomplete pattern matching for" ++ [prettyTCM f <> text "."] +++ pwords "Missing cases:") $$ nest 2 (vcat $ map display pss)+ where+ display (tel, ps) = prettyTCM $ NamedClause f True $+ empty { clauseTel = tel, namedClausePats = ps }++ CoverageNoExactSplit f cs -> vcat $+ [ fsep $ pwords "Exact splitting is enabled, but the following" ++ pwords (singPlural cs "clause" "clauses") +++ pwords "could not be preserved as definitional equalities in the translation to a case tree:"+ ] +++ map (nest 2 . prettyTCM . NamedClause f True) cs+ NotStrictlyPositive d ocs -> fsep $- [prettyTCM (dropTopLevelModule d)] ++- pwords "is not strictly positive, because it occurs"+ [prettyTCM d] ++ pwords "is not strictly positive, because it occurs" ++ [prettyTCM ocs] OldBuiltin old new -> fwords $@@ -136,10 +168,51 @@ EmptyRewritePragma -> fsep . pwords $ "Empty REWRITE pragma" + UselessPublic -> fwords $ "Keyword `public' is ignored here"++ UselessInline q -> fsep $+ pwords "It is pointless for INLINE'd function" ++ [prettyTCM q] +++ pwords "to have a separate Haskell definition"++ GenericWarning d -> return d++ GenericNonFatalError d -> return d++ SafeFlagPostulate e -> fsep $+ pwords "Cannot postulate" ++ [pretty e] ++ pwords "with safe flag"++ SafeFlagPragma xs ->+ let plural | length xs == 1 = ""+ | otherwise = "s"+ in fsep $ [fwords ("Cannot set OPTION pragma" ++ plural)]+ ++ map text xs ++ [fwords "with safe flag."]++ SafeFlagNonTerminating -> fsep $+ pwords "Cannot use NON_TERMINATING pragma with safe flag."++ SafeFlagTerminating -> fsep $+ pwords "Cannot use TERMINATING pragma with safe flag."++ SafeFlagPrimTrustMe -> fsep (pwords "Cannot use primTrustMe with safe flag")++ SafeFlagNoPositivityCheck -> fsep $+ pwords "Cannot use NO_POSITIVITY_CHECK pragma with safe flag."++ SafeFlagPolarity -> fsep $+ pwords "The POLARITY pragma must not be used in safe mode."+ ParseWarning pw -> pretty pw + DeprecationWarning old new version -> fsep $+ [text old] ++ pwords "has been deprecated. Use" ++ [text new] ++ pwords+ "instead. This will be an error in Agda" ++ [text version <> text "."]++ NicifierIssue ws -> vcat $ do+ for ws $ \ w -> do+ sayWhere (getRange w) $ pretty w+ prettyTCWarnings :: [TCWarning] -> TCM String-prettyTCWarnings = fmap (unlines . intersperse " ") . prettyTCWarnings'+prettyTCWarnings = fmap (unlines . intersperse "") . prettyTCWarnings' prettyTCWarnings' :: [TCWarning] -> TCM [String] prettyTCWarnings' = mapM (fmap show . prettyTCM)@@ -157,24 +230,51 @@ applyFlagsToTCWarnings :: IgnoreFlags -> [TCWarning] -> TCM [TCWarning] applyFlagsToTCWarnings ifs ws = do + -- For some reason some SafeFlagPragma seem to be created multiple times.+ -- This is a way to collect all of them and remove duplicates.+ let pragmas w = case tcWarning w of { SafeFlagPragma ps -> ([w], ps); _ -> ([], []) }+ let sfp = case fmap nub (foldMap pragmas ws) of+ (TCWarning r w p:_, sfp) ->+ [TCWarning r (SafeFlagPragma sfp) p]+ _ -> []++ unsolvedNotOK <- not . optAllowUnsolved <$> pragmaOptions negativeNotOK <- not . optDisablePositivity <$> pragmaOptions loopingNotOK <- optTerminationCheck <$> pragmaOptions+ catchallNotOK <- optExactSplit <$> pragmaOptions + -- filter out the warnings the flags told us to ignore let cleanUp w = let ignore = ifs == IgnoreFlags keepUnsolved us = not (null us) && (ignore || unsolvedNotOK) in case w of TerminationIssue{} -> ignore || loopingNotOK+ CoverageIssue{} -> ignore || unsolvedNotOK NotStrictlyPositive{} -> ignore || negativeNotOK UnsolvedMetaVariables ums -> keepUnsolved ums UnsolvedInteractionMetas uis -> keepUnsolved uis UnsolvedConstraints ucs -> keepUnsolved ucs OldBuiltin{} -> True EmptyRewritePragma -> True+ UselessPublic -> True ParseWarning{} -> True+ UnreachableClauses{} -> True+ CoverageNoExactSplit{} -> catchallNotOK+ UselessInline{} -> True+ GenericWarning{} -> True+ GenericNonFatalError{} -> True+ SafeFlagPostulate{} -> True+ SafeFlagPragma{} -> False -- dealt with separately+ SafeFlagNonTerminating -> True+ SafeFlagTerminating -> True+ SafeFlagPrimTrustMe -> True+ SafeFlagNoPositivityCheck -> True+ SafeFlagPolarity -> True+ DeprecationWarning{} -> True+ NicifierIssue{} -> True - return $ filter (cleanUp . tcWarning) ws+ return $ sfp ++ filter (cleanUp . tcWarning) ws --------------------------------------------------------------------------- -- * Helpers@@ -199,11 +299,14 @@ tcErrString :: TCErr -> String tcErrString err = show (getRange err) ++ " " ++ case err of- TypeError _ cl -> errorString $ clValue cl- Exception r s -> show r ++ " " ++ show s- IOException r e -> show r ++ " " ++ show e- PatternErr{} -> "PatternErr"+ TypeError _ cl -> errorString $ clValue cl+ Exception r s -> show r ++ " " ++ show s+ IOException _ r e -> show r ++ " " ++ show e+ PatternErr{} -> "PatternErr" +stringTCErr :: String -> TCErr+stringTCErr = Exception noRange . P.text+ errorString :: TypeError -> String errorString err = case err of AmbiguousModule{} -> "AmbiguousModule"@@ -224,11 +327,6 @@ ClashingModuleImport{} -> "ClashingModuleImport" CompilationError{} -> "CompilationError" ConstructorPatternInWrongDatatype{} -> "ConstructorPatternInWrongDatatype"- CoverageFailure{} -> "CoverageFailure"- CoverageCantSplitOn{} -> "CoverageCantSplitOn"- CoverageCantSplitIrrelevantType{} -> "CoverageCantSplitIrrelevantType"- CoverageCantSplitType{} -> "CoverageCantSplitType"- CoverageNoExactSplit{} -> "CoverageNoExactSplit" CyclicModuleDependency{} -> "CyclicModuleDependency" DataMustEndInSort{} -> "DataMustEndInSort" -- UNUSED: DataTooManyParameters{} -> "DataTooManyParameters"@@ -248,10 +346,7 @@ IllformedProjectionPattern{} -> "IllformedProjectionPattern" CannotEliminateWithPattern{} -> "CannotEliminateWithPattern" IllegalLetInTelescope{} -> "IllegalLetInTelescope"- IncompletePatternMatching{} -> "IncompletePatternMatching"- IndexVariablesNotDistinct{} -> "IndexVariablesNotDistinct"- IndicesFreeInParameters{} -> "IndicesFreeInParameters"- IndicesNotConstructorApplications{} -> "IndicesNotConstructorApplications"+-- UNUSED: IncompletePatternMatching{} -> "IncompletePatternMatching" InternalError{} -> "InternalError" InvalidPattern{} -> "InvalidPattern" LocalVsImportedModuleClash{} -> "LocalVsImportedModuleClash"@@ -269,7 +364,6 @@ NoParseForLHS{} -> "NoParseForLHS" -- NoParseForPatternSynonym{} -> "NoParseForPatternSynonym" NoRHSRequiresAbsurdPattern{} -> "NoRHSRequiresAbsurdPattern"- NotInductive {} -> "NotInductive" AbsurdPatternRequiresNoRHS{} -> "AbsurdPatternRequiresNoRHS" NoSuchBuiltinName{} -> "NoSuchBuiltinName" NoSuchModule{} -> "NoSuchModule"@@ -285,23 +379,16 @@ NotAnExpression{} -> "NotAnExpression" NotImplemented{} -> "NotImplemented" NotSupported{} -> "NotSupported"+ AbstractConstructorNotInScope{} -> "AbstractConstructorNotInScope" NotInScope{} -> "NotInScope" NotLeqSort{} -> "NotLeqSort" NothingAppliedToHiddenArg{} -> "NothingAppliedToHiddenArg" NothingAppliedToInstanceArg{} -> "NothingAppliedToInstanceArg" OverlappingProjects {} -> "OverlappingProjects"- OperatorChangeMessage {} -> "OperatorChangeMessage" OperatorInformation {} -> "OperatorInformation" PatternShadowsConstructor {} -> "PatternShadowsConstructor" PropMustBeSingleton -> "PropMustBeSingleton" RepeatedVariablesInPattern{} -> "RepeatedVariablesInPattern"- SafeFlagPostulate{} -> "SafeFlagPostulate"- SafeFlagPragma{} -> "SafeFlagPragma"- SafeFlagNonTerminating{} -> "SafeFlagNonTerminating"- SafeFlagTerminating{} -> "SafeFlagTerminating"- SafeFlagPrimTrustMe{} -> "SafeFlagPrimTrustMe"- SafeFlagNoPositivityCheck{} -> "SafeFlagNoPositivityCheck"- SafeFlagPolarity{} -> "SafeFlagPolarity" ShadowedModule{} -> "ShadowedModule" ShouldBeASort{} -> "ShouldBeASort" ShouldBeApplicationOf{} -> "ShouldBeApplicationOf"@@ -313,6 +400,7 @@ NotAProjectionPattern{} -> "NotAProjectionPattern" ShouldEndInApplicationOfTheDatatype{} -> "ShouldEndInApplicationOfTheDatatype" SplitError{} -> "SplitError"+ ImpossibleConstructor{} -> "ImpossibleConstructor" TerminationCheckFailed{} -> "TerminationCheckFailed" TooFewFields{} -> "TooFewFields" TooManyArgumentsInLHS{} -> "TooManyArgumentsInLHS"@@ -328,24 +416,16 @@ UnequalSorts{} -> "UnequalSorts" UnequalTerms{} -> "UnequalTerms" UnequalTypes{} -> "UnequalTypes"- UnifyConflict{} -> "UnifyConflict"- UnifyCycle{} -> "UnifyCycle"- UnifyIndicesNotVars{} -> "UnifyIndicesNotVars"- UnificationRecursiveEq{} -> "UnificationRecursiveEq"- UnificationStuck{} -> "UnificationStuck" -- UnequalTelescopes{} -> "UnequalTelescopes" -- UNUSED- HeterogeneousEquality{} -> "HeterogeneousEquality" WithOnFreeVariable{} -> "WithOnFreeVariable" UnexpectedWithPatterns{} -> "UnexpectedWithPatterns" UninstantiatedDotPattern{} -> "UninstantiatedDotPattern" UninstantiatedModule{} -> "UninstantiatedModule"- UnreachableClauses{} -> "UnreachableClauses" SolvedButOpenHoles{} -> "SolvedButOpenHoles" UnusedVariableInPatternSynonym -> "UnusedVariableInPatternSynonym" UnquoteFailed{} -> "UnquoteFailed" DeBruijnIndexOutOfScope{} -> "DeBruijnIndexOutOfScope" WithClausePatternMismatch{} -> "WithClausePatternMismatch"- WithoutKError{} -> "WithoutKError" WrongHidingInApplication{} -> "WrongHidingInApplication" WrongHidingInLHS{} -> "WrongHidingInLHS" WrongHidingInLambda{} -> "WrongHidingInLambda"@@ -370,9 +450,9 @@ TypeError s e -> localState $ do put s sayWhen (envRange $ clEnv e) (envCall $ clEnv e) $ prettyTCM e- Exception r s -> sayWhere r $ return s- IOException r e -> sayWhere r $ fwords $ show e- PatternErr{} -> sayWhere err $ panic "uncaught pattern violation"+ Exception r s -> sayWhere r $ return s+ IOException _ r e -> sayWhere r $ fwords $ show e+ PatternErr{} -> sayWhere err $ panic "uncaught pattern violation" instance PrettyTCM CallInfo where prettyTCM c = do@@ -382,13 +462,21 @@ then call else call $$ nest 2 (text "(at" <+> prettyTCM r <> text ")") --- | Drops the filename component of the qualified name.+-- | Drops given amount of leading components of the qualified name. dropTopLevelModule' :: Int -> QName -> QName dropTopLevelModule' k (QName (MName ns) n) = QName (MName (drop k ns)) n -dropTopLevelModule :: QName -> QName-dropTopLevelModule = dropTopLevelModule' 1+-- | Drops the filename component of the qualified name.+dropTopLevelModule :: QName -> TCM QName+dropTopLevelModule q = ($ q) <$> topLevelModuleDropper +-- | Produces a function which drops the filename component of the qualified name.+topLevelModuleDropper :: TCM (QName -> QName)+topLevelModuleDropper = do+ caseMaybeM (asks envCurrentPath) (return id) $ \ f -> do+ m <- fromMaybe __IMPOSSIBLE__ <$> lookupModuleFromSource f+ return $ dropTopLevelModule' $ size m+ instance PrettyTCM TypeError where prettyTCM err = case err of InternalError s -> panic s@@ -404,13 +492,10 @@ GenericDocError d -> return d TerminationCheckFailed because -> do- dropTopLevelModule <- do- caseMaybeM (asks envCurrentPath) (return id) $ \ f -> do- m <- fromMaybe __IMPOSSIBLE__ <$> lookupModuleFromSource f- return $ dropTopLevelModule' $ size m+ dropTopLevel <- topLevelModuleDropper fwords "Termination checking failed for the following functions:" $$ (nest 2 $ fsep $ punctuate comma $- map (pretty . dropTopLevelModule) $+ map (pretty . dropTopLevel) $ concatMap termErrFunctions because) $$ fwords "Problematic calls:" $$ (nest 2 $ fmap (P.vcat . nub) $@@ -457,8 +542,8 @@ WrongHidingInLambda t -> fwords "Found an implicit lambda where an explicit lambda was expected" - WrongIrrelevanceInLambda t ->- fwords "Found an irrelevant lambda where a relevant lambda was expected"+ WrongIrrelevanceInLambda ->+ fwords "Found a non-strict lambda where a irrelevant lambda was expected" WrongNamedArgument a -> fsep $ pwords "Function does not accept argument "@@ -477,14 +562,13 @@ "Expected " ++ verbalize (Indefinite r') ++ " argument, but found " ++ verbalize (Indefinite r) ++ " argument" - NotInductive t -> fsep $- [prettyTCM t] ++ pwords "is not an inductive data type"- UninstantiatedDotPattern e -> fsep $ pwords "Failed to infer the value of dotted pattern" - IlltypedPattern p a -> fsep $- pwords "Type mismatch"+ IlltypedPattern p a -> do+ let ho _ _ = fsep $ pwords "Cannot pattern match on functions"+ ifPiType a ho $ {- else -} \ _ -> do+ fsep $ pwords "Type mismatch" IllformedProjectionPattern p -> fsep $ pwords "Ill-formed projection pattern " ++ [prettyA p]@@ -522,51 +606,43 @@ [prettyTCM c] ++ pwords "is not a constructor of the datatype" ++ [prettyTCM d] - IndicesNotConstructorApplications [i] ->- fwords "The index"- $$ nest 2 (prettyTCM i)- $$ fsep (pwords "is not a constructor (or literal) applied to variables" ++- pwords "(note that parameters count as constructor arguments)")-- IndicesNotConstructorApplications is ->- fwords "The indices"- $$ nest 2 (vcat $ map prettyTCM is)- $$ fsep (pwords "are not constructors (or literals) applied to variables" ++- pwords "(note that parameters count as constructor arguments)")+ ShadowedModule x [] -> __IMPOSSIBLE__ - IndexVariablesNotDistinct vs is ->- fwords "The variables"- $$ nest 2 (vcat $ map (\v -> prettyTCM (I.Var v [])) vs)- $$ fwords "in the indices"- $$ nest 2 (vcat $ map prettyTCM is)- $$ fwords "are not distinct (note that parameters count as constructor arguments)"+ ShadowedModule x ms@(m0 : _) -> do+ -- Clash! Concrete module name x already points to the abstract names ms.+ (r, m) <- do+ -- Andreas, 2017-07-28, issue #719.+ -- First, we try to find whether one of the abstract names @ms@ points back to @x@+ scope <- getScope+ -- Get all pairs (y,m) such that y points to some m ∈ ms.+ let xms0 = ms >>= \ m -> map (,m) $ inverseScopeLookupModule m scope+ reportSLn "scope.clash.error" 30 $ "candidates = " ++ prettyShow xms0 - IndicesFreeInParameters vs indices pars ->- fwords "The variables"- $$ nest 2 (vcat $ map (\v -> prettyTCM (I.Var v [])) vs)- $$ fwords "which are used (perhaps as constructor parameters) in the index expressions"- $$ nest 2 (vcat $ map prettyTCM indices)- $$ fwords "are free in the parameters"- $$ nest 2 (vcat $ map prettyTCM pars)+ -- Try to find x (which will have a different Range, if it has one (#2649)).+ let xms = filter ((\ y -> not (null $ getRange y) && y == C.QName x) . fst) xms0+ reportSLn "scope.class.error" 30 $ "filtered candidates = " ++ prettyShow xms - ShadowedModule x [] -> __IMPOSSIBLE__+ -- If we found a copy of x with non-empty range, great!+ ifJust (headMaybe xms) (\ (x', m) -> return (getRange x', m)) $ {-else-} do - ShadowedModule x ms@(m : _) -> fsep $- pwords "Duplicate definition of module" ++ [prettyTCM x <> text "."] ++- pwords "Previous definition of" ++ [help m] ++ pwords "module" ++ [prettyTCM x] ++- pwords "at" ++ [prettyTCM r]- where- help m = do- b <- isDatatypeModule m- if b then text "datatype" else empty+ -- If that failed, we pick the first m from ms which has a nameBindingSite.+ let rms = ms >>= \ m -> map (,m) $+ filter (noRange /=) $ map nameBindingSite $ reverse $ mnameToList m+ -- Andreas, 2017-07-25, issue #2649+ -- Take the first nameBindingSite we can get hold of.+ reportSLn "scope.class.error" 30 $ "rangeful clashing modules = " ++ prettyShow rms - r = case [ r | r <- map (defSiteOfLast . mnameToList) ms- , r /= noRange ] of- [] -> noRange- r : _ -> r+ -- If even this fails, we pick the first m and give no range.+ return $ fromMaybe (noRange, m0) $ headMaybe rms - defSiteOfLast [] = noRange- defSiteOfLast ns = nameBindingSite (last ns)+ fsep $+ pwords "Duplicate definition of module" ++ [prettyTCM x <> text "."] +++ pwords "Previous definition of" ++ [help m] ++ pwords "module" ++ [prettyTCM x] +++ pwords "at" ++ [prettyTCM r]+ where+ help m = caseMaybeM (isDatatypeModule m) empty $ \case+ IsData -> text "(datatype)"+ IsRecord -> text "(record)" ModuleArityMismatch m EmptyTel args -> fsep $ pwords "The module" ++ [prettyTCM m] ++@@ -603,7 +679,8 @@ SplitOnIrrelevant p t -> fsep $ pwords "Cannot pattern match" ++ [prettyA p] ++- pwords "against irrelevant type" ++ [prettyTCM t]+ pwords "against" ++ [text $ verbalize $ getRelevance t] +++ pwords "argument of type" ++ [prettyTCM t] DefinitionIsIrrelevant x -> fsep $ text "Identifier" : prettyTCM x : pwords "is declared irrelevant, so it cannot be used here"@@ -627,11 +704,6 @@ UnequalTypes cmp a b -> prettyUnequal a (notCmp cmp) b -- fsep $ [prettyTCM a, notCmp cmp, prettyTCM b] - HeterogeneousEquality u a v b -> fsep $- pwords "Refuse to solve heterogeneous constraint" ++- [prettyTCM u] ++ pwords ":" ++ [prettyTCM a] ++ pwords "=?=" ++- [prettyTCM v] ++ pwords ":" ++ [prettyTCM b]- UnequalRelevance cmp a b -> fsep $ [prettyTCM a, notCmp cmp, prettyTCM b] ++ -- Andreas 2010-09-21 to reveal Forced annotations, print also uglily@@ -681,8 +753,7 @@ WithClausePatternMismatch p q -> fsep $ pwords "With clause pattern " ++ [prettyA p] ++- pwords " is not an instance of its parent pattern " ++ [prettyTCM q]- -- TODO: prettier printing for internal patterns+ pwords " is not an instance of its parent pattern " ++ [P.fsep <$> prettyTCMPatterns [q]] MetaCannotDependOn m ps i -> fsep $ pwords "The metavariable" ++ [prettyTCM $ MetaV m []] ++@@ -741,8 +812,9 @@ pwords "The module" ++ [prettyTCM m] ++ pwords "can refer to either a local module or an imported module" - SolvedButOpenHoles ->- text "Module cannot be imported since it has open interaction points"+ SolvedButOpenHoles -> fsep $+ pwords "Module cannot be imported since it has open interaction points" +++ pwords "(consider adding {-# OPTIONS --allow-unsolved-metas #-} to this module)" CyclicModuleDependency ms -> fsep (pwords "cyclic module dependency:")@@ -790,6 +862,11 @@ BothWithAndRHS -> fsep $ pwords "Unexpected right hand side" + AbstractConstructorNotInScope q -> fsep $+ [ text "Constructor"+ , prettyTCM q+ ] ++ pwords "is abstract, thus, not in scope here"+ NotInScope xs -> do inscope <- Set.toList . concreteNamesInScope <$> getScope fsep (pwords "Not in scope:") $$ nest 2 (vcat $ map (name inscope) xs)@@ -834,8 +911,10 @@ where help :: ModuleName -> TCM Doc help m = do- b <- isDatatypeModule m- sep [prettyTCM m, if b then text "(datatype module)" else empty]+ anno <- caseMaybeM (isDatatypeModule m) (return empty) $ \case+ IsData -> return $ text "(datatype module)"+ IsRecord -> return $ text "(record module)"+ sep [prettyTCM m, anno ] UninstantiatedModule x -> fsep ( pwords "Cannot access the contents of the parameterised module"@@ -1078,15 +1157,6 @@ LeftAssoc -> "infixl" RightAssoc -> "infixr" - OperatorChangeMessage err@(OperatorInformation [] _) ->- prettyTCM err- OperatorChangeMessage err ->- prettyTCM err- $+$- fsep (pwords $- "(the treatment of operators was changed in Agda 2.5.1, " ++- "so code that used to parse may have to be changed)")- {- UNUSED AmbiguousParseForPatternSynonym p ps -> fsep ( pwords "Don't know how to parse" ++ [pretty p <> text "."] ++@@ -1094,85 +1164,19 @@ ) $$ nest 2 (vcat $ map pretty ps) -} +{- UNUSED IncompletePatternMatching v args -> fsep $ pwords "Incomplete pattern matching for" ++ [prettyTCM v <> text "."] ++ pwords "No match for" ++ map prettyTCM args-- UnreachableClauses f pss -> fsep $- pwords "Unreachable" ++ pwords (plural (length pss) "clause")- where- plural 1 thing = thing- plural n thing = thing ++ "s"-- CoverageFailure f pss -> fsep (- pwords "Incomplete pattern matching for" ++ [prettyTCM f <> text "."] ++- pwords "Missing cases:") $$ nest 2 (vcat $ map display pss)- where- display ps = do- ps <- nicify f ps- prettyTCM f <+> fsep (map (prettyArg . fmap namedThing) ps)-- nicify f ps = do- showImp <- showImplicitArguments- if showImp- then return ps- else return ps -- TODO: remove implicit arguments which aren't constructors-- CoverageCantSplitOn c tel cIxs gIxs- | length cIxs /= length gIxs -> __IMPOSSIBLE__- | otherwise -> addContext tel $ vcat (- [ fsep $ pwords "I'm not sure if there should be a case for the constructor" ++- [prettyTCM c <> text ","] ++- pwords "because I get stuck when trying to solve the following" ++- pwords "unification problems (inferred index ≟ expected index):"- ] ++- zipWith (\c g -> nest 2 $ prettyTCM c <+> text "≟" <+> prettyTCM g) cIxs gIxs)-- CoverageCantSplitIrrelevantType a -> fsep $- pwords "Cannot split on argument of irrelevant datatype" ++ [prettyTCM a]--- CoverageCantSplitType a -> fsep $- pwords "Cannot split on argument of non-datatype" ++ [prettyTCM a]-- CoverageNoExactSplit f cs -> fsep $- pwords "Exact splitting is enabled, but not all clauses can be preserved as definitional equalities in the translation to a case tree"+-} SplitError e -> prettyTCM e - WithoutKError a u v -> fsep $- pwords "Cannot eliminate reflexive equation" ++ [prettyTCM u] ++- pwords "=" ++ [prettyTCM v] ++ pwords "of type" ++ [prettyTCM a] ++- pwords "because K has been disabled."-- UnifyConflict c c' -> fsep $- pwords "This case is impossible because of a conflict between the constructors " ++- [prettyTCM c] ++ pwords " and " ++ [prettyTCM c' <> text "."] ++- pwords "Possible solution: remove the clause, or use an absurd pattern ()."-- UnifyCycle i u -> fsep $- pwords "This case is impossible because the variable " ++ [prettyTCM (var i)] ++- pwords "occurs strongly rigid in" ++ [prettyTCM u <> text "."] +++ ImpossibleConstructor c neg -> fsep $+ pwords "The case for the constructor " ++ [prettyTCM c] +++ pwords " is impossible" ++ [prettyTCM neg] ++ pwords "Possible solution: remove the clause, or use an absurd pattern ()." - UnifyIndicesNotVars a u v ixs -> fsep $- pwords "Cannot apply injectivity to the equation" ++ [prettyTCM u] ++- pwords "=" ++ [prettyTCM v] ++ pwords "of type" ++ [prettyTCM a] ++- pwords "because I cannot generalize over the indices" ++- [prettyList $ map prettyTCM ixs]-- UnificationRecursiveEq a i u -> fsep $- pwords "Cannot solve variable " ++ [prettyTCM (var i)] ++- pwords " of type " ++ [prettyTCM a] ++- pwords " with solution " ++ [prettyTCM u] ++- pwords " because the variable occurs in the solution," ++- pwords " or in the type one of the variables in the solution"-- UnificationStuck tel us vs -> fsep $- pwords "I got stuck on unifying" ++ [prettyList (map prettyTCM us)] ++- pwords "with" ++ [prettyList (map prettyTCM vs)] ++- pwords "in the telescope" ++ [prettyTCM tel]- TooManyPolarities x n -> fsep $ pwords "Too many polarities given in the POLARITY pragma for" ++ [prettyTCM x] ++@@ -1210,30 +1214,8 @@ where cxt' = cxt `abstract` raise (size cxt) (nameCxt names) nameCxt [] = EmptyTel- nameCxt (x : xs) = ExtendTel (defaultDom (El I.Prop $ I.Var 0 [])) $ NoAbs (show x) $ nameCxt xs-- SafeFlagPostulate e -> fsep $- pwords "Cannot postulate" ++ [pretty e] ++ pwords "with safe flag"-- SafeFlagPragma xs ->- let plural | length xs == 1 = ""- | otherwise = "s"- in fsep $ [fwords ("Cannot set OPTION pragma" ++ plural)]- ++ map text xs ++ [fwords "with safe flag."]-- SafeFlagNonTerminating -> fsep $- pwords "Cannot use NON_TERMINATING pragma with safe flag."-- SafeFlagTerminating -> fsep $- pwords "Cannot use TERMINATING pragma with safe flag."-- SafeFlagPrimTrustMe -> fsep (pwords "Cannot use primTrustMe with safe flag")-- SafeFlagNoPositivityCheck -> fsep $- pwords "Cannot use NO_POSITIVITY_CHECK pragma with safe flag."-- SafeFlagPolarity -> fsep $- pwords "The POLARITY pragma must not be used in safe mode."+ nameCxt (x : xs) = ExtendTel (defaultDom (El I.Prop $ I.var 0)) $+ NoAbs (P.prettyShow x) $ nameCxt xs NeedOptionCopatterns -> fsep $ pwords "Option --copatterns needed to enable destructor patterns"@@ -1244,7 +1226,7 @@ NonFatalErrors ws -> foldr1 ($$) $ fmap prettyTCM ws InstanceSearchDepthExhausted c a d -> fsep $- pwords ("Instance search depth exhaused (max depth: " ++ show d ++ ") for candidate") +++ pwords ("Instance search depth exhausted (max depth: " ++ show d ++ ") for candidate") ++ [hang (prettyTCM c <+> text ":") 2 (prettyTCM a)] where@@ -1254,13 +1236,14 @@ prettyArg :: Arg (I.Pattern' a) -> TCM Doc prettyArg (Arg info x) = case getHiding info of- Hidden -> braces $ prettyPat 0 x- Instance -> dbraces $ prettyPat 0 x- NotHidden -> prettyPat 1 x+ Hidden -> braces $ prettyPat 0 x+ Instance{} -> dbraces $ prettyPat 0 x+ NotHidden -> prettyPat 1 x prettyPat :: Integer -> (I.Pattern' a) -> TCM Doc prettyPat _ (I.VarP _) = text "_" prettyPat _ (I.DotP _) = text "._"+ prettyPat _ (I.AbsurdP _) = text absurdPatternName prettyPat n (I.ConP c _ args) = mpar n args $ prettyTCM c <+> fsep (map (prettyArg . fmap namedThing) args)@@ -1317,11 +1300,10 @@ instance PrettyTCM SplitError where prettyTCM err = case err of NotADatatype t -> enterClosure t $ \ t -> fsep $- pwords "Cannot pattern match on non-datatype" ++ [prettyTCM t]+ pwords "Cannot split on argument of non-datatype" ++ [prettyTCM t] IrrelevantDatatype t -> enterClosure t $ \ t -> fsep $- pwords "Cannot pattern match on datatype" ++ [prettyTCM t] ++- pwords "since it is declared irrelevant"+ pwords "Cannot split on argument of irrelevant datatype" ++ [prettyTCM t] CoinductiveDatatype t -> enterClosure t $ \ t -> fsep $ pwords "Cannot pattern match on the coinductive type" ++ [prettyTCM t]@@ -1332,11 +1314,55 @@ pwords "because it has no constructor" -} - CantSplit c tel cIxs gIxs ->- prettyTCM $ CoverageCantSplitOn c tel cIxs gIxs+ UnificationStuck c tel cIxs gIxs errs+ | length cIxs /= length gIxs -> __IMPOSSIBLE__+ | otherwise -> vcat $+ [ fsep $ pwords "I'm not sure if there should be a case for the constructor" +++ [prettyTCM c <> text ","] +++ pwords "because I get stuck when trying to solve the following" +++ pwords "unification problems (inferred index ≟ expected index):"+ ] +++ zipWith (\c g -> nest 2 $ addContext tel $ prettyTCM c <+> text "≟" <+> prettyTCM g) cIxs gIxs +++ if null errs then [] else+ [ fsep $ pwords "Possible" ++ pwords (singPlural errs "reason" "reasons") +++ pwords "why unification failed:" ] +++ map (nest 2 . prettyTCM) errs GenericSplitError s -> fsep $ pwords "Split failed:" ++ pwords s +instance PrettyTCM NegativeUnification where+ prettyTCM err = case err of+ UnifyConflict tel u v -> addContext tel $ vcat $+ [ fsep $ pwords "because unification ended with a conflicting equation "+ , nest 2 $ prettyTCM u <+> text "≟" <+> prettyTCM v+ ]++ UnifyCycle tel i u -> addContext tel $ vcat $+ [ fsep $ pwords "because unification ended with a cyclic equation "+ , nest 2 $ prettyTCM (var i) <+> text "≟" <+> prettyTCM u+ ]++instance PrettyTCM UnificationFailure where+ prettyTCM err = case err of+ UnifyIndicesNotVars tel a u v ixs -> addContext tel $ fsep $+ pwords "Cannot apply injectivity to the equation" ++ [prettyTCM u] +++ pwords "=" ++ [prettyTCM v] ++ pwords "of type" ++ [prettyTCM a] +++ pwords "because I cannot generalize over the indices" +++ [prettyList (map prettyTCM ixs) <> text "."]++ UnifyRecursiveEq tel a i u -> addContext tel $ fsep $+ pwords "Cannot solve variable " ++ [prettyTCM (var i)] +++ pwords " of type " ++ [prettyTCM a] +++ pwords " with solution " ++ [prettyTCM u] +++ pwords " because the variable occurs in the solution," +++ pwords " or in the type of one of the variables in the solution."++ UnifyReflexiveEq tel a u -> addContext tel $ fsep $+ pwords "Cannot eliminate reflexive equation" ++ [prettyTCM u] +++ pwords "=" ++ [prettyTCM u] ++ pwords "of type" ++ [prettyTCM a] +++ pwords "because K has been disabled."++ instance PrettyTCM Call where prettyTCM c = case c of CheckClause t cl -> do@@ -1465,9 +1491,9 @@ instance Verbalize Hiding where verbalize h = case h of- Hidden -> "hidden"- NotHidden -> "visible"- Instance -> "instance"+ Hidden -> "hidden"+ NotHidden -> "visible"+ Instance{} -> "instance" instance Verbalize Relevance where verbalize r =@@ -1475,8 +1501,7 @@ Relevant -> "relevant" Irrelevant -> "irrelevant" NonStrict -> "shape-irrelevant"- Forced{} -> __IMPOSSIBLE__- UnusedArg -> __IMPOSSIBLE__+ Forced{} -> "forced" -- | Indefinite article. data Indefinite a = Indefinite a
src/full/Agda/TypeChecking/Errors.hs-boot view
@@ -1,7 +1,14 @@ module Agda.TypeChecking.Errors where import Agda.TypeChecking.Monad.Base+import Agda.Syntax.Position +import Agda.Utils.Pretty+ -- Misplaced SPECIALISE pragma: -- {-# SPECIALIZE prettyError :: TCErr -> TCM String #-} prettyError :: MonadTCM tcm => TCErr -> tcm String++prettyWarning :: MonadTCM tcm => Warning -> tcm Doc++sayWhen :: Range -> Maybe (Closure Call) -> TCM Doc -> TCM Doc
src/full/Agda/TypeChecking/EtaContract.hs view
@@ -70,8 +70,12 @@ tyty <- typeInType case binAppView b of App u (Arg info v)- | (isIrrelevant info || isVar0 tyty v)- && getHiding i == getHiding info+ | isVar0 tyty v+ -- Andreas, 2017-02-20 issue #2464+ -- Contracting with any irrelevant argument breaks subject reduction.+ -- E.g. \ .x -> f .(subst P eq x) can in general not be contracted to f.+ -- -- | (isIrrelevant info || isVar0 tyty v)+ && sameHiding i info && not (freeIn 0 u) -> return $ strengthen __IMPOSSIBLE__ u _ -> return v
src/full/Agda/TypeChecking/Forcing.hs view
@@ -15,12 +15,12 @@ @ At runtime, forced constructor arguments may be erased as they can be-recovered from dot patterns. In the epic backend,+recovered from dot patterns. For instance, @ unsing : {A : Set} (x : A) -> Sing x -> A unsing .x (sing x) = x @-becomes+can become @ unsing x sing = x @@@ -43,8 +43,8 @@ Up to issue 1441 (Feb 2015), the forcing analysis here relied on the wrong equality (II), considering type constructors as injective. This is-unsound for Epic's program extraction, but ok if forcing is only used-to decide which arguments to skip during conversion checking.+unsound for program extraction, but ok if forcing is only used to decide which+arguments to skip during conversion checking. From now on, forcing uses equality (I) and does not search for forced variables under type constructors. This may lose some savings during
src/full/Agda/TypeChecking/Free.hs view
@@ -1,4 +1,4 @@-+{-# LANGUAGE GeneralizedNewtypeDeriving #-} -- | Computing the free variables of a term. -- -- The distinction between rigid and strongly rigid occurrences comes from:@@ -18,12 +18,12 @@ module Agda.TypeChecking.Free ( FreeVars(..)- , Free, Free', FreeV, FreeVS+ , Free+ , IsVarSet(..) , IgnoreSorts(..) , runFree , rigidVars, relevantVars, allVars , allFreeVars , allRelevantVars, allRelevantVarsIgnoring- , allRelevantOrUnusedVars, allRelevantOrUnusedVarsIgnoring , freeIn, freeInIgnoringSorts, isBinderUsed , relevantIn, relevantInIgnoringSortAnn , Occurrence(..)@@ -44,6 +44,7 @@ import Data.IntMap (IntMap) import qualified Data.IntMap as Map import Data.Set (Set)+import Data.Proxy import qualified Agda.Benchmarking as Bench @@ -51,9 +52,9 @@ import Agda.Syntax.Internal import Agda.TypeChecking.Free.Lazy- ( Free'(..) , FreeEnv(..), initFreeEnv+ ( Free(..) , FreeEnv(..), initFreeEnv , VarOcc(..), IgnoreSorts(..), Variable, SingleVar- , MetaSet+ , MetaSet, IsVarSet(..), runFreeM ) import qualified Agda.TypeChecking.Free.Lazy as Free @@ -124,7 +125,7 @@ deriving (Eq,Show) -- | Compute an occurrence of a single variable in a piece of internal syntax.-occurrence :: FreeV a => Nat -> a -> Occurrence+occurrence :: Free a => Nat -> a -> Occurrence occurrence x v = occurrenceFV x $ freeVars v -- | Extract occurrence of a single variable from computed free variables.@@ -214,57 +215,60 @@ delete n (FV sv gv rv fv iv uv) = FV (Set.delete n sv) (Set.delete n gv) (Set.delete n rv) (Map.delete n fv) (Set.delete n iv) (Set.delete n uv) instance Singleton Variable FreeVars where- singleton (i, VarOcc o r) = mod empty where- mod :: FreeVars -> FreeVars- mod = case (o, r) of- (_, Irrelevant) -> mapIRV (Set.insert i)- (_, UnusedArg ) -> mapUUV (Set.insert i)- (Free.StronglyRigid, _) -> mapSRV (Set.insert i)- (Free.Unguarded , _) -> mapUGV (Set.insert i)- (Free.WeaklyRigid , _) -> mapWRV (Set.insert i)- (Free.Flexible ms , _) -> mapFXV (Map.insert i ms)+ singleton i = mapUGV (Set.insert i) mempty +instance IsVarSet FreeVars where+ withVarOcc (VarOcc o r) = goOcc o . goRel r+ where+ goOcc o = case o of+ Free.Flexible ms -> flexible ms+ Free.WeaklyRigid -> weakly+ Free.Unguarded -> id+ Free.StronglyRigid -> strongly+ goRel r = case r of+ Relevant -> id+ NonStrict -> id -- we don't track non-strict and+ Forced{} -> id -- forced in FreeVars+ Irrelevant -> irrelevantly++-- In most cases we don't care about the VarOcc.++instance IsVarSet VarSet where withVarOcc _ = id+instance IsVarSet [Int] where withVarOcc _ = id+instance IsVarSet Any where withVarOcc _ = id+instance IsVarSet All where withVarOcc _ = id+ -- * Collecting free variables. bench :: a -> a bench = Bench.billToPure [ Bench.Typing , Bench.Free ] -type Free a = Free' a Any-type FreeV a = Free' a FreeVars-type FreeVS a = Free' a VarSet- -- | Doesn't go inside solved metas, but collects the variables from a -- metavariable application @X ts@ as @flexibleVars@.-{-# SPECIALIZE freeVars :: FreeV a => a -> FreeVars #-}-freeVars :: (Monoid c, Singleton Variable c, Free' a c) => a -> c+{-# SPECIALIZE freeVars :: Free a => a -> FreeVars #-}+freeVars :: (IsVarSet c, Singleton Variable c, Free a) => a -> c freeVars = freeVarsIgnore IgnoreNot -{-# SPECIALIZE freeVarsIgnore :: FreeV a => IgnoreSorts -> a -> FreeVars #-}-freeVarsIgnore :: (Monoid c, Singleton Variable c, Free' a c) => IgnoreSorts -> a -> c+{-# SPECIALIZE freeVarsIgnore :: Free a => IgnoreSorts -> a -> FreeVars #-}+freeVarsIgnore :: (IsVarSet c, Singleton Variable c, Free a) =>+ IgnoreSorts -> a -> c freeVarsIgnore = runFree singleton -- Specialization to typical monoids-{-# SPECIALIZE runFree :: Free' a Any => SingleVar Any -> IgnoreSorts -> a -> Any #-}-{-# SPECIALIZE runFree :: Free' a All => SingleVar All -> IgnoreSorts -> a -> All #-}-{-# SPECIALIZE runFree :: Free' a VarSet => SingleVar VarSet -> IgnoreSorts -> a -> VarSet #-}-{-# SPECIALIZE runFree :: Free' a FreeVars => SingleVar FreeVars -> IgnoreSorts -> a -> FreeVars #-}+{-# SPECIALIZE runFree :: Free a => SingleVar Any -> IgnoreSorts -> a -> Any #-}+{-# SPECIALIZE runFree :: Free a => SingleVar FreeVars -> IgnoreSorts -> a -> FreeVars #-} -- Specialization to Term {-# SPECIALIZE runFree :: SingleVar Any -> IgnoreSorts -> Term -> Any #-}-{-# SPECIALIZE runFree :: SingleVar All -> IgnoreSorts -> Term -> All #-}-{-# SPECIALIZE runFree :: SingleVar VarSet -> IgnoreSorts -> Term -> VarSet #-} {-# SPECIALIZE runFree :: SingleVar FreeVars -> IgnoreSorts -> Term -> FreeVars #-}-runFree :: (Monoid c, Free' a c) => SingleVar c -> IgnoreSorts -> a -> c-runFree singleton i t = -- bench $ -- Benchmarking is expensive (4% on std-lib)- freeVars' t `runReader` (initFreeEnv singleton) { feIgnoreSorts = i } -freeIn'' :: Free a => (VarOcc -> Bool) -> IgnoreSorts -> Nat -> a -> Bool-freeIn'' test ig x t =- getAny $ runFree (\ (y, o) -> Any $ x == y && test o) ig t+-- | Compute free variables.+runFree :: (IsVarSet c, Free a) => SingleVar c -> IgnoreSorts -> a -> c+runFree single i t = -- bench $ -- Benchmarking is expensive (4% on std-lib)+ runFreeM single i (freeVars' t) --- | @freeIn' = freeIn'' (const True)@+-- | Check if a variable is free, possibly ignoring sorts. freeIn' :: Free a => IgnoreSorts -> Nat -> a -> Bool-freeIn' ig x t =- getAny $ runFree (Any . (x ==) . fst) ig t+freeIn' ig x t = getAny $ runFree (Any . (x ==)) ig t {-# SPECIALIZE freeIn :: Nat -> Term -> Bool #-} freeIn :: Free a => Nat -> a -> Bool@@ -276,11 +280,22 @@ freeInIgnoringSortAnn :: Free a => Nat -> a -> Bool freeInIgnoringSortAnn = freeIn' IgnoreInAnnotations +newtype RelevantIn a = RelevantIn {getRelevantIn :: a}+ deriving (Semigroup, Monoid)++instance IsVarSet a => IsVarSet (RelevantIn a) where+ withVarOcc o x+ | irrelevant (varRelevance o) = mempty+ | otherwise = RelevantIn $ withVarOcc o $ getRelevantIn x++relevantIn' :: Free a => IgnoreSorts -> Nat -> a -> Bool+relevantIn' ig x t = getAny . getRelevantIn $ runFree (RelevantIn . Any . (x ==)) ig t+ relevantInIgnoringSortAnn :: Free a => Nat -> a -> Bool-relevantInIgnoringSortAnn = freeIn'' (not . irrelevantOrUnused . varRelevance) IgnoreInAnnotations+relevantInIgnoringSortAnn = relevantIn' IgnoreInAnnotations relevantIn :: Free a => Nat -> a -> Bool-relevantIn = freeIn'' (not . irrelevantOrUnused . varRelevance) IgnoreAll+relevantIn = relevantIn' IgnoreAll -- | Is the variable bound by the abstraction actually used? isBinderUsed :: Free a => Abs a -> Bool@@ -288,27 +303,17 @@ isBinderUsed (Abs _ x) = 0 `freeIn` x -- | Is the term entirely closed (no free variables)?-closed :: Free' a All => a -> Bool+closed :: Free a => a -> Bool closed t = getAll $ runFree (const $ All False) IgnoreNot t -- | Collect all free variables.-allFreeVars :: Free' a VarSet => a -> VarSet-allFreeVars = runFree (Set.singleton . fst) IgnoreNot+allFreeVars :: Free a => a -> VarSet+allFreeVars = runFree Set.singleton IgnoreNot -- | Collect all relevant free variables, excluding the "unused" ones, possibly ignoring sorts.-allRelevantVarsIgnoring :: Free' a VarSet => IgnoreSorts -> a -> VarSet-allRelevantVarsIgnoring = runFree sg- where sg (i, VarOcc _ r) = if irrelevantOrUnused r then Set.empty else Set.singleton i+allRelevantVarsIgnoring :: Free a => IgnoreSorts -> a -> VarSet+allRelevantVarsIgnoring ig = getRelevantIn . runFree (RelevantIn . Set.singleton) ig -- | Collect all relevant free variables, excluding the "unused" ones.-allRelevantVars :: Free' a VarSet => a -> VarSet+allRelevantVars :: Free a => a -> VarSet allRelevantVars = allRelevantVarsIgnoring IgnoreNot---- | Collect all relevant free variables, possibly ignoring sorts.-allRelevantOrUnusedVarsIgnoring :: Free' a VarSet => IgnoreSorts -> a -> VarSet-allRelevantOrUnusedVarsIgnoring = runFree sg- where sg (i, VarOcc _ r) = if isIrrelevant r then Set.empty else Set.singleton i---- | Collect all relevant free variables.-allRelevantOrUnusedVars :: Free' a VarSet => a -> VarSet-allRelevantOrUnusedVars = allRelevantOrUnusedVarsIgnoring IgnoreNot
src/full/Agda/TypeChecking/Free/Lazy.hs view
@@ -108,8 +108,32 @@ botVarOcc :: VarOcc botVarOcc = VarOcc (Flexible mempty) Irrelevant +-- | First argument is the outer occurrence and second is the inner.+composeVarOcc :: VarOcc -> VarOcc -> VarOcc+composeVarOcc (VarOcc o r) (VarOcc o' r') = VarOcc (composeFlexRig o o') (max r r')++-- | Any representation of a set of variables need to be able to be modified by+-- a variable occurrence. This is to ensure that free variable analysis is+-- compositional. For instance, it should be possible to compute `fv (v [u/x])`+-- from `fv v` and `fv u`.+class (Semigroup a, Monoid a) => IsVarSet a where+ -- | Laws+ -- * Respects monoid operations:+ -- ```+ -- withVarOcc o mempty == mempty+ -- withVarOcc o (x <> y) == withVarOcc o x <> withVarOcc o y+ -- ```+ -- * Respects VarOcc composition+ -- ```+ -- withVarOcc (composeVarOcc o1 o2) = withVarOcc o1 . withVarOcc o2+ -- ```+ withVarOcc :: VarOcc -> a -> a+ type VarMap = IntMap VarOcc +instance IsVarSet VarMap where+ withVarOcc o = fmap (composeVarOcc o)+ -- * Collecting free variables. -- | Where should we skip sorts in free variable analysis?@@ -125,35 +149,37 @@ data FreeEnv c = FreeEnv { feIgnoreSorts :: !IgnoreSorts -- ^ Ignore free variables in sorts.- , feBinders :: !Int- -- ^ Under how many binders have we stepped? , feFlexRig :: !FlexRig -- ^ Are we flexible or rigid? , feRelevance :: !Relevance -- ^ What is the current relevance?- , feSingleton :: SingleVar c+ , feSingleton :: Maybe Variable -> c -- ^ Method to return a single variable. } -type Variable = (Int, VarOcc)+type Variable = Int type SingleVar c = Variable -> c -- | The initial context. -initFreeEnv :: SingleVar c -> FreeEnv c+initFreeEnv :: Monoid c => SingleVar c -> FreeEnv c initFreeEnv sing = FreeEnv { feIgnoreSorts = IgnoreNot- , feBinders = 0 , feFlexRig = Unguarded , feRelevance = Relevant- , feSingleton = sing+ , feSingleton = maybe mempty sing } type FreeM c = Reader (FreeEnv c) c -instance Monoid c => Semigroup (FreeM c) where- (<>) = liftA2 mappend-instance Monoid c => Monoid (FreeM c) where+-- | Run function for FreeM.+runFreeM :: IsVarSet c => SingleVar c -> IgnoreSorts -> FreeM c -> c+runFreeM single i m = runReader m $ (initFreeEnv single) { feIgnoreSorts = i }++instance Semigroup c => Semigroup (FreeM c) where+ (<>) = liftA2 (<>)++instance (Semigroup c, Monoid c) => Monoid (FreeM c) where mempty = pure mempty mappend = (<>) mconcat = mconcat <.> sequence@@ -162,21 +188,23 @@ -- singleton = pure . singleton -- | Base case: a variable.-variable :: (Monoid c) => Int -> FreeM c+variable :: IsVarSet c => Int -> FreeM c variable n = do- m <- (n -) <$> asks feBinders- if m < 0 then mempty else do- o <- asks feFlexRig- r <- asks feRelevance- s <- asks feSingleton- pure $ s (m, VarOcc o r)+ o <- asks feFlexRig+ r <- asks feRelevance+ s <- asks feSingleton+ pure $ withVarOcc (VarOcc o r) (s $ Just n) +-- | Subtract, but return Nothing if result is negative.+subVar :: Int -> Maybe Variable -> Maybe Variable+subVar n x = x >>= \ i -> (i - n) <$ guard (n <= i)+ -- | Going under a binder. bind :: FreeM a -> FreeM a bind = bind' 1 bind' :: Nat -> FreeM a -> FreeM a-bind' n = local $ \ e -> e { feBinders = n + feBinders e }+bind' n = local $ \ e -> e { feSingleton = feSingleton e . subVar n } -- | Changing the 'FlexRig' context. go :: FlexRig -> FreeM a -> FreeM a@@ -200,16 +228,16 @@ (Inductive, (_:_)) -> id -- | Gather free variables in a collection.-class Free' a c where+class Free a where -- Misplaced SPECIALIZE pragma: -- {-# SPECIALIZE freeVars' :: a -> FreeM Any #-} -- So you cannot specialize all instances in one go. :(- freeVars' :: (Monoid c) => a -> FreeM c+ freeVars' :: IsVarSet c => a -> FreeM c -instance Free' Term c where+instance Free Term where -- SPECIALIZE instance does not work as well, see -- https://ghc.haskell.org/trac/ghc/ticket/10434#ticket- -- {-# SPECIALIZE instance Free' Term All #-}+ -- {-# SPECIALIZE instance Free Term All #-} -- {-# SPECIALIZE freeVars' :: Term -> FreeM Any #-} -- {-# SPECIALIZE freeVars' :: Term -> FreeM All #-} -- {-# SPECIALIZE freeVars' :: Term -> FreeM VarSet #-}@@ -235,23 +263,13 @@ DontCare mt -> goRel Irrelevant $ freeVars' mt Shared p -> freeVars' (derefPtr p) -instance Free' a c => Free' (Type' a) c where- -- {-# SPECIALIZE instance Free' Type All #-}- -- {-# SPECIALIZE freeVars' :: Type -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: Type -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: Type -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: Type -> FreeM VarMap #-}+instance Free a => Free (Type' a) where freeVars' (El s t) = ifM ((IgnoreNot ==) <$> asks feIgnoreSorts) {- then -} (freeVars' (s, t)) {- else -} (freeVars' t) -instance Free' Sort c where- -- {-# SPECIALIZE instance Free' Sort All #-}- -- {-# SPECIALIZE freeVars' :: Sort -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: Sort -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: Sort -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: Sort -> FreeM VarMap #-}+instance Free Sort where freeVars' s = ifM ((IgnoreAll ==) <$> asks feIgnoreSorts) mempty $ {- else -} case s of@@ -261,110 +279,50 @@ SizeUniv -> mempty DLub s1 s2 -> go WeaklyRigid $ freeVars' (s1, s2) -instance Free' Level c where- -- {-# SPECIALIZE instance Free' Level All #-}- -- {-# SPECIALIZE freeVars' :: Level -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: Level -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: Level -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: Level -> FreeM VarMap #-}+instance Free Level where freeVars' (Max as) = freeVars' as -instance Free' PlusLevel c where- -- {-# SPECIALIZE instance Free' PlusLevel All #-}- -- {-# SPECIALIZE freeVars' :: PlusLevel -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: PlusLevel -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: PlusLevel -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: PlusLevel -> FreeM VarMap #-}+instance Free PlusLevel where freeVars' ClosedLevel{} = mempty freeVars' (Plus _ l) = freeVars' l -instance Free' LevelAtom c where- -- {-# SPECIALIZE instance Free' LevelAtom All #-}- -- {-# SPECIALIZE freeVars' :: LevelAtom -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: LevelAtom -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: LevelAtom -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: LevelAtom -> FreeM VarMap #-}+instance Free LevelAtom where freeVars' l = case l of MetaLevel m vs -> go (Flexible $ singleton m) $ freeVars' vs NeutralLevel _ v -> freeVars' v BlockedLevel _ v -> freeVars' v UnreducedLevel v -> freeVars' v -instance Free' a c => Free' [a] c where- -- {-# SPECIALIZE instance Free' a All => Free' [a] All #-}- -- {-# SPECIALIZE freeVars' :: Free' a Any => [a] -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: Free' a All => [a] -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarSet => [a] -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarMap => [a] -> FreeM VarMap #-}+instance Free a => Free [a] where freeVars' = foldMap freeVars' -instance Free' a c => Free' (Maybe a) c where- -- {-# SPECIALIZE instance Free' a All => Free' (Maybe a) All #-}- -- {-# SPECIALIZE freeVars' :: Free' a Any => Maybe a -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: Free' a All => Maybe a -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarSet => Maybe a -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarMap => Maybe a -> FreeM VarMap #-}+instance Free a => Free (Maybe a) where freeVars' = foldMap freeVars' -instance (Free' a c, Free' b c) => Free' (a,b) c where- -- {-# SPECIALIZE instance (Free' a All, Free' b All) => Free' (a,b) All #-}- -- {-# SPECIALIZE freeVars' :: (Free' a Any, Free' b Any) => (a,b) -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: (Free' a All, Free' b All) => (a,b) -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: (Free' a VarSet, Free' b VarSet) => (a,b) -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: (Free' a VarMap, Free' b VarMap) => (a,b) -> FreeM VarMap #-}+instance (Free a, Free b) => Free (a, b) where freeVars' (x,y) = freeVars' x `mappend` freeVars' y -instance Free' a c => Free' (Elim' a) c where- -- {-# SPECIALIZE instance Free' a All => Free' (Elim' a) All #-}- -- {-# SPECIALIZE freeVars' :: Free' a Any => Elim' a -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: Free' a All => Elim' a -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarSet => Elim' a -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarMap => Elim' a -> FreeM VarMap #-}+instance Free a => Free (Elim' a) where freeVars' (Apply a) = freeVars' a freeVars' (Proj{} ) = mempty -instance Free' a c => Free' (Arg a) c where- -- {-# SPECIALIZE instance Free' a All => Free' (Arg a) All #-}- -- {-# SPECIALIZE freeVars' :: Free' a Any => Arg a -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: Free' a All => Arg a -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarSet => Arg a -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarMap => Arg a -> FreeM VarMap #-}+instance Free a => Free (Arg a) where freeVars' a = goRel (getRelevance a) $ freeVars' $ unArg a -instance Free' a c => Free' (Dom a) c where- -- {-# SPECIALIZE instance Free' a All => Free' (Dom a) All #-}- -- {-# SPECIALIZE freeVars' :: Free' a Any => Dom a -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: Free' a All => Dom a -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarSet => Dom a -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarMap => Dom a -> FreeM VarMap #-}+instance Free a => Free (Dom a) where freeVars' = freeVars' . unDom -instance Free' a c => Free' (Abs a) c where- -- {-# SPECIALIZE instance Free' a All => Free' (Abs a) All #-}- -- {-# SPECIALIZE freeVars' :: Free' a Any => Abs a -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: Free' a All => Abs a -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarSet => Abs a -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarMap => Abs a -> FreeM VarMap #-}+instance Free a => Free (Abs a) where freeVars' (Abs _ b) = bind $ freeVars' b freeVars' (NoAbs _ b) = freeVars' b -instance Free' a c => Free' (Tele a) c where- -- {-# SPECIALIZE instance Free' a All => Free' (Tele a) All #-}- -- {-# SPECIALIZE freeVars' :: Free' a Any => Tele a -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: Free' a All => Tele a -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarSet => Tele a -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: Free' a VarMap => Tele a -> FreeM VarMap #-}+instance Free a => Free (Tele a) where freeVars' EmptyTel = mempty freeVars' (ExtendTel a tel) = freeVars' (a, tel) -instance Free' Clause c where- -- {-# SPECIALIZE instance Free' Clause All #-}- -- {-# SPECIALIZE freeVars' :: Clause -> FreeM Any #-}- -- {-# SPECIALIZE freeVars' :: Clause -> FreeM All #-}- -- {-# SPECIALIZE freeVars' :: Clause -> FreeM VarSet #-}- -- {-# SPECIALIZE freeVars' :: Clause -> FreeM VarMap #-}+instance Free Clause where freeVars' cl = bind' (size $ clauseTel cl) $ freeVars' $ clauseBody cl -instance Free' EqualityView c where+instance Free EqualityView where freeVars' (OtherType t) = freeVars' t- freeVars' (EqualityType s _eq l t a b) = freeVars' s `mappend` freeVars' [l, t, a, b]+ freeVars' (EqualityType s _eq l t a b) = freeVars' s `mappend` freeVars' (l ++ [t, a, b])
src/full/Agda/TypeChecking/Free/Old.hs view
@@ -321,7 +321,6 @@ freeVars' a = f <$> freeVars' (unArg a) where f = case getRelevance a of Irrelevant -> irrelevantly- UnusedArg -> unused _ -> id
+ src/full/Agda/TypeChecking/Functions.hs view
@@ -0,0 +1,101 @@+{-# LANGUAGE CPP #-}++module Agda.TypeChecking.Functions+ ( etaExpandClause+ , getDef+ ) where++import Control.Arrow ( first )++import Agda.Syntax.Common+import Agda.Syntax.Internal++import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Context+import Agda.TypeChecking.Monad.Debug+import Agda.TypeChecking.Monad.Options+import Agda.TypeChecking.Level+import Agda.TypeChecking.Pretty+import Agda.TypeChecking.Reduce+import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Telescope++import Agda.Utils.Impossible+import Agda.Utils.Functor ( ($>) )+import Agda.Utils.Pretty ( prettyShow )+import Agda.Utils.Monad+import Agda.Utils.Size++#include "undefined.h"++-- | Expand a clause to the maximal arity, by inserting variable+-- patterns and applying the body to variables.++-- Fixes issue #2376.+-- Replaces 'introHiddenLambdas'.+-- See, e.g., test/Succeed/SizedTypesExtendedLambda.agda.++-- This is used instead of special treatment of lambdas+-- (which was unsound: Issue #121)++etaExpandClause :: MonadTCM tcm => Clause -> tcm Clause+etaExpandClause clause = liftTCM $ do+ case clause of+ Clause _ _ ctel ps _ Nothing _ _ -> return clause+ Clause _ _ ctel ps Nothing (Just t) _ _ -> return clause+ Clause rl rf ctel ps (Just body) (Just t) catchall unreachable -> do++ -- Get the telescope to expand the clause with.+ TelV tel0 t' <- telView $ unArg t++ -- If the rhs has lambdas, harvest the names of the bound variables.+ let xs = peekLambdas body+ let ltel = useNames xs $ telToList tel0+ let tel = telFromList ltel+ let n = size tel+ unless (n == size tel0) __IMPOSSIBLE__ -- useNames should not drop anything+ -- Join with lhs telescope, extend patterns and apply body.+ -- NB: no need to raise ctel!+ let ctel' = telFromList $ telToList ctel ++ ltel+ ps' = raise n ps ++ teleNamedArgs tel+ body' = raise n body `apply` teleArgs tel+ reportSDoc "term.clause.expand" 30 $ inTopContext $ vcat+ [ text "etaExpandClause"+ , text " body = " <+> (addContext ctel' $ prettyTCM body)+ , text " xs = " <+> text (prettyShow xs)+ , text " new tel = " <+> prettyTCM ctel'+ ]+ return $ Clause rl rf ctel' ps' (Just body') (Just (t $> t')) catchall unreachable+ where+ -- Get all initial lambdas of the body.+ peekLambdas :: Term -> [Arg ArgName]+ peekLambdas v =+ case ignoreSharing v of+ Lam info b -> Arg info (absName b) : peekLambdas (unAbs b)+ _ -> []++ -- Use the names of the first argument, and set the Origin all other+ -- parts of the telescope to Inserted.+ -- The first list of arguments is a subset of the telescope.+ -- Thus, if compared pointwise, if the hiding does not match,+ -- it means we skipped an element of the telescope.+ useNames :: [Arg ArgName] -> ListTel -> ListTel+ useNames [] tel = map (setOrigin Inserted) tel+ useNames (_:_) [] = [] -- Andreas, 2017-03-24: not IMPOSSIBLE when positivity checking comes before termination checking, see examples/tactics/ac/AC.agda+ useNames (x:xs) (dom:tel)+ | sameHiding x dom =+ -- set the ArgName of the dom+ fmap (first $ const $ unArg x) dom : useNames xs tel+ | otherwise =+ setOrigin Inserted dom : useNames (x:xs) tel++-- | Get the name of defined symbol of the head normal form of a term.+-- Returns 'Nothing' if no such head exists.++getDef :: Term -> TCM (Maybe QName)+getDef t = (ignoreSharing <$> reduce t) >>= \case+ Def d _ -> return $ Just d+ Lam _ v -> underAbstraction_ v getDef+ Level v -> getDef =<< reallyUnLevelView v+ DontCare v -> getDef v+ _ -> return Nothing
src/full/Agda/TypeChecking/Implicit.hs view
@@ -46,10 +46,10 @@ t0' <- reduce t0 case ignoreSharing $ unEl t0' of Pi (Dom info a) b | let x = absName b, expand (getHiding info) x -> do- info' <- if getHiding info == Hidden then return info else do+ info' <- if hidden info then return info else do reportSDoc "tc.term.args.ifs" 15 $ text "inserting instance meta for type" <+> prettyTCM a- return $ setHiding Instance info+ return $ makeInstance info (_, v) <- newMetaArg info' x a let narg = Arg info (Named (Just $ unranged x) v) mapFst (narg :) <$> implicitNamedArgs (n-1) expand (absApp b v)@@ -67,9 +67,9 @@ newMeta (getHiding info) (argNameToString x) a where newMeta :: Hiding -> String -> Type -> TCM (MetaId, Term)- newMeta Instance = newIFSMeta- newMeta Hidden = newNamedValueMeta RunMetaOccursCheck- newMeta NotHidden = newNamedValueMeta RunMetaOccursCheck+ newMeta Instance{} = newIFSMeta+ newMeta Hidden = newNamedValueMeta RunMetaOccursCheck+ newMeta NotHidden = newNamedValueMeta RunMetaOccursCheck -- | Create a questionmark according to the 'Hiding' info. @@ -83,9 +83,9 @@ newMeta (getHiding info) (argNameToString x) a where newMeta :: Hiding -> String -> Type -> TCM (MetaId, Term)- newMeta Instance = newIFSMeta- newMeta Hidden = newNamedValueMeta' DontRunMetaOccursCheck- newMeta NotHidden = newNamedValueMeta' DontRunMetaOccursCheck+ newMeta Instance{} = newIFSMeta+ newMeta Hidden = newNamedValueMeta' RunMetaOccursCheck+ newMeta NotHidden = newNamedValueMeta' RunMetaOccursCheck --------------------------------------------------------------------------- @@ -103,23 +103,24 @@ -- | The list should be non-empty. insertImplicit :: NamedArg e -> [Arg ArgName] -> ImplicitInsertion insertImplicit _ [] = __IMPOSSIBLE__-insertImplicit a ts | notHidden a = impInsert $ nofHidden ts+insertImplicit a ts | visible a = impInsert $ nofHidden ts where nofHidden :: [Arg a] -> [Hiding]- nofHidden = takeWhile (NotHidden /=) . map getHiding+ nofHidden = takeWhile notVisible . map getHiding insertImplicit a ts = case nameOf (unArg a) of Nothing -> maybe BadImplicits impInsert $ upto (getHiding a) $ map getHiding ts Just x -> find [] (rangedThing x) (getHiding a) ts where upto h [] = Nothing- upto h (NotHidden:_) = Nothing- upto h (h':_) | h == h' = Just []- upto h (h':hs) = (h':) <$> upto h hs+ upto h (NotHidden : _) = Nothing+ upto h (h' : _) | sameHiding h h' = Just []+ upto h (h' : hs) = (h' :) <$> upto h hs+ find :: [Hiding] -> ArgName -> Hiding -> [Arg ArgName] -> ImplicitInsertion- find _ x _ (a@(Arg{}) : _) | notHidden a = NoSuchName x+ find _ x _ (a@(Arg{}) : _) | visible a = NoSuchName x find hs x hidingx (a@(Arg _ y) : ts)- | x == y && hidingx == getHiding a = impInsert $ reverse hs- | x == y && hidingx /= getHiding a = BadImplicits- | otherwise = find (getHiding a:hs) x hidingx ts- find i x _ [] = NoSuchName x+ | x == y && sameHiding hidingx a = impInsert $ reverse hs+ | x == y && sameHiding hidingx a = BadImplicits+ | otherwise = find (getHiding a : hs) x hidingx ts+ find i x _ [] = NoSuchName x
src/full/Agda/TypeChecking/Injectivity.hs view
@@ -34,6 +34,7 @@ import Agda.Utils.List import Agda.Utils.Maybe import Agda.Utils.Permutation+import Agda.Utils.Pretty ( prettyShow ) #include "undefined.h" import Agda.Utils.Impossible@@ -55,7 +56,7 @@ Datatype{} -> yes Record{} -> yes Axiom{} -> do- reportSLn "tc.inj.axiom" 50 $ "headSymbol: " ++ show f ++ " is an Axiom."+ reportSLn "tc.inj.axiom" 50 $ "headSymbol: " ++ prettyShow f ++ " is an Axiom." -- Don't treat axioms in the current mutual block -- as constructors (they might have definitions we -- don't know about yet).@@ -65,7 +66,7 @@ Function{} -> no Primitive{} -> no Constructor{} -> __IMPOSSIBLE__- AbstractDefn -> __IMPOSSIBLE__+ AbstractDefn{}-> __IMPOSSIBLE__ Con c _ _ -> return (Just $ ConsHead $ conName c) Sort _ -> return (Just SortHead) Pi _ _ -> return (Just PiHead)@@ -82,7 +83,7 @@ checkInjectivity f cs | pointLess cs = do reportSLn "tc.inj.check.pointless" 20 $- "Injectivity of " ++ show (A.qnameToConcrete f) ++ " would be pointless."+ "Injectivity of " ++ prettyShow (A.qnameToConcrete f) ++ " would be pointless." return NotInjective where -- Is it pointless to use injectivity for this function?@@ -93,7 +94,7 @@ -- If we only have record patterns, it is also pointless. -- We need at least one proper match. checkInjectivity f cs = do- reportSLn "tc.inj.check" 40 $ "Checking injectivity of " ++ show f+ reportSLn "tc.inj.check" 40 $ "Checking injectivity of " ++ prettyShow f -- Extract the head symbol of the rhs of each clause (skip absurd clauses) es <- catMaybes <$> do forM cs $ \ c -> do -- produces a list ...@@ -103,10 +104,10 @@ if all isJust hs && distinct hs then do let inv = Map.fromList (map fromJust hs `zip` ps)- reportSLn "tc.inj.check" 20 $ show f ++ " is injective."+ reportSLn "tc.inj.check" 20 $ prettyShow f ++ " is injective." reportSDoc "tc.inj.check" 30 $ nest 2 $ vcat $ for (Map.toList inv) $ \ (h, c) ->- text (show h) <+> text "-->" <+>+ text (prettyShow h) <+> text "-->" <+> fsep (punctuate comma $ map (prettyTCM . namedArg) $ namedClausePats c) return $ Inverse inv else return NotInjective@@ -230,7 +231,7 @@ reportSDoc "tc.inj.invert" 30 $ vcat [ text "aborting inversion;" <+> prettyTCM org , text "plainly," <+> text (show org)- , text "has TermHead" <+> text (show h)+ , text "has TermHead" <+> text (prettyShow h) , text "which does not expose a constructor" ] return Abort@@ -258,6 +259,7 @@ metaPat (DotP v) = dotP v metaPat (VarP _) = nextMeta+ metaPat (AbsurdP p) = metaPat p metaPat (ConP c mt args) = Con c (fromConPatternInfo mt) <$> metaArgs args metaPat (LitP l) = return $ Lit l metaPat ProjP{} = __IMPOSSIBLE__
src/full/Agda/TypeChecking/InstanceArguments.hs view
@@ -8,7 +8,7 @@ import Control.Monad.State import qualified Data.Map as Map import qualified Data.Set as Set-import Data.List as List+import qualified Data.List as List import Agda.Syntax.Common import Agda.Syntax.Internal as I@@ -45,39 +45,46 @@ -- for instance search. initialIFSCandidates :: Type -> TCM (Maybe [Candidate]) initialIFSCandidates t = do- cands1 <- getContextVars otn <- getOutputTypeName t case otn of- NoOutputTypeName -> typeError $ GenericError $ "Instance search can only be used to find elements in a named type"+ NoOutputTypeName -> typeError $ GenericError $+ "Instance search can only be used to find elements in a named type" OutputTypeNameNotYetKnown -> return Nothing- OutputTypeVar -> return $ Just cands1- OutputTypeName n -> do- cands2 <- getScopeDefs n- return $ Just $ cands1 ++ cands2+ OutputTypeVar -> Just <$> getContextVars+ OutputTypeName n -> Just <$> do (++) <$> getContextVars <*> getScopeDefs n where -- get a list of variables with their type, relative to current context getContextVars :: TCM [Candidate] getContextVars = do ctx <- getContext- let vars = [ Candidate (var i) (raise (i + 1) t) ExplicitStayExplicit (argInfoOverlappable info)- | (Dom info (x, t), i) <- zip ctx [0..]- , getHiding info == Instance+ reportSDoc "tc.instance.cands" 40 $ hang (text "Getting candidates from context") 2 (inTopContext $ prettyTCM ctx)+ -- Context variables with their types lifted to live in the full context+ let varsAndRaisedTypes = [ (var i, raise (i + 1) t) | (i, t) <- zip [0..] ctx ]+ vars = [ Candidate x t ExplicitStayExplicit (isOverlappable info)+ | (x, Dom info (_, t)) <- varsAndRaisedTypes+ , isInstance info , not (unusableRelevance $ argInfoRelevance info) ] -- {{}}-fields of variables are also candidates- let cxtAndTypes = [ (var i, snd $ unDom $ raise (i + 1) t) | (i, t) <- zip [0..] ctx ]+ let cxtAndTypes = [ (x, t) | (x, Dom _ (_, t)) <- varsAndRaisedTypes ] fields <- concat <$> mapM instanceFields (reverse cxtAndTypes)- reportSDoc "tc.instance.fields" 30 $ text "instance field candidates" $$ nest 2 (vcat- [ sep [ (if overlap then text "overlap" else empty) <+> prettyTCM v <+> text ":"- , nest 2 $ prettyTCM t ] | Candidate v t _ overlap <- fields ])+ reportSDoc "tc.instance.fields" 30 $+ if null fields then text "no instance field candidates" else+ text "instance field candidates" $$ do+ nest 2 $ vcat+ [ sep [ (if overlap then text "overlap" else empty) <+> prettyTCM v <+> text ":"+ , nest 2 $ prettyTCM t+ ]+ | Candidate v t _ overlap <- fields+ ] -- get let bindings env <- asks envLetBindings env <- mapM (getOpen . snd) $ Map.toList env let lets = [ Candidate v t ExplicitStayExplicit False | (v, Dom info t) <- env- , getHiding info == Instance+ , isInstance info , not (unusableRelevance $ argInfoRelevance info) ] return $ vars ++ fields ++ lets@@ -91,7 +98,7 @@ m <- currentModule -- Are we inside the record module? If so it's safe and desirable -- to eta-expand once (issue #2320).- if qnameToList r `isPrefixOf` mnameToList m+ if qnameToList r `List.isPrefixOf` mnameToList m then return (Just (r, vs)) else return Nothing r -> return r@@ -102,8 +109,8 @@ (tel, args) <- forceEtaExpandRecord r pars v let types = map unDom $ applySubst (parallelS $ reverse $ map unArg args) (flattenTel tel) fmap concat $ forM (zip args types) $ \ (arg, t) ->- ([ Candidate (unArg arg) t ExplicitStayExplicit (argInfoOverlappable $ argInfo arg)- | getHiding arg == Instance ] ++) <$>+ ([ Candidate (unArg arg) t ExplicitStayExplicit (isOverlappable arg)+ | isInstance arg ] ++) <$> instanceFields' False (unArg arg, t) getScopeDefs :: QName -> TCM [Candidate]@@ -114,17 +121,19 @@ catMaybes <$> mapM (candidate rel) qs candidate :: Relevance -> QName -> TCM (Maybe Candidate)- candidate rel q =+ candidate rel q = ifNotM (isNameInScope q <$> getScope) (return Nothing) $ do -- Andreas, 2012-07-07: -- we try to get the info for q -- while opening a module, q may be in scope but not in the signature -- in this case, we just ignore q (issue 674) flip catchError handle $ do def <- getConstInfo q- let r = defRelevance def- if not (r `moreRelevant` rel) then return Nothing else do- t <- defType <$> instantiateDef def+ if not (defRelevance def `moreRelevant` rel) then return Nothing else do+ -- Andreas, 2017-01-14: instantiateDef is a bit of an overkill+ -- if we anyway get the freeVarsToApply+ -- WAS: t <- defType <$> instantiateDef def args <- freeVarsToApply q+ let t = defType def `piApply` args let v = case theDef def of -- drop parameters if it's a projection function... Function{ funProjection = Just p } -> projDropParsApply p ProjSystem args@@ -134,8 +143,7 @@ -- Ulf, 2014-08-20: constructors are always instances. Constructor{ conSrcCon = c } -> Con c ConOSystem [] _ -> Def q $ map Apply args- inScope <- isNameInScope q <$> getScope- return $ Candidate v t ExplicitToInstance False <$ guard inScope+ return $ Just $ Candidate v t ExplicitToInstance False where -- unbound constant throws an internal error handle (TypeError _ (Closure {clValue = InternalError _})) = return Nothing@@ -156,33 +164,33 @@ mv <- lookupMeta m setCurrentRange mv $ do reportSLn "tc.instance" 20 $ "The type of the FindInScope constraint isn't known, trying to find it again."- t <- getMetaType m---- -- We create a new meta (which can have additional leading lambdas, if the--- -- type @t@ now happens to be a function type) and the associated constraint--- newM <- initializeIFSMeta (miNameSuggestion $ mvInfo mv) t---- -- ... and we assign it to the previous one--- ctxElims <- map Apply <$> getContextArgs--- solveConstraint $ ValueCmp CmpEq t (MetaV m ctxElims) newM+ t <- instantiate =<< getMetaTypeInContext m+ reportSLn "tc.instance" 70 $ "findInScope 1: t: " ++ prettyShow t --- {-- cands <- initialIFSCandidates t+ -- Issue #2577: If the target is a function type the arguments are+ -- potential candidates, so we add them to the context to make+ -- initialIFSCandidates pick them up.+ TelV tel t <- telView t+ cands <- addContext' tel $ initialIFSCandidates t case cands of- Nothing -> addConstraint $ FindInScope m Nothing Nothing+ Nothing -> do+ reportSLn "tc.instance" 20 "Can't figure out target of instance goal. Postponing constraint."+ addConstraint $ FindInScope m Nothing Nothing Just {} -> findInScope m cands--- -}+ findInScope m (Just cands) = whenJustM (findInScope' m cands) $ (\ (cands, b) -> addConstraint $ FindInScope m b $ Just cands) -- | Result says whether we need to add constraint, and if so, the set of -- remaining candidates and an eventual blocking metavariable. findInScope' :: MetaId -> [Candidate] -> TCM (Maybe ([Candidate], Maybe MetaId))-findInScope' m cands = ifM (isFrozen m) (return (Just (cands, Nothing))) $ do+findInScope' m cands = ifM (isFrozen m) (do+ reportSLn "tc.instance" 20 "Refusing to solve frozen instance meta."+ return (Just (cands, Nothing))) $ do -- Andreas, 2013-12-28 issue 1003: -- If instance meta is already solved, simply discard the constraint. -- Ulf, 2016-12-06 issue 2325: But only if *fully* instantiated.- ifM (isFullyInstantiatedMeta m) (return Nothing) $ do+ ifM (isFullyInstantiatedMeta m) (Nothing <$ reportSLn "tc.instance" 20 "Instance meta already solved.") $ do -- Andreas, 2015-02-07: New metas should be created with range of the -- current instance meta, thus, we set the range. mv <- lookupMeta m@@ -192,16 +200,23 @@ reportSDoc "tc.instance" 60 $ nest 2 $ vcat [ sep [ (if overlap then text "overlap" else empty) <+> prettyTCM v <+> text ":" , nest 2 $ prettyTCM t ] | Candidate v t _ overlap <- cands ]+ reportSDoc "tc.instance" 70 $ text "raw" $$ do+ nest 2 $ vcat+ [ sep [ (if overlap then text "overlap" else empty) <+> pretty v <+> text ":"+ , nest 2 $ pretty t ] | Candidate v t _ overlap <- cands ] t <- normalise =<< getMetaTypeInContext m+ reportSLn "tc.instance" 70 $ "findInScope 2: t: " ++ prettyShow t insidePi t $ \ t -> do reportSDoc "tc.instance" 15 $ text "findInScope 3: t =" <+> prettyTCM t- reportSLn "tc.instance" 70 $ "findInScope 3: t: " ++ show t+ reportSLn "tc.instance" 70 $ "findInScope 3: t: " ++ prettyShow t -- If one of the arguments of the typeclass is a meta which is not rigidly -- constrained, then don’t do anything because it may loop.- ifJustM (areThereNonRigidMetaArguments (unEl t)) (\ m -> do- reportSLn "tc.instance" 15 "aborting due to non-rigidly constrained metas"- return (Just (cands, Just m))) $ do+ let abortNonRigid m = do+ reportSLn "tc.instance" 15 $+ "aborting due to non-rigidly constrained meta " ++ show m+ return $ Just (cands, Just m)+ ifJustM (areThereNonRigidMetaArguments (unEl t)) abortNonRigid $ {-else-} do mcands <- checkCandidates m t cands debugConstraints@@ -237,7 +252,7 @@ insidePi :: Type -> (Type -> TCM a) -> TCM a insidePi t ret = case ignoreSharing $ unEl t of- Pi a b -> addContext' (absName b, a) $ insidePi (unAbs b) ret+ Pi a b -> addContext' (absName b, a) $ insidePi (absBody b) ret Def{} -> ret t Var{} -> ret t Sort{} -> __IMPOSSIBLE__@@ -340,16 +355,16 @@ Var _ es -> areThereNonRigidMetaArgs es Con _ _ vs-> areThereNonRigidMetaArgs (map Apply vs) MetaV i _ -> ifM (isRigid i) (return Nothing) $ do- -- Ignore unconstrained level and size metas (#1865)- Def lvl [] <- ignoreSharing <$> primLevel- sz <- for (fmap ignoreSharing <$> getBuiltin' builtinSize) $ \case- Just (Def sz []) -> [sz]- Nothing -> []- _ -> __IMPOSSIBLE__- o <- getOutputTypeName . jMetaType . mvJudgement =<< lookupMeta i- case o of- OutputTypeName l | elem l (lvl : sz) -> return Nothing- _ -> return (Just i)+ -- Ignore unconstrained level and size metas (#1865)+ mlvl <- getBuiltinDefName builtinLevel+ (msz, mszlt) <- getBuiltinSize+ let ok = catMaybes [ mlvl, msz ] -- , mszlt ] -- ?! Andreas, 2016-12-22+ -- @Ulf: are SIZELT metas excluded on purpose?+ -- How to you know the level/size meta is unconstrained?+ o <- getOutputTypeName . jMetaType . mvJudgement =<< lookupMeta i+ case o of+ OutputTypeName l | elem l ok -> return Nothing+ _ -> return $ Just i Lam _ t -> isNonRigidMeta (unAbs t) _ -> return Nothing @@ -387,13 +402,13 @@ -- Drop all candidates which are judgmentally equal to the first one. -- This is sufficient to reduce the list to a singleton should all be equal. dropSameCandidates :: MetaId -> [(Candidate, Term, Type, a)] -> TCM [(Candidate, Term, Type, a)]-dropSameCandidates m cands0 = do+dropSameCandidates m cands0 = verboseBracket "tc.instance" 30 "dropSameCandidates" $ do metas <- Set.fromList . Map.keys <$> getMetaStore let freshMetas x = not $ Set.null $ Set.difference (Set.fromList $ allMetas x) metas -- Take overlappable candidates into account let cands =- case partition (\ (c, _, _, _) -> candidateOverlappable c) cands0 of+ case List.partition (\ (c, _, _, _) -> candidateOverlappable c) cands0 of (cand : _, []) -> [cand] -- only overlappable candidates: pick the first one _ -> cands0 -- otherwise require equality @@ -405,16 +420,18 @@ rel <- getMetaRelevance <$> lookupMeta m case cands of [] -> return cands+ cvd : _ | isIrrelevant rel -> do+ reportSLn "tc.instance" 30 "Meta is irrelevant so any candidate will do."+ return [cvd] cvd@(_, v, a, _) : vas -> do if freshMetas (v, a) then return (cvd : vas) else (cvd :) <$> dropWhileM equal vas where- equal _ | isIrrelevant rel = return True equal (_, v', a', _) | freshMetas (v', a') = return False -- If there are fresh metas we can't compare | otherwise =- verboseBracket "tc.instance" 30 "checkEqualCandidates" $ do+ verboseBracket "tc.instance" 30 "comparingCandidates" $ do reportSDoc "tc.instance" 30 $ sep [ prettyTCM v <+> text "==", nest 2 $ prettyTCM v' ] localTCState $ dontAssignMetas $ ifNoConstraints_ (equalType a a' >> equalTerm a v v') {- then -} (return True)@@ -471,7 +488,7 @@ debugConstraints verboseBracket "tc.instance" 20 ("checkCandidateForMeta " ++ prettyShow m) $ liftTCM $ runCandidateCheck $ do- reportSLn "tc.instance" 70 $ " t: " ++ show t ++ "\n t':" ++ show t' ++ "\n term: " ++ show term ++ "."+ reportSLn "tc.instance" 70 $ " t: " ++ prettyShow t ++ "\n t':" ++ prettyShow t' ++ "\n term: " ++ prettyShow term ++ "." reportSDoc "tc.instance" 20 $ vcat [ text "checkCandidateForMeta" , text "t =" <+> prettyTCM t@@ -480,20 +497,28 @@ ] -- Apply hidden and instance arguments (recursive inst. search!).- (args, t'') <- implicitArgs (-1) (\h -> h /= NotHidden || eti == ExplicitToInstance) t'+ (args, t'') <- implicitArgs (-1) (\h -> notVisible h || eti == ExplicitToInstance) t' reportSDoc "tc.instance" 20 $ text "instance search: checking" <+> prettyTCM t'' <+> text "<=" <+> prettyTCM t- ctxElims <- map Apply <$> getContextArgs+ reportSDoc "tc.instance" 70 $ vcat+ [ text "instance search: checking (raw)"+ , nest 4 $ pretty t''+ , nest 2 $ text "<="+ , nest 4 $ pretty t+ ] v <- (`applyDroppingParameters` args) =<< reduce term reportSDoc "tc.instance" 15 $ vcat [ text "instance search: attempting" , nest 2 $ prettyTCM m <+> text ":=" <+> prettyTCM v ]+ reportSDoc "tc.instance" 70 $ nest 2 $+ text "candidate v = " <+> pretty v -- if constraints remain, we abort, but keep the candidate -- Jesper, 05-12-2014: When we abort, we should add a constraint to -- instantiate the meta at a later time (see issue 1377).+ ctxElims <- map Apply <$> getContextArgs guardConstraint (ValueCmp CmpEq t'' (MetaV m ctxElims) v) $ leqType t'' t -- make a pass over constraints, to detect cases where some are made -- unsolvable by the assignment, but don't do this for FindInScope's@@ -553,7 +578,7 @@ Con c ci [] -> do def <- theDef <$> getConInfo c case def of- Constructor {conPars = n} -> return $ Con c ci (genericDrop n vs)+ Constructor {conPars = n} -> return $ Con c ci (drop n vs) _ -> __IMPOSSIBLE__ Def f [] -> do mp <- isProjection f
src/full/Agda/TypeChecking/Irrelevance.hs view
@@ -4,6 +4,7 @@ -} module Agda.TypeChecking.Irrelevance where +import Control.Arrow (first, second) import Control.Applicative import Control.Monad.Reader @@ -50,7 +51,7 @@ workOnTypes' :: Bool -> TCM a -> TCM a workOnTypes' experimental cont = modifyContext (modifyContextEntries $ mapRelevance f) cont where- f | experimental = irrToNonStrict+ f | experimental = irrToNonStrict . nonStrictToRel | otherwise = nonStrictToRel -- | (Conditionally) wake up irrelevant variables and make them relevant.@@ -63,17 +64,24 @@ Relevant -> id Forced{} -> id _ -> local $ \ e -> e- { envContext = modifyContextEntries (inverseApplyRelevance rel) (envContext e)- , envLetBindings = Map.map- (fmap $ \ (t, a) -> (t, inverseApplyRelevance rel a))- (envLetBindings e)+ { envContext = modifyContextEntries (inverseApplyRelevance rel) (envContext e)+ , envLetBindings = (Map.map . fmap . second) (inverseApplyRelevance rel) (envLetBindings e) -- enable local irr. defs- , envRelevance = composeRelevance rel (envRelevance e)+ , envRelevance = composeRelevance rel (envRelevance e) -- enable global irr. defs } --- | Wake up irrelevant variables and make them relevant. For instance,--- in an irrelevant function argument otherwise irrelevant variables--- may be used, so they are awoken before type checking the argument.+-- | Wake up irrelevant variables and make them relevant. This is used+-- when type checking terms in a hole, in which case you want to be able to+-- (for instance) infer the type of an irrelevant variable. In the course+-- of type checking an irrelevant function argument 'applyRelevanceToContext'+-- is used instead, which also sets the context relevance to 'Irrelevant'.+-- This is not the right thing to do when type checking interactively in a+-- hole since it also marks all metas created during type checking as+-- irrelevant (issue #2568). wakeIrrelevantVars :: TCM a -> TCM a-wakeIrrelevantVars = applyRelevanceToContext Irrelevant+wakeIrrelevantVars = local $ \ e -> e+ { envContext = modifyContextEntries (inverseApplyRelevance Irrelevant) (envContext e)+ , envLetBindings = (Map.map . fmap . second) (inverseApplyRelevance Irrelevant) (envLetBindings e)+ }+
src/full/Agda/TypeChecking/Level.hs view
@@ -4,7 +4,7 @@ import Control.Applicative import Data.Maybe-import Data.List as List+import qualified Data.List as List import Data.Traversable (Traversable,traverse) import Agda.Syntax.Common@@ -90,8 +90,8 @@ as -> foldr1 max as unPlusV :: Term -> (Term -> Term) -> PlusLevel -> Term-unPlusV zer suc (ClosedLevel n) = foldr (.) id (genericReplicate n suc) zer-unPlusV _ suc (Plus n a) = foldr (.) id (genericReplicate n suc) (unLevelAtom a)+unPlusV zer suc (ClosedLevel n) = foldr (.) id (List.genericReplicate n suc) zer+unPlusV _ suc (Plus n a) = foldr (.) id (List.genericReplicate n suc) (unLevelAtom a) maybePrimCon :: TCM Term -> TCM (Maybe ConHead) maybePrimCon prim = tryMaybe $ do
src/full/Agda/TypeChecking/LevelConstraints.hs view
@@ -2,7 +2,7 @@ module Agda.TypeChecking.LevelConstraints ( simplifyLevelConstraint ) where -import Data.List as List+import qualified Data.List as List import Agda.Syntax.Internal import Agda.TypeChecking.Monad.Base import Agda.TypeChecking.Substitute@@ -35,8 +35,8 @@ | length xs == length ys = (a, b) == applySubst rho (c, d) | otherwise = False where- free :: Free' a [Int] => a -> [Int]- free = nub . runFree ((:[]) . fst) IgnoreNot+ free :: Free a => a -> [Int]+ free = List.nub . runFree (:[]) IgnoreNot -- Note: use a list to preserve order of variables xs = free (a, b) ys = free (c, d) rho = mkSub $ List.sort $ zip ys xs
src/full/Agda/TypeChecking/MetaVars.hs view
@@ -8,7 +8,6 @@ import Control.Monad.Reader import Data.Function-import Data.List hiding (sort, null) import qualified Data.List as List import qualified Data.Map as Map import qualified Data.Foldable as Fold@@ -40,9 +39,6 @@ import Agda.Utils.Except ( ExceptT-#if !MIN_VERSION_transformers(0,4,1)- , Error(noMsg)-#endif , MonadError(throwError) , runExceptT )@@ -67,7 +63,7 @@ -- @reverse@ is necessary because we are directly abstracting over the list. -- findIdx :: Eq a => [a] -> a -> Maybe Int-findIdx vs v = findIndex (==v) (reverse vs)+findIdx vs v = List.findIndex (==v) (reverse vs) -- | Check whether a meta variable is a place holder for a blocked term. isBlockedTerm :: MetaId -> TCM Bool@@ -128,19 +124,13 @@ -- dontAssignMetas $ do -- checkInternal t . jMetaType . mvJudgement =<< lookupMeta x - let i = metaInstance tel $ killRange v- verboseS "profile.metas" 10 $ liftTCM $ tickMax "max-open-metas" . size =<< getOpenMetas- modifyMetaStore $ ins x i+ verboseS "profile.metas" 10 $ liftTCM $ tickMax "max-open-metas" . (fromIntegral . size) =<< getOpenMetas+ modifyMetaStore $ ins x $ InstV tel $ killRange v etaExpandListeners x wakeupConstraints x reportSLn "tc.meta.assign" 20 $ "completed assignment of " ++ prettyShow x where- metaInstance tel v = InstV tel v- ins x i store = Map.adjust (inst i) x store- inst i mv = mv { mvInstantiation = i }-- -- Andreas, 2013-10-25 hack to fool the unused-imports-checking-Nazi- -- phantomUseToOverruleStrictImportsChecking = checkInternal+ ins x i = Map.adjust (\ mv -> mv { mvInstantiation = i }) x -- * Creating meta variables. @@ -190,15 +180,11 @@ -- | @newIFSMeta s t cands@ creates a new "implicit from scope" metavariable -- of type the output type of @t@ with name suggestion @s@.--- If @t@ is a function type, then insert enough--- lambdas in front of it. newIFSMeta :: MetaNameSuggestion -> Type -> TCM (MetaId, Term) newIFSMeta s t = do- TelV tel t' <- telView t- addContext tel $ do- vs <- getContextArgs- ctx <- getContextTelescope- mapSnd (teleLam tel) <$> newIFSMetaCtx s (telePi_ ctx t') vs+ vs <- getContextArgs+ ctx <- getContextTelescope+ newIFSMetaCtx s (telePi_ ctx t) vs newIFSMetaCtx :: MetaNameSuggestion -> Type -> Args -> TCM (MetaId, Term) newIFSMetaCtx s t vs = do@@ -214,7 +200,11 @@ reportSDoc "tc.meta.new" 50 $ fsep [ nest 2 $ pretty x <+> text ":" <+> prettyTCM t ]- addConstraint $ FindInScope x Nothing Nothing+ let c = FindInScope x Nothing Nothing+ -- If we're not already solving instance constraints we should add this+ -- to the awake constraints to make sure we don't forget about it. If we+ -- are solving constraints it will get woken up later (see #2690)+ ifM isSolvingConstraints (addConstraint c) (addAwakeConstraint' c) etaExpandMetaSafe x return (x, MetaV x $ map Apply vs) @@ -319,7 +309,7 @@ return $ Con con ConOSystem fields newQuestionMark :: InteractionId -> Type -> TCM (MetaId, Term)-newQuestionMark = newQuestionMark' $ newValueMeta' DontRunMetaOccursCheck+newQuestionMark = newQuestionMark' $ newValueMeta' RunMetaOccursCheck newQuestionMark' :: (Type -> TCM (MetaId, Term)) -> InteractionId -> Type -> TCM (MetaId, Term) newQuestionMark' new ii t = do@@ -469,7 +459,7 @@ -- | Eta expand a metavariable, if it is of the specified kind. -- Don't do anything if the metavariable is a blocked term. etaExpandMeta :: [MetaKind] -> MetaId -> TCM ()-etaExpandMeta kinds m = whenM (isEtaExpandable kinds m) $ do+etaExpandMeta kinds m = whenM (asks envAssignMetas `and2M` isEtaExpandable kinds m) $ do verboseBracket "tc.meta.eta" 20 ("etaExpandMeta " ++ prettyShow m) $ do let waitFor x = do reportSDoc "tc.meta.eta" 20 $ do@@ -595,8 +585,12 @@ -- arguments to definitions as flexible), if that fails it tries again -- with full unfolding. v <- instantiate v- reportSLn "tc.meta.assign" 50 $ "MetaVars.assign: assigning to " ++ show v+ reportSDoc "tc.meta.assign" 45 $+ text "MetaVars.assign: assigning to " <+> prettyTCM v + reportSLn "tc.meta.assign" 75 $+ "MetaVars.assign: assigning to " ++ show v+ case (ignoreSharing v, mvJudgement mvar) of (Sort Inf, HasType{}) -> typeError SetOmegaNotValidType _ -> return ()@@ -629,8 +623,22 @@ -- args <- etaContract =<< normalise args -- Also, try to expand away projected vars in meta args.+ reportSDoc "tc.meta.assign.proj" 45 $ do+ cxt <- getContextTelescope+ vcat+ [ text "context before projection expansion"+ , nest 2 $ inTopContext $ prettyTCM cxt+ ]+ expandProjectedVars args v $ \ args v -> do + reportSDoc "tc.meta.assign.proj" 45 $ do+ cxt <- getContextTelescope+ vcat+ [ text "context after projection expansion"+ , nest 2 $ inTopContext $ prettyTCM cxt+ ]+ -- If we had the type here we could save the work we put -- into expanding projected variables. -- catchConstraint (ValueCmp CmpEq ? (MetaV m $ map Apply args) v) $ do@@ -641,16 +649,12 @@ (relVL, irrVL) <- do -- Andreas, 2016-11-03 #2211 attempt to do s.th. for unused- if False -- irrelevantOrUnused $ getMetaRelevance mvar+ if False -- irrelevant $ getMetaRelevance mvar then do reportSDoc "tc.meta.assign" 25 $ text "meta is irrelevant or unused" return (Set.toList $ allFreeVars args, empty) else do- -- Andreas, 2016-11-03, issue #2211- -- treating UnusedArg as Irrelevant bears trouble- -- since the UnusedArg info is not consistently present- -- Thus, make sure we include the "unused" variables.- let relVL = Set.toList $ allRelevantOrUnusedVars args+ let relVL = Set.toList $ allRelevantVars args -- Andreas, 2011-10-06 only irrelevant vars that are direct -- arguments to the meta, hence, can be abstracted over, may -- appear on the rhs. (test/fail/Issue483b)@@ -663,7 +667,7 @@ fromIrrVar _ = return [] irrVL <- concat <$> mapM fromIrrVar [ v | Arg info v <- args, isIrrelevant info ]- -- irrelevantOrUnused (getRelevance info) ]+ -- irrelevant (getRelevance info) ] return (relVL, irrVL) reportSDoc "tc.meta.assign" 20 $ let pr (Var n []) = text (show n)@@ -907,8 +911,22 @@ patternViolation -- WAS: __IMPOSSIBLE__ -- Perform the assignment (and wake constraints).++ let vsol = abstract tel' v'+ -- -- Andreas, 2013-10-25 double check solution before assigning+ -- -- Andreas, 2017-07-28+ -- m <- lookupMeta x+ -- case mvJudgement m of+ -- IsSort{} -> return () -- skip double check since type of meta is not accurate+ -- HasType _ a -> do+ -- reportSDoc "tc.meta.check" 30 $ vcat+ -- [ text "double checking solution"+ -- , nest 2 $ prettyTCM vsol <+> text " : " <+> prettyTCM a+ -- ]+ -- dontAssignMetas $ checkInternal vsol a -- This can crash at assignTerm'!+ reportSDoc "tc.meta.assign" 10 $- text "solving" <+> prettyTCM x <+> text ":=" <+> prettyTCM (abstract tel' v')+ text "solving" <+> prettyTCM x <+> text ":=" <+> prettyTCM vsol assignTerm x (telToArgs tel') v' @@ -991,16 +1009,12 @@ data ProjVarExc = ProjVarExc Int [(ProjOrigin, QName)] --- ASR (17 June 2015). Unused Error instance.--- instance Error ProjVarExc where--- noMsg = __IMPOSSIBLE__- instance NoProjectedVar Term where noProjectedVar t = case ignoreSharing t of Var i es | qs@(_:_) <- takeWhileJust id $ map isProjElim es -> Left $ ProjVarExc i qs- -- Andreas, 2015-09-12 Issue 1316:+ -- Andreas, 2015-09-12 Issue #1316: -- Also look in inductive record constructors Con (ConHead _ Inductive (_:_)) _ vs -> noProjectedVar vs _ -> return ()@@ -1071,7 +1085,7 @@ -- Otherwise, raise the error. checkLinearity :: SubstCand -> ExceptT () TCM SubstCand checkLinearity ids0 = do- let ids = sortBy (compare `on` fst) ids0 -- see issue 920+ let ids = List.sortBy (compare `on` fst) ids0 -- see issue 920 let grps = groupOn fst ids concat <$> mapM makeLinear grps where@@ -1094,11 +1108,6 @@ | NeutralArg -- ^ A potentially neutral arg: can't invert, but can try pruning. | ProjectedVar Int [(ProjOrigin, QName)] -- ^ Try to eta-expand var to remove projs. -#if !MIN_VERSION_transformers(0,4,1)-instance Error InvertExcept where- noMsg = CantInvert-#endif- -- | Check that arguments @args@ to a metavar are in pattern fragment. -- Assumes all arguments already in whnf and eta-reduced. -- Parameters are represented as @Var@s so @checkArgs@ really@@ -1137,10 +1146,6 @@ Arg info (Con c ci vs) -> do let fallback | isIrrelevant info = return vars- -- Andreas, 2016-11-03, issue #2211- -- treating UnusedArg as Irrelevant bears trouble- -- since the UnusedArg info is not consistently present- -- irrelevantOrUnused (getRelevance info) = return vars | otherwise = failure isRC <- lift $ isRecordConstructor $ conName c case isRC of@@ -1151,7 +1156,6 @@ { argInfoHiding = min (getHiding info) (getHiding info') , argInfoRelevance = max (getRelevance info) (getRelevance info') , argInfoOrigin = min (getOrigin info) (getOrigin info')- , argInfoOverlappable = False } res <- loop $ zipWith aux vs fs return $ res `append` vars@@ -1161,10 +1165,6 @@ -- An irrelevant argument which is not an irrefutable pattern is dropped Arg info _ | isIrrelevant info -> return vars- -- Andreas, 2016-11-03, issue #2211- -- treating UnusedArg as Irrelevant bears trouble- -- since the UnusedArg info is not consistently present- -- irrelevantOrUnused (getRelevance info) -> return vars -- Andreas, 2013-10-29 -- An irrelevant part can also be marked by a DontCare -- (coming from an irrelevant projection), see Issue 927:@@ -1189,7 +1189,7 @@ -- adding an irrelevant entry only if not present cons :: (Arg Nat, Term) -> Res -> Res- cons a@(Arg (ArgInfo _ Irrelevant _ _) i, t) vars -- TODO? UnusedArg?!+ cons a@(Arg (ArgInfo _ Irrelevant _) i, t) vars | any ((i==) . unArg . fst) vars = vars | otherwise = a : vars -- adding a relevant entry:
src/full/Agda/TypeChecking/MetaVars/Mention.hs view
@@ -94,7 +94,7 @@ TypeCmp _ a b -> mm (a, b) TelCmp a b _ u v -> mm ((a, b), (u, v)) SortCmp _ a b -> mm (a, b)- Guarded c _ -> mm c+ Guarded{} -> False -- This gets woken up when the problem it's guarded by is solved UnBlock _ -> True -- this might be a postponed typechecking -- problem and we don't have a handle on -- what metas it depends on
src/full/Agda/TypeChecking/MetaVars/Occurs.hs view
@@ -256,7 +256,11 @@ if (i `allowedVar` xs) then Var i <$> occ (weakly ctx) es else do -- if the offending variable is of singleton type, -- eta-expand it away- isST <- isSingletonType =<< typeOfBV i+ reportSDoc "tc.meta.occurs" 35 $ text "offending variable: " <+> prettyTCM (var i)+ t <- typeOfBV i+ reportSDoc "tc.meta.occurs" 35 $ nest 2 $ text "of type " <+> prettyTCM t+ isST <- isSingletonType t+ reportSDoc "tc.meta.occurs" 35 $ nest 2 $ text "(after singleton test)" case isST of -- cannot decide, blocked by meta-var Left mid -> patternViolation' 70 $ "Disallowed var " ++ show i ++ " not obviously singleton"@@ -486,7 +490,6 @@ [ text "attempting kills" , nest 2 $ vcat [ text "m' =" <+> pretty m'- -- , text "xs =" <+> text (show xs) , text "xs =" <+> prettyList (map (prettyTCM . var) xs) , text "vs =" <+> prettyList (map prettyTCM vs) , text "kills =" <+> text (show kills)@@ -546,7 +549,7 @@ def <- getConstInfo f if defMatchable def then no else do case theDef def of- AbstractDefn -> yes+ AbstractDefn{} -> yes Axiom{} -> yes Datatype{} -> yes Record{} -> yes@@ -643,7 +646,6 @@ foldRigid f a = case getRelevance a of Irrelevant -> mempty- UnusedArg -> mempty _ -> foldRigid f $ unArg a instance FoldRigid a => FoldRigid (Dom a) where
src/full/Agda/TypeChecking/Monad.hs view
@@ -3,6 +3,7 @@ , module Agda.TypeChecking.Monad.Closure , module Agda.TypeChecking.Monad.Constraints , module Agda.TypeChecking.Monad.Context+ , module Agda.TypeChecking.Monad.Debug , module Agda.TypeChecking.Monad.Env , module Agda.TypeChecking.Monad.Imports , module Agda.TypeChecking.Monad.Local@@ -23,6 +24,7 @@ import Agda.TypeChecking.Monad.Closure import Agda.TypeChecking.Monad.Constraints import Agda.TypeChecking.Monad.Context+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.Env import Agda.TypeChecking.Monad.Imports import Agda.TypeChecking.Monad.Local
src/full/Agda/TypeChecking/Monad/Base.hs view
@@ -2,8 +2,6 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE UndecidableInstances #-} module Agda.TypeChecking.Monad.Base where @@ -28,6 +26,7 @@ import Data.Set (Set) import qualified Data.Set as Set -- hiding (singleton, null, empty) import Data.Semigroup (Semigroup, Monoid, (<>), mempty, mappend, Any(..))+import Data.Data (Data, toConstr) import Data.Typeable (Typeable) import Data.Foldable (Foldable) import Data.Traversable@@ -40,12 +39,13 @@ import Agda.Syntax.Concrete (TopLevelModuleName) import Agda.Syntax.Common import qualified Agda.Syntax.Concrete as C-import qualified Agda.Syntax.Concrete.Definitions as D+import Agda.Syntax.Concrete.Definitions (NiceDeclaration, DeclarationWarning) import qualified Agda.Syntax.Abstract as A import Agda.Syntax.Abstract (AllNames) import Agda.Syntax.Internal as I import Agda.Syntax.Internal.Pattern () import Agda.Syntax.Internal.Generic (TermLike(..))+import Agda.Syntax.Literal import Agda.Syntax.Parser (PM(..), ParseWarning, runPMIO) import Agda.Syntax.Treeless (Compiled) import Agda.Syntax.Fixity@@ -55,17 +55,17 @@ import Agda.TypeChecking.CompiledClause import Agda.TypeChecking.Positivity.Occurrence-import Agda.TypeChecking.Free.Lazy (Free'(freeVars'), bind', bind)+import Agda.TypeChecking.Free.Lazy (Free(freeVars'), bind', bind) +import {-# SOURCE #-} Agda.Compiler.Backend+ -- import {-# SOURCE #-} Agda.Interaction.FindFile import Agda.Interaction.Options import Agda.Interaction.Response- (InteractionOutputCallback, defaultInteractionOutputCallback)+ (InteractionOutputCallback, defaultInteractionOutputCallback, Response(..)) import Agda.Interaction.Highlighting.Precise (CompressedFile, HighlightingInfo) -import qualified Agda.Compiler.UHC.Pragmas.Base as CR- import Agda.Utils.Except ( Error(strMsg) , ExceptT@@ -85,8 +85,10 @@ import Agda.Utils.Null import Agda.Utils.Permutation import Agda.Utils.Pretty hiding ((<>))+import qualified Agda.Utils.Pretty as P import Agda.Utils.Singleton import Agda.Utils.Functor+import Agda.Utils.Function #include "undefined.h" import Agda.Utils.Impossible@@ -103,6 +105,9 @@ , stPersistentState :: !PersistentTCState -- ^ State which is forever, like a diamond. }+#if __GLASGOW_HASKELL__ <= 708+ deriving Typeable+#endif class Monad m => ReadTCState m where getTCState :: m TCState@@ -133,14 +138,9 @@ , stPreImportedDisplayForms :: !DisplayForms -- ^ Display forms added by someone else to imported identifiers , stPreImportedInstanceDefs :: !InstanceTable- , stPreHaskellImports :: !(Set String)- -- ^ Imports that should be generated by the compiler / MAlonzo- -- (this includes imports from imported modules).- , stPreHaskellImportsUHC :: !(Set String)- -- ^ Imports that should be generated by the compiler / UHC backend- -- (this includes imports from imported modules).- , stPreHaskellCode :: ![String]- -- ^ Inline Haskell code that should be inserted by the GHC backend+ , stPreForeignCode :: !(Map BackendName [ForeignCode])+ -- ^ @{-# FOREIGN #-}@ code that should be included in the compiled output.+ -- Does not include code for imported modules. , stPreFreshInteractionId :: !InteractionId } @@ -155,8 +155,6 @@ -- for each @'A.AmbiguousQName'@ already passed by the type checker. , stPostMetaStore :: !MetaStore , stPostInteractionPoints :: !InteractionPoints -- scope checker first- , stPostSolvedInteractionPoints :: !InteractionPoints- -- ^ Interaction points that have been filled by a give or solve action. , stPostAwakeConstraints :: !Constraints , stPostSleepingConstraints :: !Constraints , stPostDirty :: !Bool -- local@@ -219,6 +217,8 @@ , stLoadedFileCache :: !(Maybe LoadedFileCache) -- ^ Cached typechecking state from the last loaded file. -- Should be Nothing when checking imports.+ , stPersistBackends :: [Backend]+ -- ^ Current backends with their options } data LoadedFileCache = LoadedFileCache@@ -262,6 +262,7 @@ , stBenchmark = empty , stAccumStatistics = Map.empty , stLoadedFileCache = Nothing+ , stPersistBackends = [] } -- | Empty state of type checker.@@ -280,9 +281,7 @@ , stPreImportedBuiltins = Map.empty , stPreImportedDisplayForms = HMap.empty , stPreImportedInstanceDefs = Map.empty- , stPreHaskellImports = Set.empty- , stPreHaskellImportsUHC = Set.empty- , stPreHaskellCode = []+ , stPreForeignCode = Map.empty , stPreFreshInteractionId = 0 } @@ -292,7 +291,6 @@ , stPostDisambiguatedNames = IntMap.empty , stPostMetaStore = Map.empty , stPostInteractionPoints = Map.empty- , stPostSolvedInteractionPoints = Map.empty , stPostAwakeConstraints = [] , stPostSleepingConstraints = [] , stPostDirty = False@@ -374,26 +372,21 @@ f (stPreImportedBuiltins (stPreScopeState s)) <&> \x -> s {stPreScopeState = (stPreScopeState s) {stPreImportedBuiltins = x}} -stHaskellImports :: Lens' (Set String) TCState-stHaskellImports f s =- f (stPreHaskellImports (stPreScopeState s)) <&>- \x -> s {stPreScopeState = (stPreScopeState s) {stPreHaskellImports = x}}--stHaskellImportsUHC :: Lens' (Set String) TCState-stHaskellImportsUHC f s =- f (stPreHaskellImportsUHC (stPreScopeState s)) <&>- \x -> s {stPreScopeState = (stPreScopeState s) {stPreHaskellImportsUHC = x}}--stHaskellCode :: Lens' [String] TCState-stHaskellCode f s =- f (stPreHaskellCode (stPreScopeState s)) <&>- \x -> s {stPreScopeState = (stPreScopeState s) {stPreHaskellCode = x}}+stForeignCode :: Lens' (Map BackendName [ForeignCode]) TCState+stForeignCode f s =+ f (stPreForeignCode (stPreScopeState s)) <&>+ \x -> s {stPreScopeState = (stPreScopeState s) {stPreForeignCode = x}} stFreshInteractionId :: Lens' InteractionId TCState stFreshInteractionId f s = f (stPreFreshInteractionId (stPreScopeState s)) <&> \x -> s {stPreScopeState = (stPreScopeState s) {stPreFreshInteractionId = x}} +stBackends :: Lens' [Backend] TCState+stBackends f s =+ f (stPersistBackends (stPersistentState s)) <&>+ \x -> s {stPersistentState = (stPersistentState s) {stPersistBackends = x}}+ stFreshNameId :: Lens' NameId TCState stFreshNameId f s = f (stPostFreshNameId (stPostScopeState s)) <&>@@ -419,12 +412,6 @@ f (stPostInteractionPoints (stPostScopeState s)) <&> \x -> s {stPostScopeState = (stPostScopeState s) {stPostInteractionPoints = x}} -stSolvedInteractionPoints :: Lens' InteractionPoints TCState-stSolvedInteractionPoints f s =- f (stPostSolvedInteractionPoints (stPostScopeState s)) <&>- \ x -> s {stPostScopeState = (stPostScopeState s)- {stPostSolvedInteractionPoints = x}}- stAwakeConstraints :: Lens' Constraints TCState stAwakeConstraints f s = f (stPostAwakeConstraints (stPostScopeState s)) <&>@@ -570,7 +557,7 @@ freshLens = stFreshInt newtype ProblemId = ProblemId Nat- deriving (Typeable, Eq, Ord, Enum, Real, Integral, Num)+ deriving (Typeable, Data, Eq, Ord, Enum, Real, Integral, Num) -- TODO: 'Show' should output Haskell-parseable representations. -- The following instance is deprecated, and Pretty[TCM] should be used@@ -579,6 +566,7 @@ -- ASR (28 December 2014). This instance is not used anymore (module -- the test suite) when reporting errors. See Issue 1293. +-- This particular Show instance is ok because of the Num instance. instance Show ProblemId where show (ProblemId n) = show n @@ -588,22 +576,22 @@ instance HasFresh ProblemId where freshLens = stFreshProblemId -freshName :: (MonadState TCState m, HasFresh NameId) => Range -> String -> m Name+freshName :: MonadState TCState m => Range -> String -> m Name freshName r s = do i <- fresh return $ mkName r i s -freshNoName :: (MonadState TCState m, HasFresh NameId) => Range -> m Name+freshNoName :: MonadState TCState m => Range -> m Name freshNoName r = do i <- fresh return $ Name i (C.NoName noRange i) r noFixity' -freshNoName_ :: (MonadState TCState m, HasFresh NameId) => m Name+freshNoName_ :: MonadState TCState m => m Name freshNoName_ = freshNoName noRange -- | Create a fresh name from @a@. class FreshName a where- freshName_ :: (MonadState TCState m, HasFresh NameId) => a -> m Name+ freshName_ :: MonadState TCState m => a -> m Name instance FreshName (Range, String) where freshName_ = uncurry freshName@@ -671,6 +659,9 @@ type VisitedModules = Map C.TopLevelModuleName ModuleInfo type DecodedModules = Map C.TopLevelModuleName Interface +data ForeignCode = ForeignCode Range String+ deriving (Show, Typeable)+ data Interface = Interface { iSourceHash :: Hash -- ^ Hash of the source code.@@ -680,37 +671,31 @@ -- ^ Module name of this interface. , iScope :: Map ModuleName Scope -- ^ Scope defined by this module.+ --+ -- Andreas, AIM XX: Too avoid duplicate serialization, this field is+ -- not serialized, so if you deserialize an interface, @iScope@+ -- will be empty.+ -- But 'constructIScope' constructs 'iScope' from 'iInsideScope'. , iInsideScope :: ScopeInfo -- ^ Scope after we loaded this interface. -- Used in 'Agda.Interaction.BasicOps.AtTopLevel' -- and 'Agda.Interaction.CommandLine.interactionLoop'.- --- -- Andreas, AIM XX: For performance reason, this field is- -- not serialized, so if you deserialize an interface, @iInsideScope@- -- will be empty. You need to type-check the file to get @iInsideScope@. , iSignature :: Signature , iDisplayForms :: DisplayForms -- ^ Display forms added for imported identifiers. , iBuiltin :: BuiltinThings (String, QName)- , iHaskellImports :: Set String- -- ^ Haskell imports listed in- -- (transitively) imported modules are- -- not included here.- , iHaskellImportsUHC :: Set String- -- ^ Haskell imports listed in- -- (transitively) imported modules are- -- not included here.- , iHaskellCode :: [String] -- ^ Inline Haskell code+ , iForeignCode :: Map BackendName [ForeignCode] , iHighlighting :: HighlightingInfo , iPragmaOptions :: [OptionsPragma] -- ^ Pragma options set in the file. , iPatternSyns :: A.PatternSynDefns+ , iWarnings :: [TCWarning] } deriving (Typeable, Show) instance Pretty Interface where pretty (Interface sourceH importedM moduleN scope insideS signature display builtin- haskellI haskellIUHC haskellCode highlighting pragmaO patternS) =+ foreignCode highlighting pragmaO patternS warnings) = hang (text "Interface") 2 $ vcat [ text "source hash:" <+> (pretty . show) sourceH , text "imported modules:" <+> (pretty . show) importedM@@ -720,12 +705,11 @@ , text "signature:" <+> (pretty . show) signature , text "display:" <+> (pretty . show) display , text "builtin:" <+> (pretty . show) builtin- , text "Haskell imports:" <+> (pretty . show) haskellI- , text "Haskell imports UHC:" <+> (pretty . show) haskellIUHC- , text "Haskell code:" <+> (vcat $ map (vcat . map text . lines) $ reverse haskellCode)+ , text "Foreign code:" <+> (pretty . show) foreignCode , text "highlighting:" <+> (pretty . show) highlighting , text "pragma options:" <+> (pretty . show) pragmaO , text "pattern syns:" <+> (pretty . show) patternS+ , text "warnings:" <+> (pretty . show) warnings ] -- | Combines the source hash and the (full) hashes of the imported modules.@@ -747,10 +731,10 @@ -- a substitution @Γ ⊢ ρ_M : Γ_M@ from the current context @Γ = envContext (clEnv)@. , clValue :: a }- deriving (Typeable, Functor, Foldable)+ deriving (Typeable, Data, Functor, Foldable) instance Show a => Show (Closure a) where- show cl = "Closure " ++ show (clValue cl)+ show cl = "Closure { clValue = " ++ show (clValue cl) ++ " }" instance HasRange a => HasRange (Closure a) where getRange = getRange . clValue@@ -770,10 +754,10 @@ type Constraints = [ProblemConstraint] data ProblemConstraint = PConstr- { constraintProblems :: [ProblemId]+ { constraintProblems :: Set ProblemId , theConstraint :: Closure Constraint }- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) instance HasRange ProblemConstraint where getRange = getRange . theConstraint@@ -798,7 +782,7 @@ -- on which the constraint may be blocked on and the third one is the list -- of candidates (or Nothing if we haven’t determined the list of -- candidates yet)- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) instance HasRange Constraint where getRange (IsEmpty r t) = r@@ -815,7 +799,7 @@ getRange (FindInScope x cands) = getRange x -} -instance Free' Constraint c where+instance Free Constraint where freeVars' c = case c of ValueCmp _ t u v -> freeVars' (t, (u, v))@@ -843,22 +827,11 @@ UnBlock _ -> __IMPOSSIBLE__ -- mempty -- Not yet implemented Guarded c _ -> __IMPOSSIBLE__ -- foldTerm c -- Not yet implemented FindInScope _ _ cs -> __IMPOSSIBLE__ -- Not yet implemented- traverseTerm f c = __IMPOSSIBLE__ -- Not yet implemented traverseTermM f c = __IMPOSSIBLE__ -- Not yet implemented data Comparison = CmpEq | CmpLeq- deriving (Eq, Typeable)---- TODO: 'Show' should output Haskell-parseable representations.--- The following instance is deprecated, and Pretty[TCM] should be used--- instead. Later, simply derive Show for this type.---- ASR (27 December 2014). This instance is not used anymore (module--- the test suite) when reporting errors. See Issue 1293.-instance Show Comparison where- show CmpEq = "="- show CmpLeq = "=<"+ deriving (Eq, Typeable, Data, Show) instance Pretty Comparison where pretty CmpEq = text "="@@ -866,12 +839,13 @@ -- | An extension of 'Comparison' to @>=@. data CompareDirection = DirEq | DirLeq | DirGeq- deriving (Eq, Typeable)+ deriving (Eq, Typeable, Show) -instance Show CompareDirection where- show DirEq = "="- show DirLeq = "=<"- show DirGeq = ">="+instance Pretty CompareDirection where+ pretty = text . \case+ DirEq -> "="+ DirLeq -> "=<"+ DirGeq -> ">=" -- | Embed 'Comparison' into 'CompareDirection'. fromCmp :: Comparison -> CompareDirection@@ -898,7 +872,7 @@ -- | A thing tagged with the context it came from. data Open a = OpenThing { openThingCtxIds :: [CtxId], openThing :: a }- deriving (Typeable, Show, Functor)+ deriving (Typeable, Data, Show, Functor, Foldable, Traversable) instance Decoration Open where traverseF f (OpenThing cxt x) = OpenThing cxt <$> f x@@ -906,7 +880,7 @@ data Local a = Local ModuleName a -- ^ Local to a given module, the value -- should have module parameters as free variables. | Global a -- ^ Global value, should be closed.- deriving (Typeable, Show, Functor, Foldable, Traversable)+ deriving (Typeable, Data, Show, Functor, Foldable, Traversable) isGlobal :: Local a -> Bool isGlobal Global{} = True@@ -1009,12 +983,24 @@ -- -- Higher value means higher priority to be instantiated. newtype MetaPriority = MetaPriority Int- deriving (Eq, Ord, Show)+ deriving ( Eq+ , Ord+ , Show+#if __GLASGOW_HASKELL__ <= 708+ , Typeable+#endif+ ) data RunMetaOccursCheck = RunMetaOccursCheck | DontRunMetaOccursCheck- deriving (Eq, Ord, Show)+ deriving (Eq+ , Ord+ , Show+#if __GLASGOW_HASKELL__ <= 708+ , Typeable+#endif+ ) -- | @MetaInfo@ is cloned from one meta to the next during pruning. data MetaInfo = MetaInfo@@ -1025,6 +1011,9 @@ -- ^ Used for printing. -- @Just x@ if meta-variable comes from omitted argument with name @x@. }+#if __GLASGOW_HASKELL__ <= 708+ deriving Typeable+#endif -- | Name suggestion for meta variable. Empty string means no suggestion. type MetaNameSuggestion = String@@ -1037,6 +1026,7 @@ instance Pretty NamedMeta where pretty (NamedMeta "" x) = pretty x+ pretty (NamedMeta "_" x) = pretty x pretty (NamedMeta s x) = text $ "_" ++ s ++ prettyShow x type MetaStore = Map MetaId MetaVariable@@ -1087,14 +1077,21 @@ data InteractionPoint = InteractionPoint { ipRange :: Range -- ^ The position of the interaction point. , ipMeta :: Maybe MetaId -- ^ The meta variable, if any, holding the type etc.+ , ipSolved:: Bool -- ^ Has this interaction point already been solved? , ipClause:: IPClause -- ^ The clause of the interaction point (if any). -- Used for case splitting. }+#if __GLASGOW_HASKELL__ <= 708+ deriving Typeable+#endif instance Eq InteractionPoint where (==) = (==) `on` ipMeta -- | Data structure managing the interaction points.+--+-- We never remove interaction points from this map, only set their+-- 'ipSolved' to @True@. (Issue #2368) type InteractionPoints = Map InteractionId InteractionPoint -- | Which clause is an interaction point located in?@@ -1104,6 +1101,7 @@ , ipcClause :: A.RHS -- ^ The original AST clause rhs. } | IPNoClause -- ^ The interaction point is not in the rhs of a clause.+ deriving (Typeable, Data) instance Eq IPClause where IPNoClause == IPNoClause = True@@ -1119,7 +1117,7 @@ , _sigDefinitions :: Definitions , _sigRewriteRules:: RewriteRuleMap -- ^ The rewrite rules defined in this file. }- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) sigSections :: Lens' Sections Signature sigSections f s =@@ -1141,9 +1139,12 @@ type RewriteRuleMap = HashMap QName RewriteRules type DisplayForms = HashMap QName [LocalDisplayForm] -data Section = Section { _secTelescope :: Telescope }- deriving (Typeable, Show)+newtype Section = Section { _secTelescope :: Telescope }+ deriving (Typeable, Data, Show) +instance Pretty Section where+ pretty = pretty . _secTelescope+ secTelescope :: Lens' Telescope Section secTelescope f s = f (_secTelescope s) <&>@@ -1176,7 +1177,7 @@ , dfRHS :: DisplayTerm -- ^ Right hand side, with @n@ free variables. }- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) type LocalDisplayForm = Local DisplayForm @@ -1198,18 +1199,34 @@ -- ^ @.v@. | DTerm Term -- ^ @v@.- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) -instance Free' DisplayForm c where+instance Free DisplayForm where freeVars' (Display n ps t) = bind (freeVars' ps) `mappend` bind' n (freeVars' t) -instance Free' DisplayTerm c where+instance Free DisplayTerm where freeVars' (DWithApp t ws es) = freeVars' (t, (ws, es)) freeVars' (DCon _ _ vs) = freeVars' vs freeVars' (DDef _ es) = freeVars' es freeVars' (DDot v) = freeVars' v freeVars' (DTerm v) = freeVars' v +instance Pretty DisplayTerm where+ prettyPrec p v =+ case v of+ DTerm v -> prettyPrec p v+ DDot v -> text "." P.<> prettyPrec 10 v+ DDef f es -> pretty f `pApp` es+ DCon c _ vs -> pretty (conName c) `pApp` map Apply vs+ DWithApp h ws es ->+ mparens (p > 0)+ (sep [ pretty h+ , nest 2 $ fsep [ text "|" <+> pretty w | w <- ws ] ])+ `pApp` es+ where+ pApp d els = mparens (not (null els) && p > 9) $+ sep [d, nest 2 $ fsep (map (prettyPrec 10) els)]+ -- | By default, we have no display form. defaultDisplayForm :: QName -> [LocalDisplayForm] defaultDisplayForm c = []@@ -1219,7 +1236,7 @@ -- | Non-linear (non-constructor) first-order pattern. data NLPat- = PVar (Maybe CtxId) !Int [Arg Int]+ = PVar !Int [Arg Int] -- ^ Matches anything (modulo non-linearity) that only contains bound -- variables that occur in the given arguments. | PWild@@ -1234,13 +1251,13 @@ -- ^ Matches @x es@ where x is a lambda-bound variable | PTerm Term -- ^ Matches the term modulo β (ideally βη).- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) type PElims = [Elim' NLPat] data NLPType = NLPType { nlpTypeLevel :: NLPat -- always PWild or PVar (with all bound variables in scope) , nlpTypeUnEl :: NLPat- } deriving (Typeable, Show)+ } deriving (Typeable, Data, Show) type RewriteRules = [RewriteRule] @@ -1250,11 +1267,11 @@ -- where @≡@ is the rewrite relation. , rewContext :: Telescope -- ^ @Γ@. , rewHead :: QName -- ^ @f@.- , rewPats :: PElims -- ^ @Γ ⊢ ps : t@.+ , rewPats :: PElims -- ^ @Γ ⊢ f ps : t@. , rewRHS :: Term -- ^ @Γ ⊢ rhs : t@. , rewType :: Type -- ^ @Γ ⊢ t@. }- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) data Definition = Defn { defArgInfo :: ArgInfo -- ^ Hiding should not be used.@@ -1316,9 +1333,11 @@ -- instantiation? , defMatchable :: Bool -- ^ Is the def matched against in a rewrite rule?+ , defInjective :: Bool+ -- ^ Should the def be treated as injective by the pattern matching unifier? , theDef :: Defn }- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) theDefLens :: Lens' Defn Definition theDefLens f d = f (theDef d) <&> \ df -> d { theDef = df }@@ -1337,63 +1356,65 @@ , defInstance = Nothing , defCopy = False , defMatchable = False+ , defInjective = False , theDef = def } -type HaskellCode = String-type HaskellType = String-type EpicCode = String-type JSCode = String--data HaskellRepresentation- = HsDefn HaskellType HaskellCode- | HsType HaskellType- deriving (Typeable, Show)--data HaskellExport = HsExport HaskellType String deriving (Show, Typeable)--data CoreRepresentation- = CrDefn CR.CoreExpr -- ^ Core code for functions.- | CrType CR.CoreType -- ^ Core type for agda type.- | CrConstr CR.CoreConstr -- ^ Core constructor for agda constructor.- deriving (Typeable, Show)- -- | Polarity for equality and subtype checking. data Polarity = Covariant -- ^ monotone | Contravariant -- ^ antitone | Invariant -- ^ no information (mixed variance) | Nonvariant -- ^ constant- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) -data CompiledRepresentation = CompiledRep- { compiledHaskell :: Maybe HaskellRepresentation- , exportHaskell :: Maybe HaskellExport- , compiledEpic :: Maybe EpicCode- , compiledJS :: Maybe JSCode- , compiledCore :: Maybe CoreRepresentation- }- deriving (Typeable, Show)+instance Pretty Polarity where+ pretty = text . \case+ Covariant -> "+"+ Contravariant -> "-"+ Invariant -> "*"+ Nonvariant -> "_" +-- | The backends are responsible for parsing their own pragmas.+data CompilerPragma = CompilerPragma Range String+ deriving (Typeable, Data, Show, Eq)++instance HasRange CompilerPragma where+ getRange (CompilerPragma r _) = r++type BackendName = String++-- Temporary: while we still parse the old pragmas we need to know the names of+-- the corresponding backends.+jsBackendName, ghcBackendName, uhcBackendName :: BackendName+jsBackendName = "JS"+ghcBackendName = "GHC"+uhcBackendName = "UHC"++type CompiledRepresentation = Map BackendName [CompilerPragma]+ noCompiledRep :: CompiledRepresentation-noCompiledRep = CompiledRep Nothing Nothing Nothing Nothing Nothing+noCompiledRep = Map.empty -- | Additional information for extended lambdas. data ExtLamInfo = ExtLamInfo { extLamNumHidden :: Int -- Number of hidden args to be dropped when printing. , extLamNumNonHid :: Int -- Number of visible args to be dropped when printing.- } deriving (Typeable, Eq, Ord, Show)+ } deriving (Typeable, Data, Eq, Ord, Show) -- | Additional information for projection 'Function's. data Projection = Projection- { projProper :: Bool- -- ^ @False@ if only projection-like, @True@ if record projection.+ { projProper :: Maybe QName+ -- ^ @Nothing@ if only projection-like, @Just r@ if record projection.+ -- The @r@ is the name of the record type projected from.+ -- This field is updated by module application. , projOrig :: QName -- ^ The original projection name -- (current name could be from module application). , projFromType :: Arg QName- -- ^ Type projected from. Record type if @projProper = Just{}@. Also- -- stores @ArgInfo@ of the principal argument.+ -- ^ Type projected from. Original record type if @projProper = Just{}@.+ -- Also stores @ArgInfo@ of the principal argument.+ -- This field is unchanged by module application. , projIndex :: Int -- ^ Index of the record argument. -- Start counting with 1, because 0 means that@@ -1408,24 +1429,24 @@ -- (Invariant: the number of abstractions equals 'projIndex'.) -- In case of a projection-like function, just the function symbol -- is returned as 'Def': @t = \ pars -> f@.- } deriving (Typeable, Show)+ } deriving (Typeable, Data, Show) -- | Abstractions to build projection function (dropping parameters). newtype ProjLams = ProjLams { getProjLams :: [Arg ArgName] }- deriving (Typeable, Show, Null)+ deriving (Typeable, Data, Show, Null) -- | Building the projection function (which drops the parameters). projDropPars :: Projection -> ProjOrigin -> Term -- Proper projections:-projDropPars (Projection True d _ _ lams) o =+projDropPars (Projection Just{} d _ _ lams) o = case initLast $ getProjLams lams of Nothing -> Def d [] Just (pars, Arg i y) -> let core = Lam i $ Abs y $ Var 0 [Proj o d] in List.foldr (\ (Arg ai x) -> Lam ai . NoAbs x) core pars -- Projection-like functions:-projDropPars (Projection False _ _ _ lams) o | null lams = __IMPOSSIBLE__-projDropPars (Projection False d _ _ lams) o =+projDropPars (Projection Nothing _ _ _ lams) o | null lams = __IMPOSSIBLE__+projDropPars (Projection Nothing d _ _ lams) o = List.foldr (\ (Arg ai x) -> Lam ai . NoAbs x) (Def d []) $ init $ getProjLams lams -- | The info of the principal (record) argument.@@ -1435,9 +1456,9 @@ -- | Should a record type admit eta-equality? data EtaEquality- = Specified !Bool -- ^ User specifed 'eta-equality' or 'no-eta-equality'- | Inferred !Bool -- ^ Positivity checker inferred whether eta is safe/- deriving (Typeable, Show, Eq)+ = Specified !Bool -- ^ User specifed 'eta-equality' or 'no-eta-equality'.+ | Inferred !Bool -- ^ Positivity checker inferred whether eta is safe.+ deriving (Typeable, Data, Show, Eq) etaEqualityToBool :: EtaEquality -> Bool etaEqualityToBool (Specified b) = b@@ -1452,11 +1473,11 @@ = FunStatic -- ^ Should calls to this function be normalised at compile-time? | FunInline -- ^ Should calls to this function be inlined by the compiler? | FunMacro -- ^ Is this function a macro?- deriving (Typeable, Eq, Ord, Enum, Show)+ deriving (Typeable, Data, Eq, Ord, Enum, Show) data Defn = Axiom -- ^ Postulate.- | AbstractDefn+ | AbstractDefn Defn -- ^ Returned by 'getConstInfo' if definition is abstract. | Function { funClauses :: [Clause]@@ -1467,9 +1488,11 @@ , funTreeless :: Maybe Compiled -- ^ Intermediate representation for compiler backends. , funInv :: FunctionInverse- , funMutual :: [QName]+ , funMutual :: Maybe [QName] -- ^ Mutually recursive functions, @data@s and @record@s.- -- Does not include this function.+ -- Does include this function.+ -- Empty list if not recursive.+ -- @Nothing@ if not yet computed (by positivity checker). , funAbstr :: IsAbstract , funDelayed :: Delayed -- ^ Are the clauses of this definition delayed?@@ -1501,29 +1524,47 @@ , dataClause :: (Maybe Clause) -- ^ This might be in an instantiated module. , dataCons :: [QName] -- ^ Constructor names. , dataSort :: Sort- , dataMutual :: [QName] -- ^ Mutually recursive functions, @data@s and @record@s. Does not include this data type.+ , dataMutual :: Maybe [QName]+ -- ^ Mutually recursive functions, @data@s and @record@s.+ -- Does include this data type.+ -- Empty if not recursive.+ -- @Nothing@ if not yet computed (by positivity checker). , dataAbstr :: IsAbstract } | Record- { recPars :: Nat -- ^ Number of parameters.+ { recPars :: Nat+ -- ^ Number of parameters. , recClause :: Maybe Clause- , recConHead :: ConHead -- ^ Constructor name and fields.+ -- ^ Was this record type created by a module application?+ -- If yes, the clause is its definition (linking back to the original record type).+ , recConHead :: ConHead+ -- ^ Constructor name and fields. , recNamedCon :: Bool+ -- ^ Does this record have a @constructor@? , recFields :: [Arg QName]- , recTel :: Telescope -- ^ The record field telescope. (Includes record parameters.)- -- Note: @TelV recTel _ == telView' recConType@.- -- Thus, @recTel@ is redundant.- , recMutual :: [QName] -- ^ Mutually recursive functions, @data@s and @record@s. Does not include this record.- , recEtaEquality' :: EtaEquality -- ^ Eta-expand at this record type. @False@ for unguarded recursive records and coinductive records unless the user specifies otherwise.+ -- ^ The record field names.+ , recTel :: Telescope+ -- ^ The record field telescope. (Includes record parameters.)+ -- Note: @TelV recTel _ == telView' recConType@.+ -- Thus, @recTel@ is redundant.+ , recMutual :: Maybe [QName]+ -- ^ Mutually recursive functions, @data@s and @record@s.+ -- Does include this record.+ -- Empty if not recursive.+ -- @Nothing@ if not yet computed (by positivity checker).+ , recEtaEquality' :: EtaEquality+ -- ^ Eta-expand at this record type?+ -- @False@ for unguarded recursive records and coinductive records+ -- unless the user specifies otherwise. , recInduction :: Maybe Induction -- ^ 'Inductive' or 'CoInductive'? Matters only for recursive records. -- 'Nothing' means that the user did not specify it, which is an error -- for recursive records.- , recRecursive :: Bool -- ^ Recursive record. Infers @recEtaEquality = False@. Projections are not size-preserving. , recAbstr :: IsAbstract } | Constructor- { conPars :: Nat -- ^ Number of parameters.+ { conPars :: Int -- ^ Number of parameters.+ , conArity :: Int -- ^ Number of arguments (excluding parameters). , conSrcCon :: ConHead -- ^ Name of (original) constructor and fields. (This might be in a module instance.) , conData :: QName -- ^ Name of datatype or record type. , conAbstr :: IsAbstract@@ -1540,8 +1581,88 @@ -- @'Just' something@ for builtin functions. } -- ^ Primitive or builtin functions.- deriving (Typeable, Show)+ deriving (Typeable, Data, Show) +instance Pretty Definition where+ pretty Defn{..} =+ text "Defn {" <?> vcat+ [ text "defArgInfo =" <?> pshow defArgInfo+ , text "defName =" <?> pretty defName+ , text "defType =" <?> pretty defType+ , text "defPolarity =" <?> pshow defPolarity+ , text "defArgOccurrences =" <?> pshow defArgOccurrences+ , text "defDisplay =" <?> pshow defDisplay -- TODO: pretty DisplayForm+ , text "defMutual =" <?> pshow defMutual+ , text "defCompiledRep =" <?> pshow defCompiledRep+ , text "defInstance =" <?> pshow defInstance+ , text "defCopy =" <?> pshow defCopy+ , text "defMatchable =" <?> pshow defMatchable+ , text "defInjective =" <?> pshow defInjective+ , text "theDef =" <?> pretty theDef ] <+> text "}"++instance Pretty Defn where+ pretty Axiom = text "Axiom"+ pretty (AbstractDefn def) = text "AbstractDefn" <?> parens (pretty def)+ pretty Function{..} =+ text "Function {" <?> vcat+ [ text "funClauses =" <?> vcat (map pretty funClauses)+ , text "funCompiled =" <?> pshow funCompiled+ , text "funTreeless =" <?> pshow funTreeless+ , text "funInv =" <?> pshow funInv+ , text "funMutual =" <?> pshow funMutual+ , text "funAbstr =" <?> pshow funAbstr+ , text "funDelayed =" <?> pshow funDelayed+ , text "funProjection =" <?> pshow funProjection+ , text "funFlags =" <?> pshow funFlags+ , text "funTerminates =" <?> pshow funTerminates+ , text "funWith =" <?> pshow funWith+ , text "funCopatternLHS =" <?> pshow funCopatternLHS ] <?> text "}"+ pretty Datatype{..} =+ text "Datatype {" <?> vcat+ [ text "dataPars =" <?> pshow dataPars+ , text "dataSmallPars =" <?> pshow dataSmallPars+ , text "dataNonLinPars =" <?> pshow dataNonLinPars+ , text "dataIxs =" <?> pshow dataIxs+ , text "dataInduction =" <?> pshow dataInduction+ , text "dataClause =" <?> pretty dataClause+ , text "dataCons =" <?> pshow dataCons+ , text "dataSort =" <?> pretty dataSort+ , text "dataMutual =" <?> pshow dataMutual+ , text "dataAbstr =" <?> pshow dataAbstr ] <?> text "}"+ pretty Record{..} =+ text "Record {" <?> vcat+ [ text "recPars =" <?> pshow recPars+ , text "recClause =" <?> pretty recClause+ , text "recConHead =" <?> pshow recConHead+ , text "recNamedCon =" <?> pshow recNamedCon+ , text "recFields =" <?> pshow recFields+ , text "recTel =" <?> pretty recTel+ , text "recMutual =" <?> pshow recMutual+ , text "recEtaEquality' =" <?> pshow recEtaEquality'+ , text "recInduction =" <?> pshow recInduction+ , text "recAbstr =" <?> pshow recAbstr ] <?> text "}"+ pretty Constructor{..} =+ text "Constructor {" <?> vcat+ [ text "conPars =" <?> pshow conPars+ , text "conArity =" <?> pshow conArity+ , text "conSrcCon =" <?> pshow conSrcCon+ , text "conData =" <?> pshow conData+ , text "conAbstr =" <?> pshow conAbstr+ , text "conInd =" <?> pshow conInd+ , text "conErased =" <?> pshow conErased ] <?> text "}"+ pretty Primitive{..} =+ text "Primitive {" <?> vcat+ [ text "primAbstr =" <?> pshow primAbstr+ , text "primName =" <?> pshow primName+ , text "primClauses =" <?> pshow primClauses+ , text "primCompiled =" <?> pshow primCompiled ] <?> text "}"+++-- | Is the record type recursive?+recRecursive :: Defn -> Bool+recRecursive (Record { recMutual = Just qs }) = not $ null qs+recRecursive _ = __IMPOSSIBLE__+ recEtaEquality :: Defn -> Bool recEtaEquality = etaEqualityToBool . recEtaEquality' @@ -1552,7 +1673,7 @@ , funCompiled = Nothing , funTreeless = Nothing , funInv = NotInjective- , funMutual = []+ , funMutual = Nothing , funAbstr = ConcreteDef , funDelayed = NotDelayed , funProjection = Nothing@@ -1600,6 +1721,11 @@ defIsDataOrRecord Datatype{} = True defIsDataOrRecord _ = False +defConstructors :: Defn -> [QName]+defConstructors Datatype{dataCons = cs} = cs+defConstructors Record{recConHead = c} = [conName c]+defConstructors _ = __IMPOSSIBLE__+ newtype Fields = Fields [(C.Name, Type)] deriving (Typeable, Null) @@ -1611,7 +1737,7 @@ -- (unfolding of definitions) does not count as simplifying? data Simplification = YesSimplification | NoSimplification- deriving (Typeable, Eq, Show)+ deriving (Typeable, Data, Eq, Show) instance Null Simplification where empty = NoSimplification@@ -1660,10 +1786,12 @@ = ProjectionReductions -- ^ (Projection and) projection-like functions may be reduced. | InlineReductions -- ^ Functions marked INLINE may be reduced. | CopatternReductions -- ^ Copattern definitions may be reduced.- | FunctionReductions -- ^ Functions which are not projections may be reduced.+ | FunctionReductions -- ^ Non-recursive functions and primitives may be reduced.+ | RecursiveReductions -- ^ Even recursive functions may be reduced. | LevelReductions -- ^ Reduce @'Level'@ terms.- | NonTerminatingReductions -- ^ Functions that have not passed termination checking.- deriving (Show, Eq, Ord, Enum, Bounded)+ | UnconfirmedReductions -- ^ Functions whose termination has not (yet) been confirmed.+ | NonTerminatingReductions -- ^ Functions that have failed termination checking.+ deriving (Show, Eq, Ord, Enum, Bounded, Typeable, Data) type AllowedReductions = [AllowedReduction] @@ -1695,14 +1823,9 @@ defParameters Defn{theDef = Record {recPars = n}} = Just n defParameters _ = Nothing -defJSDef :: Definition -> Maybe JSCode-defJSDef = compiledJS . defCompiledRep--defEpicDef :: Definition -> Maybe EpicCode-defEpicDef = compiledEpic . defCompiledRep--defCoreDef :: Definition -> Maybe CoreRepresentation-defCoreDef = compiledCore . defCompiledRep+defCompilerPragmas :: BackendName -> Definition -> [CompilerPragma]+defCompilerPragmas b = reverse . fromMaybe [] . Map.lookup b . defCompiledRep+ -- reversed because we add new pragmas to the front of the list -- | Are the clauses of this definition delayed? defDelayed :: Definition -> Delayed@@ -1714,6 +1837,12 @@ defNonterminating Defn{theDef = Function{funTerminates = Just False}} = True defNonterminating _ = False +-- | Has the definition not termination checked or did the check fail?+defTerminationUnconfirmed :: Definition -> Bool+defTerminationUnconfirmed Defn{theDef = Function{funTerminates = Just True}} = False+defTerminationUnconfirmed Defn{theDef = Function{funTerminates = _ }} = True+defTerminationUnconfirmed _ = False+ defAbstract :: Definition -> IsAbstract defAbstract d = case theDef d of Axiom{} -> ConcreteDef@@ -1733,19 +1862,25 @@ data FunctionInverse' c = NotInjective | Inverse (Map TermHead c)- deriving (Typeable, Show, Functor)+ deriving (Typeable, Data, Show, Functor) data TermHead = SortHead | PiHead | ConsHead QName- deriving (Typeable, Eq, Ord, Show)+ deriving (Typeable, Data, Eq, Ord, Show) +instance Pretty TermHead where+ pretty = \case+ SortHead -> text "SortHead"+ PiHead -> text "PiHead"+ ConsHead q-> text "ConsHead" <+> pretty q+ --------------------------------------------------------------------------- -- ** Mutual blocks --------------------------------------------------------------------------- newtype MutualId = MutId Int32- deriving (Typeable, Eq, Ord, Show, Num, Enum)+ deriving (Typeable, Data, Eq, Ord, Show, Num, Enum) --------------------------------------------------------------------------- -- ** Statistics@@ -1780,12 +1915,12 @@ | CheckWithFunctionType A.Expr | CheckSectionApplication Range ModuleName A.ModuleApplication | ScopeCheckExpr C.Expr- | ScopeCheckDeclaration D.NiceDeclaration+ | ScopeCheckDeclaration NiceDeclaration | ScopeCheckLHS C.QName C.Pattern | NoHighlighting | ModuleContents -- ^ Interaction command: show module contents. | SetRange Range -- ^ used by 'setCurrentRange'- deriving (Typeable)+ deriving (Typeable, Data) instance Pretty Call where pretty CheckClause{} = text "CheckClause"@@ -1903,7 +2038,7 @@ -- ^ This includes both non-interactive highlighting and -- interactive highlighting of the expression that is currently -- being type-checked.- deriving (Eq, Ord, Show, Read)+ deriving (Eq, Ord, Show, Read, Typeable, Data) -- | How should highlighting be sent to the user interface? @@ -1912,19 +2047,28 @@ -- ^ Via stdout. | Indirect -- ^ Both via files and via stdout.- deriving (Eq, Show, Read)+ deriving (Eq, Show, Read, Typeable, Data) +-- | @ifTopLevelAndHighlightingLevelIs l b m@ runs @m@ when we're+-- type-checking the top-level module and either the highlighting+-- level is /at least/ @l@ or @b@ is 'True'.++ifTopLevelAndHighlightingLevelIsOr ::+ MonadTCM tcm => HighlightingLevel -> Bool -> tcm () -> tcm ()+ifTopLevelAndHighlightingLevelIsOr l b m = do+ e <- ask+ when (envModuleNestingLevel e == 0 &&+ (envHighlightingLevel e >= l || b))+ m+ -- | @ifTopLevelAndHighlightingLevelIs l m@ runs @m@ when we're -- type-checking the top-level module and the highlighting level is -- /at least/ @l@. ifTopLevelAndHighlightingLevelIs :: MonadTCM tcm => HighlightingLevel -> tcm () -> tcm ()-ifTopLevelAndHighlightingLevelIs l m = do- e <- ask- when (envModuleNestingLevel e == 0 &&- envHighlightingLevel e >= l)- m+ifTopLevelAndHighlightingLevelIs l =+ ifTopLevelAndHighlightingLevelIsOr l False --------------------------------------------------------------------------- -- * Type checking environment@@ -1933,7 +2077,7 @@ data ModuleParameters = ModuleParams { mpSubstitution :: Substitution -- ^ @Δ ⊢ σ : Γ@ for a @module M Γ@ where @Δ@ is the current context @envContext@.- } deriving (Typeable, Show)+ } deriving (Typeable, Data, Show) defaultModuleParameters :: ModuleParameters defaultModuleParameters = ModuleParams IdS@@ -1961,7 +2105,7 @@ -- Everything under a @where@ will be checked with this flag on. , envAssignMetas :: Bool -- ^ Are we allowed to assign metas?- , envActiveProblems :: [ProblemId]+ , envActiveProblems :: Set ProblemId , envAbstractMode :: AbstractMode -- ^ When checking the typesignature of a public definition -- or the body of a non-abstract definition this is true.@@ -2031,7 +2175,7 @@ -- ^ Until we get a termination checker for instance search (#1743) we -- limit the search depth to ensure termination. }- deriving (Typeable)+ deriving (Typeable, Data) initEnv :: TCEnv initEnv = TCEnv { envContext = []@@ -2044,7 +2188,7 @@ , envTerminationCheck = TerminationCheck , envSolvingConstraints = False , envCheckingWhere = False- , envActiveProblems = [0]+ , envActiveProblems = Set.empty , envAssignMetas = True , envAbstractMode = ConcreteMode -- Andreas, 2013-02-21: This was 'AbstractMode' until now.@@ -2082,7 +2226,7 @@ data UnquoteFlags = UnquoteFlags { _unquoteNormalise :: Bool }- deriving (Typeable)+ deriving (Typeable, Data) defaultUnquoteFlags :: UnquoteFlags defaultUnquoteFlags = UnquoteFlags@@ -2130,7 +2274,7 @@ eAssignMetas :: Lens' Bool TCEnv eAssignMetas f e = f (envAssignMetas e) <&> \ x -> e { envAssignMetas = x } -eActiveProblems :: Lens' [ProblemId] TCEnv+eActiveProblems :: Lens' (Set ProblemId) TCEnv eActiveProblems f e = f (envActiveProblems e) <&> \ x -> e { envActiveProblems = x } eAbstractMode :: Lens' AbstractMode TCEnv@@ -2199,10 +2343,10 @@ data ContextEntry = Ctx { ctxId :: CtxId , ctxEntry :: Dom (Name, Type) }- deriving (Typeable)+ deriving (Typeable, Data) newtype CtxId = CtxId Nat- deriving (Typeable, Eq, Ord, Show, Enum, Real, Integral, Num)+ deriving (Typeable, Data, Eq, Ord, Show, Enum, Real, Integral, Num) --------------------------------------------------------------------------- -- ** Let bindings@@ -2218,7 +2362,7 @@ = AbstractMode -- ^ Abstract things in the current module can be accessed. | ConcreteMode -- ^ No abstract things can be accessed. | IgnoreAbstractMode -- ^ All abstract things can be accessed.- deriving (Typeable, Show, Eq)+ deriving (Typeable, Data, Show, Eq) aDefToMode :: IsAbstract -> AbstractMode aDefToMode AbstractDef = AbstractMode@@ -2236,12 +2380,12 @@ data ExpandHidden = ExpandLast -- ^ Add implicit arguments in the end until type is no longer hidden 'Pi'. | DontExpandLast -- ^ Do not append implicit arguments.- deriving (Eq)+ deriving (Eq, Typeable, Data) data ExplicitToInstance = ExplicitToInstance -- ^ Explicit arguments are considered as instance arguments | ExplicitStayExplicit- deriving (Eq, Show)+ deriving (Eq, Show, Typeable, Data) -- | A candidate solution for an instance meta is a term with its type. -- It may be the case that the candidate is not fully applied yet or@@ -2251,9 +2395,9 @@ , candidateEti :: ExplicitToInstance , candidateOverlappable :: Bool }- deriving (Show)+ deriving (Show, Typeable, Data) -instance Free' Candidate c where+instance Free Candidate where freeVars' (Candidate t u _ _) = freeVars' (t, u) ---------------------------------------------------------------------------@@ -2263,11 +2407,13 @@ -- | A non-fatal error is an error which does not prevent us from -- checking the document further and interacting with the user. --- We keep the state for termination issues, positivity issues and--- unsolved constraints from when we encountered the warning so that--- we can print it later-data Warning =- TerminationIssue [TerminationError]+data Warning+ = NicifierIssue [DeclarationWarning]+ | TerminationIssue [TerminationError]+ | UnreachableClauses QName [[NamedArg DeBruijnPattern]]+ | CoverageIssue QName [(Telescope, [NamedArg DeBruijnPattern])]+ -- ^ `CoverageIssue f pss` means that `pss` are not covered in `f`+ | CoverageNoExactSplit QName [Clause] | NotStrictlyPositive QName OccursWhere | UnsolvedMetaVariables [Range] -- ^ Do not use directly with 'warning' | UnsolvedInteractionMetas [Range] -- ^ Do not use directly with 'warning'@@ -2277,21 +2423,73 @@ -- ^ In `OldBuiltin old new`, the BUILTIN old has been replaced by new | EmptyRewritePragma -- ^ If the user wrote just @{-# REWRITE #-}@.+ | UselessPublic+ -- ^ If the user opens a module public before the module header.+ -- (See issue #2377.)+ | UselessInline QName+ -- Generic warnings for one-off things+ | GenericWarning Doc+ -- ^ Harmless generic warning (not an error)+ | GenericNonFatalError Doc+ -- ^ Generic error which doesn't abort proceedings (not a warning)+ -- Safe flag errors+ | SafeFlagPostulate C.Name+ | SafeFlagPragma [String]+ | SafeFlagNonTerminating+ | SafeFlagTerminating+ | SafeFlagPrimTrustMe+ | SafeFlagNoPositivityCheck+ | SafeFlagPolarity | ParseWarning ParseWarning- deriving Show+ | DeprecationWarning String String String+ -- ^ `DeprecationWarning old new version`:+ -- `old` is deprecated, use `new` instead. This will be an error in Agda `version`.+ deriving ( Show+ , Data+#if __GLASGOW_HASKELL__ <= 708+ , Typeable+#endif+ ) data TCWarning = TCWarning- { tcWarningState :: TCState- -- ^ The state in which the warning was raised.- , tcWarningClosure :: Closure Warning- -- ^ The warning and the environment in which it was raised.+ { tcWarningRange :: Range+ -- ^ Range where the warning was raised+ , tcWarning :: Warning+ -- ^ The warning itself+ , tcWarningPrintedWarning :: Doc+ -- ^ The warning printed in the state and environment where it was raised }- deriving Show+ deriving ( Show+#if __GLASGOW_HASKELL__ <= 708+ , Typeable+#endif+ ) -tcWarning :: TCWarning -> Warning-tcWarning = clValue . tcWarningClosure+tcWarningOrigin :: TCWarning -> SrcFile+tcWarningOrigin = rangeFile . tcWarningRange +instance HasRange TCWarning where+ getRange = tcWarningRange++-- used for merging lists of warnings+instance Eq TCWarning where+ x == y = equalHeadConstructors (tcWarning x) (tcWarning y)+ && getRange x == getRange y++equalHeadConstructors :: Warning -> Warning -> Bool+equalHeadConstructors = (==) `on` toConstr++getPartialDefs :: ReadTCState tcm => tcm [QName]+getPartialDefs = do+ tcst <- getTCState+ return $ catMaybes . fmap (extractQName . tcWarning)+ $ tcst ^. stTCWarnings where++ extractQName :: Warning -> Maybe QName+ extractQName (CoverageIssue f _) = Just f+ extractQName _ = Nothing+ --------------------------------------------------------------------------- -- * Type checking errors ---------------------------------------------------------------------------@@ -2305,13 +2503,12 @@ -- ^ Range of the target function. , callInfoCall :: Closure Term -- ^ To be formatted representation of the call.- } deriving Typeable+ } deriving (Typeable, Data, Show) -- no Eq, Ord instances: too expensive! (see issues 851, 852) -- | We only 'show' the name of the callee.-instance Show CallInfo where show = show . callInfoTarget-instance Pretty CallInfo where pretty = text . show+instance Pretty CallInfo where pretty = pretty . callInfoTarget instance AllNames CallInfo where allNames = singleton . callInfoTarget -- UNUSED, but keep!@@ -2339,7 +2536,7 @@ -- automatically generated functions.) , termErrCalls :: [CallInfo] -- ^ The problematic call sites.- } deriving (Typeable, Show)+ } deriving (Typeable, Data, Show) -- | Error when splitting a pattern variable into possible constructor patterns. data SplitError@@ -2348,18 +2545,27 @@ | CoinductiveDatatype (Closure Type) -- ^ Split on codata not allowed. -- UNUSED, but keep! -- -- | NoRecordConstructor Type -- ^ record type, but no constructor- | CantSplit+ | UnificationStuck { cantSplitConName :: QName -- ^ Constructor. , cantSplitTel :: Telescope -- ^ Context for indices. , cantSplitConIdx :: Args -- ^ Inferred indices (from type of constructor). , cantSplitGivenIdx :: Args -- ^ Expected indices (from checking pattern).+ , cantSplitFailures :: [UnificationFailure] -- ^ Reason(s) why unification got stuck. } | GenericSplitError String deriving (Show) -instance Error SplitError where- strMsg = GenericSplitError+data NegativeUnification+ = UnifyConflict Telescope Term Term+ | UnifyCycle Telescope Int Term+ deriving (Show) +data UnificationFailure+ = UnifyIndicesNotVars Telescope Type Term Term Args -- ^ Failed to apply injectivity to constructor of indexed datatype+ | UnifyRecursiveEq Telescope Type Int Term -- ^ Can't solve equation because variable occurs in (type of) lhs+ | UnifyReflexiveEq Telescope Type Term -- ^ Can't solve reflexive equation because --without-K is enabled+ deriving (Show)+ data UnquoteError = BadVisibility String (Arg I.Term) | ConInsteadOfDef QName String String@@ -2369,9 +2575,6 @@ | UnquotePanic String deriving (Show) -instance Error UnquoteError where- strMsg msg = UnquotePanic msg- data TypeError = InternalError String | NotImplemented String@@ -2395,12 +2598,6 @@ | ShouldBeApplicationOf Type QName -- ^ Expected a type to be an application of a particular datatype. | ConstructorPatternInWrongDatatype QName QName -- ^ constructor, datatype- | IndicesNotConstructorApplications [Arg Term] -- ^ Indices.- | IndexVariablesNotDistinct [Nat] [Arg Term] -- ^ Variables, indices.- | IndicesFreeInParameters [Nat] [Arg Term] [Arg Term]- -- ^ Indices (variables), index expressions (with- -- constructors applied to reconstructed parameters),- -- parameters. | CantResolveOverloadedConstructorsTargetingSameDatatype QName [QName] -- ^ Datatype, constructors. | DoesNotConstructAnElementOf QName Type -- ^ constructor, type@@ -2415,16 +2612,14 @@ -- ^ A function is applied to a hidden argument where a non-hidden was expected. | WrongNamedArgument (NamedArg A.Expr) -- ^ A function is applied to a hidden named argument it does not have.- | WrongIrrelevanceInLambda Type- -- ^ Expected a relevant function and found an irrelevant lambda.+ | WrongIrrelevanceInLambda+ -- ^ Wrong user-given relevance annotation in lambda. | WrongInstanceDeclaration -- ^ A term is declared as an instance but it’s not allowed | HidingMismatch Hiding Hiding -- ^ The given hiding does not correspond to the expected hiding. | RelevanceMismatch Relevance Relevance -- ^ The given relevance does not correspond to the expected relevane.- | NotInductive Term- -- ^ The term does not correspond to an inductive data type. | UninstantiatedDotPattern A.Expr | IlltypedPattern A.Pattern Type | IllformedProjectionPattern A.Pattern@@ -2461,9 +2656,6 @@ -- ^ The two function types have different hiding. | UnequalSorts Sort Sort | UnequalBecauseOfUniverseConflict Comparison Term Term- | HeterogeneousEquality Term Type Term Type- -- ^ We ended up with an equality constraint where the terms- -- have different types. This is not supported. | NotLeqSort Sort Sort | MetaCannotDependOn MetaId [Nat] Nat -- ^ The arguments are the meta variable, the parameters it can@@ -2487,28 +2679,15 @@ | DuplicateConstructors [C.Name] | WithOnFreeVariable A.Expr Term | UnexpectedWithPatterns [A.Pattern]- | WithClausePatternMismatch A.Pattern Pattern+ | WithClausePatternMismatch A.Pattern (NamedArg DeBruijnPattern) | FieldOutsideRecord | ModuleArityMismatch A.ModuleName Telescope [NamedArg A.Expr] -- Coverage errors- -- TODO: Remove some of the constructors in this section, now that- -- the SplitError constructor has been added?- | IncompletePatternMatching Term [Elim] -- can only happen if coverage checking is switched off- | CoverageFailure QName [[NamedArg DeBruijnPattern]]- | UnreachableClauses QName [[NamedArg DeBruijnPattern]]- | CoverageCantSplitOn QName Telescope Args Args- | CoverageCantSplitIrrelevantType Type- | CoverageCantSplitType Type- | CoverageNoExactSplit QName Clause- | WithoutKError Type Term Term- | UnifyConflict ConHead ConHead- | UnifyCycle Int Term- | UnifyIndicesNotVars Type Term Term Args- | UnificationRecursiveEq Type Int Term- | UnificationStuck Telescope [Term] [Term]+-- UNUSED: | IncompletePatternMatching Term [Elim] -- can only happen if coverage checking is switched off | SplitError SplitError+ | ImpossibleConstructor QName NegativeUnification -- Positivity errors- | TooManyPolarities QName Integer+ | TooManyPolarities QName Int -- Import errors | LocalVsImportedModuleClash ModuleName | SolvedButOpenHoles@@ -2529,6 +2708,7 @@ -- the include path says contains the module. -- Scope errors | BothWithAndRHS+ | AbstractConstructorNotInScope A.QName | NotInScope [C.QName] | NoSuchModule C.QName | AmbiguousName C.QName [A.QName]@@ -2548,8 +2728,8 @@ -- ^ The expr was used in the right hand side of an implicit module -- definition, but it wasn't of the form @m Delta@. | NotAnExpression C.Expr- | NotAValidLetBinding D.NiceDeclaration- | NotValidBeforeField D.NiceDeclaration+ | NotAValidLetBinding NiceDeclaration+ | NotValidBeforeField NiceDeclaration | NothingAppliedToHiddenArg C.Expr | NothingAppliedToInstanceArg C.Expr -- Pattern synonym errors@@ -2562,7 +2742,6 @@ | NoParseForLHS LHSOrPatSyn C.Pattern | AmbiguousParseForLHS LHSOrPatSyn C.Pattern [C.Pattern] | OperatorInformation [NotationSection] TypeError- | OperatorChangeMessage TypeError {- UNUSED | NoParseForPatternSynonym C.Pattern | AmbiguousParseForPatternSynonym C.Pattern [C.Pattern]@@ -2573,14 +2752,6 @@ -- Reflection errors | UnquoteFailed UnquoteError | DeBruijnIndexOutOfScope Nat Telescope [Name]- -- Safe flag errors- | SafeFlagPostulate C.Name- | SafeFlagPragma [String]- | SafeFlagNonTerminating- | SafeFlagTerminating- | SafeFlagPrimTrustMe- | SafeFlagNoPositivityCheck- | SafeFlagPolarity -- Language option errors | NeedOptionCopatterns | NeedOptionRewriting@@ -2593,14 +2764,6 @@ -- | Distinguish error message when parsing lhs or pattern synonym, resp. data LHSOrPatSyn = IsLHS | IsPatSyn deriving (Eq, Show) --- instance Show TypeError where--- show _ = "<TypeError>" -- TODO: more info?--#if !MIN_VERSION_transformers(0,4,1)-instance Error TypeError where- strMsg = GenericError-#endif- -- | Type-checking errors. data TCErr@@ -2611,7 +2774,9 @@ -- ^ The environment in which the error as raised plus the error. } | Exception Range Doc- | IOException Range E.IOException+ | IOException TCState Range E.IOException+ -- ^ The first argument is the state in which the error was+ -- raised. | PatternErr -- ^ The exception which is usually caught. -- Raised for pattern violations during unification ('assignV')@@ -2622,20 +2787,62 @@ strMsg = Exception noRange . text . strMsg instance Show TCErr where- show (TypeError _ e) = show (envRange $ clEnv e) ++ ": " ++ show (clValue e)- show (Exception r d) = show r ++ ": " ++ render d- show (IOException r e) = show r ++ ": " ++ show e- show PatternErr{} = "Pattern violation (you shouldn't see this)"+ show (TypeError _ e) = show (envRange $ clEnv e) ++ ": " ++ show (clValue e)+ show (Exception r d) = show r ++ ": " ++ render d+ show (IOException _ r e) = show r ++ ": " ++ show e+ show PatternErr{} = "Pattern violation (you shouldn't see this)" instance HasRange TCErr where- getRange (TypeError _ cl) = envRange $ clEnv cl- getRange (Exception r _) = r- getRange (IOException r _) = r- getRange PatternErr{} = noRange+ getRange (TypeError _ cl) = envRange $ clEnv cl+ getRange (Exception r _) = r+ getRange (IOException s r _) = r+ getRange PatternErr{} = noRange instance E.Exception TCErr -----------------------------------------------------------------------------+-- * Accessing options+-----------------------------------------------------------------------------++class (Functor m, Applicative m, Monad m) => HasOptions m where+ -- | Returns the pragma options which are currently in effect.+ pragmaOptions :: m PragmaOptions+ -- | Returns the command line options which are currently in effect.+ commandLineOptions :: m CommandLineOptions++instance MonadIO m => HasOptions (TCMT m) where+ pragmaOptions = use stPragmaOptions++ commandLineOptions = do+ p <- use stPragmaOptions+ cl <- stPersistentOptions . stPersistentState <$> get+ return $ cl { optPragmaOptions = p }++instance HasOptions m => HasOptions (ExceptT e m) where+ pragmaOptions = lift pragmaOptions+ commandLineOptions = lift commandLineOptions++instance HasOptions m => HasOptions (ListT m) where+ pragmaOptions = lift pragmaOptions+ commandLineOptions = lift commandLineOptions++instance HasOptions m => HasOptions (MaybeT m) where+ pragmaOptions = lift pragmaOptions+ commandLineOptions = lift commandLineOptions++instance HasOptions m => HasOptions (ReaderT r m) where+ pragmaOptions = lift pragmaOptions+ commandLineOptions = lift commandLineOptions++instance HasOptions m => HasOptions (StateT s m) where+ pragmaOptions = lift pragmaOptions+ commandLineOptions = lift commandLineOptions++instance (HasOptions m, Monoid w) => HasOptions (WriterT w m) where+ pragmaOptions = lift pragmaOptions+ commandLineOptions = lift commandLineOptions++----------------------------------------------------------------------------- -- * The reduce monad ----------------------------------------------------------------------------- @@ -2722,6 +2929,7 @@ class ( Applicative tcm, MonadIO tcm , MonadReader TCEnv tcm , MonadState TCState tcm+ , HasOptions tcm ) => MonadTCM tcm where liftTCM :: TCM a -> tcm a @@ -2743,16 +2951,6 @@ writeIORef r $ oldState { stPersistentState = stPersistentState newState } unTCM (h err) r e --- | Parse monad--runPM :: PM a -> TCM a-runPM m = do- (res, ws) <- runPMIO m- mapM_ (warning . ParseWarning) ws- case res of- Left e -> throwError (Exception (getRange e) (pretty e))- Right a -> return a- -- | Interaction monad. type IM = TCMT (Haskeline.InputT IO)@@ -2799,13 +2997,7 @@ instance MonadTCM tcm => MonadTCM (ListT tcm) where liftTCM = lift . liftTCM -instance-#if !MIN_VERSION_transformers(0,4,1)- (Error err, MonadTCM tcm)-#else- MonadTCM tcm-#endif- => MonadTCM (ExceptT err tcm) where+instance MonadTCM tcm => MonadTCM (ExceptT err tcm) where liftTCM = lift . liftTCM instance (Monoid w, MonadTCM tcm) => MonadTCM (WriterT w tcm) where@@ -2871,13 +3063,13 @@ instance MonadIO m => MonadIO (TCMT m) where liftIO m = TCM $ \s e -> do let r = envRange e- liftIO $ wrap r $ do+ liftIO $ wrap s r $ do x <- m x `seq` return x where- wrap r m = E.catch m (handleIOException r)-- handleIOException r e = E.throwIO $ IOException r e+ wrap s r m = E.catch m $ \e -> do+ s <- readIORef s+ E.throwIO $ IOException s r e -- | We store benchmark statistics in an IORef. -- This enables benchmarking pure computation, see@@ -2920,16 +3112,6 @@ typeError_ :: MonadTCM tcm => TypeError -> tcm TCErr typeError_ err = liftTCM $ TypeError <$> get <*> buildClosure err -{-# SPECIALIZE warning_ :: Warning -> TCM TCWarning #-}-warning_ :: MonadTCM tcm => Warning -> tcm TCWarning-warning_ w = liftTCM $ TCWarning <$> get <*> buildClosure w--{-# SPECIALIZE warning :: Warning -> TCM () #-}-warning :: MonadTCM tcm => Warning -> tcm ()-warning w = do- tcwarn <- warning_ w- stTCWarnings %= (tcwarn :)- -- | Running the type checking monad (most general form). {-# SPECIALIZE runTCM :: TCEnv -> TCState -> TCM a -> IO (a, TCState) #-} runTCM :: MonadIO m => TCEnv -> TCState -> TCMT m a -> m (a, TCState)@@ -3013,15 +3195,15 @@ killRange (Section tel) = killRange1 Section tel instance KillRange Definition where- killRange (Defn ai name t pols occs displ mut compiled inst copy ma def) =- killRange11 Defn ai name t pols occs displ mut compiled inst copy ma def+ killRange (Defn ai name t pols occs displ mut compiled inst copy ma inj def) =+ killRange12 Defn ai name t pols occs displ mut compiled inst copy ma inj def -- TODO clarify: Keep the range in the defName field? instance KillRange CtxId where killRange (CtxId x) = killRange1 CtxId x instance KillRange NLPat where- killRange (PVar x y z) = killRange3 PVar x y z+ killRange (PVar x y) = killRange2 PVar x y killRange (PWild) = PWild killRange (PDef x y) = killRange2 PDef x y killRange (PLam x y) = killRange2 PLam x y@@ -3053,12 +3235,12 @@ killRange def = case def of Axiom -> Axiom- AbstractDefn -> __IMPOSSIBLE__ -- only returned by 'getConstInfo'!+ AbstractDefn{} -> __IMPOSSIBLE__ -- only returned by 'getConstInfo'! Function cls comp tt inv mut isAbs delayed proj flags term extlam with copat -> killRange13 Function cls comp tt inv mut isAbs delayed proj flags term extlam with copat Datatype a b c d e f g h i j -> killRange10 Datatype a b c d e f g h i j- Record a b c d e f g h i j k -> killRange11 Record a b c d e f g h i j k- Constructor a b c d e f -> killRange6 Constructor a b c d e f+ Record a b c d e f g h i j -> killRange10 Record a b c d e f g h i j+ Constructor a b c d e f g -> killRange7 Constructor a b c d e f g Primitive a b c d -> killRange4 Primitive a b c d instance KillRange MutualId where
src/full/Agda/TypeChecking/Monad/Base.hs-boot view
@@ -8,6 +8,7 @@ import Agda.Syntax.Concrete.Name (TopLevelModuleName) import Agda.Utils.FileName (AbsolutePath) +data HighlightingMethod data TCEnv data TCState newtype TCMT m a = TCM { unTCM :: IORef TCState -> TCEnv -> m a }
src/full/Agda/TypeChecking/Monad/Benchmark.hs view
@@ -15,6 +15,7 @@ import Agda.Benchmarking import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Debug import{-# SOURCE #-} Agda.TypeChecking.Monad.Options import qualified Agda.Utils.Benchmark as B@@ -28,23 +29,50 @@ benchmarkLevel :: Int benchmarkLevel = 7 +benchmarkModulesKey :: String+benchmarkModulesKey = "profile.modules"++benchmarkModulesLevel :: Int+benchmarkModulesLevel = 10++benchmarkDefsKey :: String+benchmarkDefsKey = "profile.definitions"++benchmarkDefsLevel :: Int+benchmarkDefsLevel = 10+ -- | When verbosity is set or changes, we need to turn benchmarking on or off. updateBenchmarkingStatus :: TCM () -- {-# SPECIALIZE updateBenchmarkingStatus :: TCM () #-} -- updateBenchmarkingStatus :: (HasOptions m, MonadBench a m) => m () updateBenchmarkingStatus =- B.setBenchmarking =<< hasVerbosity benchmarkKey benchmarkLevel+ B.setBenchmarking =<< benchmarking -- | Check whether benchmarking is activated.-{-# SPECIALIZE benchmarking :: TCM Bool #-}-benchmarking :: MonadTCM tcm => tcm Bool-benchmarking = liftTCM $ hasVerbosity benchmarkKey benchmarkLevel+{-# SPECIALIZE benchmarking :: TCM (B.BenchmarkOn Phase) #-}+benchmarking :: MonadTCM tcm => tcm (B.BenchmarkOn Phase)+benchmarking = liftTCM $ do+ -- Ulf, 2016-12-13: Using verbosity levels to control the type of+ -- benchmarking isn't ideal, but let's stick with it for now.+ internal <- hasVerbosity benchmarkKey benchmarkLevel+ defs <- hasVerbosity benchmarkDefsKey benchmarkDefsLevel+ modules <- hasVerbosity benchmarkModulesKey benchmarkModulesLevel+ return $ case (internal, defs, modules) of+ (True, _, _) -> B.BenchmarkSome isInternalAccount+ (_, True, _) -> B.BenchmarkSome isDefAccount+ (_, _, True) -> B.BenchmarkSome isModuleAccount+ _ -> B.BenchmarkOff -- | Prints the accumulated benchmark results. Does nothing if -- profiling is not activated at level 7. print :: MonadTCM tcm => tcm ()-print = liftTCM $ whenM benchmarking $ do+print = liftTCM $ whenM (B.isBenchmarkOn [] <$> benchmarking) $ do b <- B.getBenchmark+ -- Andreas, 2017-07-29, issue #2602:+ -- The following line messes up the AgdaInfo buffer,+ -- thus, as Fredrik Forsberg suggest, I restore the original+ -- line for release 2.5.3 until a fix is found.+ -- reportSLn "" 0 $ prettyShow b reportSLn benchmarkKey benchmarkLevel $ prettyShow b -- -- | Bill a computation to a specific account.
src/full/Agda/TypeChecking/Monad/Builtin.hs view
@@ -13,6 +13,7 @@ import Agda.Syntax.Literal import Agda.Syntax.Internal as I import Agda.TypeChecking.Monad.Base+-- import Agda.TypeChecking.Functions -- LEADS TO IMPORT CYCLE import Agda.TypeChecking.Substitute import Agda.Utils.Except ( MonadError(catchError) )@@ -34,7 +35,7 @@ litType l = case l of LitNat _ n -> do _ <- primZero- when_ (n > 0) $ primSuc+ when (n > 0) $ void $ primSuc el <$> primNat LitFloat _ _ -> el <$> primFloat LitChar _ _ -> el <$> primChar@@ -140,7 +141,7 @@ primAgdaTCMGetType, primAgdaTCMGetDefinition, primAgdaTCMQuoteTerm, primAgdaTCMUnquoteTerm, primAgdaTCMBlockOnMeta, primAgdaTCMCommit, primAgdaTCMIsMacro,- primAgdaTCMWithNormalisation+ primAgdaTCMWithNormalisation, primAgdaTCMDebugPrint :: TCM Term primInteger = getBuiltin builtinInteger@@ -278,6 +279,7 @@ primAgdaTCMCommit = getBuiltin builtinAgdaTCMCommit primAgdaTCMIsMacro = getBuiltin builtinAgdaTCMIsMacro primAgdaTCMWithNormalisation = getBuiltin builtinAgdaTCMWithNormalisation+primAgdaTCMDebugPrint = getBuiltin builtinAgdaTCMDebugPrint builtinNat, builtinSuc, builtinZero, builtinNatPlus, builtinNatMinus, builtinNatTimes, builtinNatDivSucAux, builtinNatModSucAux, builtinNatEquals,@@ -323,7 +325,7 @@ builtinAgdaTCMGetType, builtinAgdaTCMGetDefinition, builtinAgdaTCMQuoteTerm, builtinAgdaTCMUnquoteTerm, builtinAgdaTCMBlockOnMeta, builtinAgdaTCMCommit, builtinAgdaTCMIsMacro,- builtinAgdaTCMWithNormalisation+ builtinAgdaTCMWithNormalisation, builtinAgdaTCMDebugPrint :: String builtinNat = "NATURAL"@@ -461,6 +463,7 @@ builtinAgdaTCMUnquoteTerm = "AGDATCMUNQUOTETERM" builtinAgdaTCMIsMacro = "AGDATCMISMACRO" builtinAgdaTCMWithNormalisation = "AGDATCMWITHNORMALISATION"+builtinAgdaTCMDebugPrint = "AGDATCMDEBUGPRINT" -- | Builtins that come without a definition in Agda syntax. -- These are giving names to Agda internal concepts which@@ -513,6 +516,7 @@ -- | Get the name of the equality type. primEqualityName :: TCM QName+-- primEqualityName = getDef =<< primEquality -- LEADS TO IMPORT CYCLE primEqualityName = do eq <- primEquality -- Andreas, 2014-05-17 moved this here from TC.Rules.Def@@ -527,9 +531,11 @@ lamV (Shared p) = lamV (derefPtr p) lamV v = ([], v) return $ case lamV eq of- ([Hidden, Hidden], Def equality _) -> equality- ([Hidden], Def equality _) -> equality- ([], Def equality _) -> equality+ (_, Def equality _) -> equality+ -- OLD:+ -- ([Hidden, Hidden], Def equality _) -> equality+ -- ([Hidden], Def equality _) -> equality+ -- ([], Def equality _) -> equality _ -> __IMPOSSIBLE__ -- | Check whether the type is actually an equality (lhs ≡ rhs)@@ -541,8 +547,12 @@ equalityView t0@(El s t) = do equality <- primEqualityName case ignoreSharing t of- Def equality' [ Apply level , Apply typ , Apply lhs , Apply rhs ]- | equality' == equality -> return $ EqualityType s equality level typ lhs rhs+ Def equality' es | equality' == equality -> do+ let vs = fromMaybe __IMPOSSIBLE__ $ allApplyElims es+ let n = length vs+ unless (n >= 3) __IMPOSSIBLE__+ let (pars, [ typ , lhs, rhs ]) = splitAt (n-3) vs+ return $ EqualityType s equality pars typ lhs rhs _ -> return $ OtherType t0 -- | Revert the 'EqualityView'.@@ -552,4 +562,4 @@ equalityUnview :: EqualityView -> Type equalityUnview (OtherType t) = t equalityUnview (EqualityType s equality l t lhs rhs) =- El s $ Def equality $ map Apply [l, t, lhs, rhs]+ El s $ Def equality $ map Apply (l ++ [t, lhs, rhs])
src/full/Agda/TypeChecking/Monad/Caching.hs view
@@ -8,9 +8,10 @@ , cleanCachedLog , cacheCurrentLog - -- * Activating+ -- * Activating/deactivating , activateLoadedFileCache , cachingStarts+ , noCacheForImportedModule -- * Restoring the 'PostScopeState' , restorePostScopeState@@ -22,9 +23,11 @@ import Agda.Syntax.Common import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.Options import Agda.Utils.Lens+import Agda.Utils.Monad #include "undefined.h" import Agda.Utils.Impossible@@ -69,6 +72,16 @@ putCache :: Maybe LoadedFileCache -> TCM () putCache cs = modifyCache $ const cs++-- | The cache should not be used for an imported module, and it+-- should be restored after the module has been type-checked. This+-- combinator takes care of that.++noCacheForImportedModule :: TCM a -> TCM a+noCacheForImportedModule m =+ bracket_ getCache putCache $ do+ modifyCache (const Nothing)+ m -- | Reads the next entry in the cached type check log, if present. readFromCachedLog :: TCM (Maybe (TypeCheckAction, PostScopeState))
src/full/Agda/TypeChecking/Monad/Constraints.hs view
@@ -7,10 +7,13 @@ import Control.Monad.State import Control.Monad.Reader -import Data.List as List+import qualified Data.List as List+import Data.Set (Set)+import qualified Data.Set as Set import Agda.TypeChecking.Monad.Base import Agda.TypeChecking.Monad.Closure+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.Options import Agda.Utils.Lens@@ -21,36 +24,32 @@ #include "undefined.h" import Agda.Utils.Impossible --- | Get the current problem-currentProblem :: TCM ProblemId-currentProblem = headWithDefault 0 <$> asks envActiveProblems---- | Steal all constraints belonging to the given problem and add them to the current problem.+-- | Add all constraints belonging to the given problem to the current problem(s). stealConstraints :: ProblemId -> TCM () stealConstraints pid = do- current <- currentProblem- reportSLn "tc.constr.steal" 50 $ "problem " ++ show current ++ " is stealing problem " ++ show pid ++ "'s constraints!"- -- Rename @pid@ to @current@ in all constraints.- let rename pc@(PConstr pids c) | elem pid pids = PConstr (current : pids) c- | otherwise = pc+ current <- asks envActiveProblems+ reportSLn "tc.constr.steal" 50 $ "problem " ++ show (Set.toList current) ++ " is stealing problem " ++ show pid ++ "'s constraints!"+ -- Add current to any constraint in pid.+ let rename pc@(PConstr pids c) | Set.member pid pids = PConstr (Set.union current pids) c+ | otherwise = pc -- We should never steal from an active problem.- whenM (elem pid <$> asks envActiveProblems) __IMPOSSIBLE__+ whenM (Set.member pid <$> asks envActiveProblems) __IMPOSSIBLE__ modifyAwakeConstraints $ List.map rename modifySleepingConstraints $ List.map rename solvingProblem :: ProblemId -> TCM a -> TCM a-solvingProblem pid = solvingProblems [pid]+solvingProblem pid = solvingProblems (Set.singleton pid) -solvingProblems :: [ProblemId] -> TCM a -> TCM a-solvingProblems pids m = verboseBracket "tc.constr.solve" 50 ("working on problems " ++ show pids) $ do- x <- local (\e -> e { envActiveProblems = pids ++ envActiveProblems e }) m+solvingProblems :: Set ProblemId -> TCM a -> TCM a+solvingProblems pids m = verboseBracket "tc.constr.solve" 50 ("working on problems " ++ show (Set.toList pids)) $ do+ x <- local (\e -> e { envActiveProblems = pids `Set.union` envActiveProblems e }) m sequence_ [ ifNotM (isProblemSolved pid) (reportSLn "tc.constr.solve" 50 $ "problem " ++ show pid ++ " was not solved.") $ {- else -} do reportSLn "tc.constr.solve" 50 $ "problem " ++ show pid ++ " was solved!" wakeConstraints (return . blockedOn pid . clValue . theConstraint)- | pid <- pids ]+ | pid <- Set.toList pids ] return x where blockedOn pid (Guarded _ pid') = pid == pid'@@ -58,11 +57,11 @@ isProblemSolved :: ProblemId -> TCM Bool isProblemSolved pid =- and2M (notElem pid <$> asks envActiveProblems)- (all (notElem pid . constraintProblems) <$> getAllConstraints)+ and2M (not . Set.member pid <$> asks envActiveProblems)+ (all (not . Set.member pid . constraintProblems) <$> getAllConstraints) getConstraintsForProblem :: ProblemId -> TCM Constraints-getConstraintsForProblem pid = List.filter (elem pid . constraintProblems) <$> getAllConstraints+getConstraintsForProblem pid = List.filter (Set.member pid . constraintProblems) <$> getAllConstraints -- | Get the awake constraints getAwakeConstraints :: TCM Constraints@@ -73,8 +72,8 @@ c <- use stSleepingConstraints (wakeup, sleepin) <- partitionM wake c reportSLn "tc.constr.wake" 50 $- "waking up " ++ show (List.map constraintProblems wakeup) ++ "\n" ++- " still sleeping: " ++ show (List.map constraintProblems sleepin)+ "waking up " ++ show (List.map (Set.toList . constraintProblems) wakeup) ++ "\n" +++ " still sleeping: " ++ show (List.map (Set.toList . constraintProblems) sleepin) modifySleepingConstraints $ const sleepin modifyAwakeConstraints (++ wakeup) @@ -88,7 +87,7 @@ putConstraintsToSleep :: (ProblemConstraint -> Bool) -> TCM () putConstraintsToSleep sleepy = do awakeOnes <- use stAwakeConstraints- let (gotoSleep, stayAwake) = partition sleepy awakeOnes+ let (gotoSleep, stayAwake) = List.partition sleepy awakeOnes modifySleepingConstraints $ (++ gotoSleep) modifyAwakeConstraints $ const stayAwake @@ -103,8 +102,8 @@ -- by events that would normally trigger a wakeup call. holdConstraints :: (ConstraintStatus -> ProblemConstraint -> Bool) -> TCM a -> TCM a holdConstraints p m = do- (holdAwake, stillAwake) <- partition (p AwakeConstraint) <$> use stAwakeConstraints- (holdAsleep, stillAsleep) <- partition (p SleepingConstraint) <$> use stSleepingConstraints+ (holdAwake, stillAwake) <- List.partition (p AwakeConstraint) <$> use stAwakeConstraints+ (holdAsleep, stillAsleep) <- List.partition (p SleepingConstraint) <$> use stSleepingConstraints stAwakeConstraints .= stillAwake stSleepingConstraints .= stillAsleep let restore = do@@ -132,21 +131,27 @@ local (\e -> e { envActiveProblems = pids', envSolvingConstraints = isSolving }) $ solvingProblems pids (f c) -buildProblemConstraint :: [ProblemId] -> Constraint -> TCM ProblemConstraint+buildProblemConstraint :: Set ProblemId -> Constraint -> TCM ProblemConstraint buildProblemConstraint pids c = PConstr pids <$> buildClosure c buildProblemConstraint_ :: Constraint -> TCM ProblemConstraint-buildProblemConstraint_ = buildProblemConstraint []+buildProblemConstraint_ = buildProblemConstraint Set.empty buildConstraint :: Constraint -> TCM ProblemConstraint-buildConstraint c = flip buildProblemConstraint c . nub . filter (> 0) =<< asks envActiveProblems+buildConstraint c = flip buildProblemConstraint c =<< asks envActiveProblems -- | Add new a constraint addConstraint' :: Constraint -> TCM ()-addConstraint' c = do+addConstraint' = addConstraintTo stSleepingConstraints++addAwakeConstraint' :: Constraint -> TCM ()+addAwakeConstraint' = addConstraintTo stAwakeConstraints++addConstraintTo :: Lens' Constraints TCState -> Constraint -> TCM ()+addConstraintTo bucket c = do pc <- build stDirty .= True- stSleepingConstraints %= (pc :)+ bucket %= (pc :) where build | isBlocking c = buildConstraint c | otherwise = buildProblemConstraint_ c
src/full/Agda/TypeChecking/Monad/Context.hs view
@@ -10,7 +10,7 @@ import Control.Monad.Reader import Control.Monad.State -import Data.List hiding (sort)+import qualified Data.List as List import Data.Map (Map) import qualified Data.Map as Map import Data.Monoid@@ -21,15 +21,17 @@ import Agda.Syntax.Scope.Monad (getLocalVars, setLocalVars) import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Substitute import Agda.TypeChecking.Monad.Open import Agda.TypeChecking.Monad.Options import Agda.Utils.Except ( MonadError(catchError) ) import Agda.Utils.Functor+import Agda.Utils.Lens import Agda.Utils.List ((!!!), downFrom)+import Agda.Utils.Pretty import Agda.Utils.Size-import Agda.Utils.Lens -- * Modifying the context @@ -85,35 +87,38 @@ -- | Apply a substitution to all module parameters. -updateModuleParameters :: MonadTCM tcm => Substitution -> tcm a -> tcm a+updateModuleParameters :: (MonadTCM tcm, MonadDebug tcm)+ => Substitution -> tcm a -> tcm a updateModuleParameters sub ret = do pm <- use stModuleParameters- let showMP pref mps = intercalate "\n" $+ let showMP pref mps = List.intercalate "\n" $ [ p ++ show m ++ " : " ++ show (mpSubstitution mp) | (p, (m, mp)) <- zip (pref : repeat (map (const ' ') pref)) (Map.toList mps) ]- cxt <- reverse <$> getContext- reportSLn "tc.cxt.param" 90 $ unlines $- [ "updatingModuleParameters"- , " sub = " ++ show sub- , " cxt = " ++ unwords (map (show . fst . unDom) cxt)- , showMP " old = " pm- ]+ verboseS "tc.cxt.param" 105 $ do+ cxt <- reverse <$> getContext+ reportSLn "tc.cxt.param" 105 $ unlines $+ [ "updatingModuleParameters"+ , " sub = " ++ show sub+ , " cxt (last added last in list) = " ++ unwords (map (show . fst . unDom) cxt)+ , showMP " old = " pm+ ] let pm' = applySubst sub pm- reportSLn "tc.cxt.param" 90 $ showMP " new = " pm'+ reportSLn "tc.cxt.param" 105 $ showMP " new = " pm' stModuleParameters .= pm' x <- ret -- We need to keep introduced modules around pm1 <- use stModuleParameters let pm'' = Map.union pm (defaultModuleParameters <$ Map.difference pm1 pm) stModuleParameters .= pm''- reportSLn "tc.cxt.param" 90 $ showMP " restored = " pm''+ reportSLn "tc.cxt.param" 105 $ showMP " restored = " pm'' return x -- | Since the @ModuleParamDict@ is relative to the current context, -- this function should be called everytime the context is extended. ---weakenModuleParameters :: MonadTCM tcm => Nat -> tcm a -> tcm a+weakenModuleParameters :: (MonadTCM tcm, MonadDebug tcm)+ => Nat -> tcm a -> tcm a weakenModuleParameters n = updateModuleParameters (raiseS n) -- | Get substitution @Γ ⊢ ρ : Γm@ where @Γ@ is the current context@@ -124,9 +129,9 @@ -- This is ok for instance if we are outside module @m@ -- (in which case we have to supply all module parameters to any -- symbol defined within @m@ we want to refer).-getModuleParameterSub :: MonadTCM tcm => ModuleName -> tcm Substitution+getModuleParameterSub :: (Functor m, ReadTCState m) => ModuleName -> m Substitution getModuleParameterSub m = do- r <- use stModuleParameters+ r <- (^. stModuleParameters) <$> getTCState case Map.lookup m r of Nothing -> return IdS Just mp -> return $ mpSubstitution mp@@ -164,9 +169,14 @@ -- the current context, we need to weaken it when we -- extend the context. This function takes care of that. ---addContext' :: (MonadTCM tcm, AddContext b) => b -> tcm a -> tcm a+addContext' :: (MonadTCM tcm, MonadDebug tcm, AddContext b)+ => b -> tcm a -> tcm a addContext' cxt = addContext cxt . weakenModuleParameters (contextSize cxt) +-- | Wrapper to tell 'addContext' not to 'unshadowName's. Used when adding a+-- user-provided, but already type checked, telescope to the context.+newtype KeepNames a = KeepNames a+ #if __GLASGOW_HASKELL__ >= 710 instance {-# OVERLAPPABLE #-} AddContext a => AddContext [a] where #else@@ -181,9 +191,12 @@ instance AddContext (Dom (Name, Type)) where addContext = addContext . distributeF- -- addContext dom = addCtx (fst $ unDom dom) (snd <$> dom) contextSize _ = 1 +instance AddContext (Dom (String, Type)) where+ addContext = addContext . distributeF+ contextSize _ = 1+ instance AddContext ([Name], Dom Type) where addContext (xs, dom) = addContext (bindsToTel' id xs dom) contextSize (xs, _) = length xs@@ -201,9 +214,10 @@ addCtx x dom ret contextSize _ = 1 -instance AddContext (Dom (String, Type)) where- addContext = addContext . distributeF- -- addContext dom = addContext (fst $ unDom dom, snd <$> dom)+instance AddContext (KeepNames String, Dom Type) where+ addContext (KeepNames s, dom) ret = do+ x <- freshName_ s+ addCtx x dom ret contextSize _ = 1 instance AddContext (Dom Type) where@@ -222,6 +236,12 @@ addContext s = addContext (s, dummyDom) contextSize _ = 1 +instance AddContext (KeepNames Telescope) where+ addContext (KeepNames tel) ret = loop tel where+ loop EmptyTel = ret+ loop (ExtendTel t tel) = underAbstraction' KeepNames t tel loop+ contextSize (KeepNames tel) = size tel+ instance AddContext Telescope where addContext tel ret = loop tel where loop EmptyTel = ret@@ -235,10 +255,12 @@ -- | Go under an abstraction. {-# SPECIALIZE underAbstraction :: Subst t a => Dom Type -> Abs a -> (a -> TCM b) -> TCM b #-} underAbstraction :: (Subst t a, MonadTCM tcm) => Dom Type -> Abs a -> (a -> tcm b) -> tcm b-underAbstraction _ (NoAbs _ v) k = k v-underAbstraction t a k = do- x <- unshadowName =<< freshName_ (realName $ absName a)- addContext (x, t) $ k $ absBody a+underAbstraction = underAbstraction' id++underAbstraction' :: (Subst t a, MonadTCM tcm, AddContext (name, Dom Type)) =>+ (String -> name) -> Dom Type -> Abs a -> (a -> tcm b) -> tcm b+underAbstraction' _ _ (NoAbs _ v) k = k v+underAbstraction' wrap t a k = addContext (wrap $ realName $ absName a, t) $ k $ absBody a where realName s = if isNoName s then "x" else argNameToString s @@ -266,7 +288,7 @@ -- | Get the size of the current context. {-# SPECIALIZE getContextSize :: TCM Nat #-} getContextSize :: (Applicative m, MonadReader TCEnv m) => m Nat-getContextSize = genericLength <$> asks envContext+getContextSize = length <$> asks envContext -- | Generate @[var (n - 1), ..., var 0]@ for all declarations in the context. {-# SPECIALIZE getContextArgs :: TCM Args #-}@@ -301,7 +323,7 @@ lookupBV n = do ctx <- getContext let failure = fail $ "de Bruijn index out of scope: " ++ show n ++- " in context " ++ show (map (fst . unDom) ctx)+ " in context " ++ prettyShow (map (fst . unDom) ctx) maybe failure (return . fmap (raise $ n + 1)) $ ctx !!! n {-# SPECIALIZE typeOfBV' :: Nat -> TCM (Dom Type) #-}@@ -330,11 +352,11 @@ getVarInfo x = do ctx <- getContext def <- asks envLetBindings- case findIndex ((==x) . fst . unDom) ctx of+ case List.findIndex ((==x) . fst . unDom) ctx of Just n -> do t <- typeOfBV' n return (var n, t) _ -> case Map.lookup x def of Just vt -> getOpen vt- _ -> fail $ "unbound variable " ++ show (nameConcrete x)+ _ -> fail $ "unbound variable " ++ prettyShow (nameConcrete x)
+ src/full/Agda/TypeChecking/Monad/Debug.hs view
@@ -0,0 +1,118 @@+{-# LANGUAGE CPP #-}++module Agda.TypeChecking.Monad.Debug where++import Control.Applicative+import Control.Monad.IO.Class (MonadIO, liftIO)+import Control.Monad.Reader+import Control.Monad.State+import Control.Monad.Trans.Maybe+import Control.Monad.Writer++import Data.Maybe+import Data.Semigroup (Semigroup, Monoid, (<>), mempty, mappend, Any(..))+import Data.Traversable++import {-# SOURCE #-} Agda.TypeChecking.Errors+import Agda.TypeChecking.Monad.Base+import {-# SOURCE #-} Agda.TypeChecking.Monad.Options++import Agda.Interaction.Response++import Agda.Utils.Except+import Agda.Utils.Lens+import Agda.Utils.List+import Agda.Utils.ListT+import Agda.Utils.Maybe+import Agda.Utils.Monad+import Agda.Utils.Pretty++#include "undefined.h"+import Agda.Utils.Impossible++class (Functor m, Applicative m, Monad m) => MonadDebug m where+ displayDebugMessage :: Int -> String -> m ()+ displayDebugMessage n s = traceDebugMessage n s $ return ()++ traceDebugMessage :: Int -> String -> m a -> m a+ traceDebugMessage n s cont = displayDebugMessage n s >> cont++ formatDebugMessage :: VerboseKey -> Int -> TCM Doc -> m String++instance (MonadIO m) => MonadDebug (TCMT m) where++ displayDebugMessage n s = liftTCM $ do+ cb <- gets $ stInteractionOutputCallback . stPersistentState+ liftIO $ cb (Resp_RunningInfo n s)++ formatDebugMessage k n d = liftTCM $+ show <$> d `catchError` \ err ->+ (\ s -> (sep $ map text+ [ "Printing debug message"+ , k ++ ":" ++show n+ , "failed due to error:" ]) $$+ (nest 2 $ text s)) <$> prettyError err++instance MonadDebug m => MonadDebug (ExceptT e m) where+ displayDebugMessage n s = lift $ displayDebugMessage n s+ formatDebugMessage k n d = lift $ formatDebugMessage k n d++instance MonadDebug m => MonadDebug (ListT m) where+ displayDebugMessage n s = lift $ displayDebugMessage n s+ formatDebugMessage k n d = lift $ formatDebugMessage k n d++instance MonadDebug m => MonadDebug (MaybeT m) where+ displayDebugMessage n s = lift $ displayDebugMessage n s+ formatDebugMessage k n d = lift $ formatDebugMessage k n d++instance MonadDebug m => MonadDebug (ReaderT r m) where+ displayDebugMessage n s = lift $ displayDebugMessage n s+ formatDebugMessage k n d = lift $ formatDebugMessage k n d++instance MonadDebug m => MonadDebug (StateT s m) where+ displayDebugMessage n s = lift $ displayDebugMessage n s+ formatDebugMessage k n d = lift $ formatDebugMessage k n d++instance (MonadDebug m, Monoid w) => MonadDebug (WriterT w m) where+ displayDebugMessage n s = lift $ displayDebugMessage n s+ formatDebugMessage k n d = lift $ formatDebugMessage k n d++-- | Conditionally print debug string.+{-# SPECIALIZE reportS :: VerboseKey -> Int -> String -> TCM () #-}+reportS :: (HasOptions m, MonadDebug m)+ => VerboseKey -> Int -> String -> m ()+reportS k n s = verboseS k n $ displayDebugMessage n s++-- | Conditionally println debug string.+{-# SPECIALIZE reportSLn :: VerboseKey -> Int -> String -> TCM () #-}+reportSLn :: (HasOptions m, MonadDebug m)+ => VerboseKey -> Int -> String -> m ()+reportSLn k n s = verboseS k n $+ displayDebugMessage n (s ++ "\n")++-- | Conditionally render debug 'Doc' and print it.+{-# SPECIALIZE reportSDoc :: VerboseKey -> Int -> TCM Doc -> TCM () #-}+reportSDoc :: (HasOptions m, MonadDebug m)+ => VerboseKey -> Int -> TCM Doc -> m ()+reportSDoc k n d = verboseS k n $ do+ displayDebugMessage n . (++ "\n") =<< formatDebugMessage k n d++traceSLn :: (HasOptions m, MonadDebug m)+ => VerboseKey -> Int -> String -> m a -> m a+traceSLn k n s cont = ifNotM (hasVerbosity k n) cont $ {- else -} do+ traceDebugMessage n (s ++ "\n") cont++-- | Conditionally render debug 'Doc', print it, and then continue.+traceSDoc :: (HasOptions m, MonadDebug m)+ => VerboseKey -> Int -> TCM Doc -> m a -> m a+traceSDoc k n d cont = ifNotM (hasVerbosity k n) cont $ {- else -} do+ s <- formatDebugMessage k n d+ traceDebugMessage n (s ++ "\n") cont++-- | Print brackets around debug messages issued by a computation.+{-# SPECIALIZE verboseBracket :: VerboseKey -> Int -> String -> TCM a -> TCM a #-}+verboseBracket :: (HasOptions m, MonadDebug m, MonadError err m)+ => VerboseKey -> Int -> String -> m a -> m a+verboseBracket k n s m = ifNotM (hasVerbosity k n) m $ {- else -} do+ displayDebugMessage n $ "{ " ++ s ++ "\n"+ m `finally` displayDebugMessage n "}\n"
+ src/full/Agda/TypeChecking/Monad/Debug.hs-boot view
@@ -0,0 +1,28 @@+module Agda.TypeChecking.Monad.Debug where++import Control.Applicative+import Control.Monad.IO.Class (MonadIO)++import Agda.TypeChecking.Monad.Base+import {-# SOURCE #-} Agda.TypeChecking.Monad.Options++import Agda.Utils.Pretty++class (Functor m, Applicative m, Monad m) => MonadDebug m where+ displayDebugMessage :: Int -> String -> m ()+ displayDebugMessage n s = traceDebugMessage n s $ return ()++ traceDebugMessage :: Int -> String -> m a -> m a+ traceDebugMessage n s cont = displayDebugMessage n s >> cont++ formatDebugMessage :: VerboseKey -> Int -> TCM Doc -> m String++instance (MonadIO m) => MonadDebug (TCMT m)++reportS :: (HasOptions m, MonadDebug m)+ => VerboseKey -> Int -> String -> m ()+reportSLn :: (HasOptions m, MonadDebug m)+ => VerboseKey -> Int -> String -> m ()+reportSDoc :: (HasOptions m, MonadDebug m)+ => VerboseKey -> Int -> TCM Doc -> m ()+
src/full/Agda/TypeChecking/Monad/Env.hs view
@@ -2,7 +2,7 @@ module Agda.TypeChecking.Monad.Env where import Control.Monad.Reader-import Data.List+import qualified Data.List as List import Data.Monoid import Agda.Syntax.Common@@ -27,7 +27,7 @@ getAnonymousVariables :: MonadReader TCEnv m => ModuleName -> m Nat getAnonymousVariables m = do ms <- asks envAnonymousModules- return $ sum [ n | (m', n) <- ms, mnameToList m' `isPrefixOf` mnameToList m ]+ return $ sum [ n | (m', n) <- ms, mnameToList m' `List.isPrefixOf` mnameToList m ] -- | Add variables bound by an anonymous module. withAnonymousModule :: ModuleName -> Nat -> TCM a -> TCM a@@ -101,6 +101,8 @@ -- | Allow all reductions including non-terminating functions. allowNonTerminatingReductions :: TCM a -> TCM a allowNonTerminatingReductions = putAllowedReductions $ [NonTerminatingReductions] ++ allReductions++-- * Concerning 'envInsideDotPattern' insideDotPattern :: TCM a -> TCM a insideDotPattern = local $ \e -> e { envInsideDotPattern = True }
− src/full/Agda/TypeChecking/Monad/Exception.hs
@@ -1,115 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE UndecidableInstances #-}---- | Basically a copy of the ErrorT monad transformer. It's handy to slap--- onto TCM and still be a MonadTCM (which isn't possible with ErrorT).---- Andreas, 2012-03-30: the following command seems to be STALE.--- Also, it does not require the silly Error instance for the err type.--- The silly Error instance is back. ;-)--module Agda.TypeChecking.Monad.Exception where--import Control.Applicative-import Control.Monad.State-import Control.Monad.Reader-import Control.Monad.Writer--import Agda.TypeChecking.Monad.Base-import Agda.Utils.Except ( Error(strMsg), MonadError(catchError, throwError) )--newtype ExceptionT err m a = ExceptionT { runExceptionT :: m (Either err a) }--class Error err => MonadException err m | m -> err where- throwException :: err -> m a- catchException :: m a -> (err -> m a) -> m a--instance-#if __GLASGOW_HASKELL__ <= 708- (Applicative m, Monad m, Error err)-#else- (Monad m, Error err)-#endif- => Monad (ExceptionT err m) where- return = pure- ExceptionT m >>= k = ExceptionT $ do- r <- m- case r of- Left err -> return $ Left err- Right x -> runExceptionT $ k x- fail = ExceptionT . return . Left . strMsg--instance (Monad m, Error err) => MonadException err (ExceptionT err m) where- throwException = ExceptionT . return . Left- catchException m h = ExceptionT $ do- r <- runExceptionT m- case r of- Left err -> runExceptionT $ h err- Right x -> return $ Right x--instance (Monad m, MonadException err m) => MonadException err (ReaderT r m) where- throwException = lift . throwException- catchException m h = ReaderT $ \ r ->- catchException (m `runReaderT` r) (\ err -> h err `runReaderT` r)--instance (Monad m, MonadException err m, Monoid w) => MonadException err (WriterT w m) where- throwException = lift . throwException- catchException m h = WriterT $- catchException (runWriterT m) (\ err -> runWriterT $ h err)--instance (Monad m, MonadException err m) => MonadException err (StateT s m) where- throwException = lift . throwException- catchException m h = StateT $ \ s ->- catchException (runStateT m s) (\ err -> runStateT (h err) s)--instance MonadTrans (ExceptionT err) where- lift = ExceptionT . liftM Right--instance Functor f => Functor (ExceptionT err f) where- fmap f = ExceptionT . fmap (fmap f) . runExceptionT--instance (Error err, Applicative m, Monad m) => Applicative (ExceptionT err m) where- pure = ExceptionT . return . Right- (<*>) = ap--instance-#if __GLASGOW_HASKELL__ <= 708- (Error err, Applicative m, MonadState s m)-#else- (Error err, MonadState s m)-#endif- => MonadState s (ExceptionT err m) where- get = ExceptionT $ Right `liftM` get- put x = ExceptionT $ Right `liftM` put x--instance-#if __GLASGOW_HASKELL__ <= 708- (Error err, Applicative m, MonadReader r m)-#else- (Error err, MonadReader r m)-#endif- => MonadReader r (ExceptionT err m) where- ask = ExceptionT $ Right `liftM` ask- local f = ExceptionT . local f . runExceptionT--instance-#if __GLASGOW_HASKELL__ <= 708- (Error err, Applicative m, MonadError err' m)-#else- (Error err, MonadError err' m)-#endif- => MonadError err' (ExceptionT err m) where- throwError err = ExceptionT $ Right `liftM` throwError err- catchError m h = ExceptionT $ runExceptionT m `catchError` (runExceptionT . h)--instance-#if __GLASGOW_HASKELL__ <= 708- (Error err, Applicative m, MonadIO m)-#else- (Error err, MonadIO m)-#endif- => MonadIO (ExceptionT err m) where- liftIO m = ExceptionT $ Right `liftM` liftIO m--instance (Error err, MonadTCM tcm) => MonadTCM (ExceptionT err tcm) where- liftTCM m = ExceptionT $ Right `liftM` liftTCM m
src/full/Agda/TypeChecking/Monad/Local.hs view
@@ -9,6 +9,7 @@ import Agda.TypeChecking.Substitute import Agda.TypeChecking.Monad.Base import Agda.TypeChecking.Monad.Context+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.Env import Agda.TypeChecking.Monad.Options import Agda.TypeChecking.Free@@ -20,13 +21,13 @@ -- | Precondition: must not be called if the module parameter of the current -- module have been refined or (touched at all).-makeLocal :: Free' a All => a -> TCM (Local a)+makeLocal :: Free a => a -> TCM (Local a) makeLocal x | closed x = return $ Global x | otherwise = inFreshModuleIfFreeParams $ do m <- currentModule return (Local m x) -makeGlobal :: Free' a All => a -> TCM (Local a)+makeGlobal :: Free a => a -> TCM (Local a) makeGlobal x | closed x = return $ Global x | otherwise = __IMPOSSIBLE__
src/full/Agda/TypeChecking/Monad/MetaVars.hs view
@@ -25,7 +25,7 @@ import Agda.TypeChecking.Monad.Base import Agda.TypeChecking.Monad.Trace import Agda.TypeChecking.Monad.Closure-import Agda.TypeChecking.Monad.Options (reportSLn)+import Agda.TypeChecking.Monad.Debug (reportSLn) import Agda.TypeChecking.Monad.Context import Agda.TypeChecking.Substitute import {-# SOURCE #-} Agda.TypeChecking.Telescope@@ -47,7 +47,9 @@ -- | Switch off assignment of metas. dontAssignMetas :: TCM a -> TCM a-dontAssignMetas = local $ \ env -> env { envAssignMetas = False }+dontAssignMetas cont = do+ reportSLn "tc.meta" 45 $ "don't assign metas"+ local (\ env -> env { envAssignMetas = False }) cont -- | Get the meta store. getMetaStore :: TCM MetaStore@@ -209,6 +211,10 @@ updateMetaVarRange :: MetaId -> Range -> TCM () updateMetaVarRange mi r = updateMetaVar mi (setRange r) +setMetaOccursCheck :: MetaId -> RunMetaOccursCheck -> TCM ()+setMetaOccursCheck mi b = updateMetaVar mi $ \ mvar ->+ mvar { mvInfo = (mvInfo mvar) { miMetaOccursCheck = b } }+ -- * Query and manipulate interaction points. modifyInteractionPoints :: (InteractionPoints -> InteractionPoints) -> TCM ()@@ -232,7 +238,7 @@ ii <- case maybeId of Just i -> return $ InteractionId i Nothing -> fresh- let ip = InteractionPoint { ipRange = r, ipMeta = Nothing, ipClause = IPNoClause }+ let ip = InteractionPoint { ipRange = r, ipMeta = Nothing, ipSolved = False, ipClause = IPNoClause } case Map.insertLookupWithKey (\ key new old -> old) ii ip m of -- If the interaction point is already present, we keep the old ip. -- However, it needs to be at the same range as the new one.@@ -253,7 +259,7 @@ headMaybe $ mapMaybe sameRange $ Map.toList m where sameRange :: (InteractionId, InteractionPoint) -> Maybe InteractionId- sameRange (ii, InteractionPoint r' _ _) | r == r' = Just ii+ sameRange (ii, InteractionPoint r' _ _ _) | r == r' = Just ii sameRange _ = Nothing -- | Hook up meta variable to interaction point.@@ -261,32 +267,30 @@ connectInteractionPoint ii mi = do ipCl <- asks envClause m <- use stInteractionPoints- let ip = InteractionPoint { ipRange = __IMPOSSIBLE__, ipMeta = Just mi, ipClause = ipCl }+ let ip = InteractionPoint { ipRange = __IMPOSSIBLE__, ipMeta = Just mi, ipSolved = False, ipClause = ipCl } -- The interaction point needs to be present already, we just set the meta. case Map.insertLookupWithKey (\ key new old -> new { ipRange = ipRange old }) ii ip m of (Nothing, _) -> __IMPOSSIBLE__ (Just _, m') -> modifyInteractionPoints $ const m' --- | Move an interaction point from the current ones to the old ones.+-- | Mark an interaction point as solved. removeInteractionPoint :: InteractionId -> TCM () removeInteractionPoint ii = do- ip <- stInteractionPoints %%= \ m -> do- let (mip, m') = Map.updateLookupWithKey (\ _ _ -> Nothing) ii m- return (m',- fromMaybe __IMPOSSIBLE__ mip)- stSolvedInteractionPoints %= Map.insert ii ip+ stInteractionPoints %= Map.update (\ ip -> Just ip{ ipSolved = True }) ii -- | Get a list of interaction ids. getInteractionPoints :: TCM [InteractionId] getInteractionPoints = Map.keys <$> use stInteractionPoints --- | Get all metas that correspond to interaction ids.+-- | Get all metas that correspond to unsolved interaction ids. getInteractionMetas :: TCM [MetaId]-getInteractionMetas = mapMaybe ipMeta . Map.elems <$> use stInteractionPoints+getInteractionMetas =+ mapMaybe ipMeta . filter (not . ipSolved) . Map.elems <$> use stInteractionPoints --- | Get all metas that correspond to interaction ids.+-- | Get all metas that correspond to unsolved interaction ids. getInteractionIdsAndMetas :: TCM [(InteractionId,MetaId)]-getInteractionIdsAndMetas = mapMaybe f . Map.toList <$> use stInteractionPoints+getInteractionIdsAndMetas =+ mapMaybe f . filter (not . ipSolved . snd) . Map.toList <$> use stInteractionPoints where f (ii, ip) = (ii,) <$> ipMeta ip -- | Does the meta variable correspond to an interaction point?
src/full/Agda/TypeChecking/Monad/Mutual.hs view
@@ -18,6 +18,7 @@ import Agda.Utils.Lens import Agda.Utils.Null+import Agda.Utils.Pretty ( prettyShow ) noMutualBlock :: TCM a -> TCM a noMutualBlock = local $ \e -> e { envMutualBlock = Nothing }@@ -81,4 +82,4 @@ mb <- Map.toList <$> use stMutualBlocks case filter (Set.member x . mutualNames . snd) mb of (i, _) : _ -> return i- _ -> fail $ "No mutual block for " ++ show x+ _ -> fail $ "No mutual block for " ++ prettyShow x
src/full/Agda/TypeChecking/Monad/Open.hs view
@@ -10,7 +10,7 @@ import Control.Applicative import Control.Monad import Control.Monad.Reader-import Data.List+import qualified Data.List as List import Agda.TypeChecking.Substitute import Agda.TypeChecking.Monad.Base@@ -39,8 +39,8 @@ getOpen (OpenThing [] x) = return x getOpen (OpenThing ctx x) = do ctx' <- getContextId- unless (ctx `isSuffixOf` ctx') $ fail $ "thing out of context (" ++ show ctx ++ " is not a sub context of " ++ show ctx' ++ ")"- return $ raise (genericLength ctx' - genericLength ctx) x+ unless (ctx `List.isSuffixOf` ctx') $ fail $ "thing out of context (" ++ show ctx ++ " is not a sub context of " ++ show ctx' ++ ")"+ return $ raise (length ctx' - length ctx) x -- | Try to use an 'Open' the current context. -- Returns 'Nothing' if current context is not an extension of the@@ -49,6 +49,6 @@ tryOpen (OpenThing [] x) = return $ Just x tryOpen (OpenThing ctx x) = do ctx' <- getContextId- if (ctx `isSuffixOf` ctx')- then return $ Just $ raise (genericLength ctx' - genericLength ctx) x+ if (ctx `List.isSuffixOf` ctx')+ then return $ Just $ raise (length ctx' - length ctx) x else return Nothing
src/full/Agda/TypeChecking/Monad/Options.hs view
@@ -11,14 +11,15 @@ import Data.Maybe import Data.Traversable -import Text.PrettyPrint import System.Directory import System.FilePath import Agda.Syntax.Internal import Agda.Syntax.Common import Agda.Syntax.Concrete+import {-# SOURCE #-} Agda.TypeChecking.Monad.Debug import {-# SOURCE #-} Agda.TypeChecking.Errors+import Agda.TypeChecking.Warnings import Agda.TypeChecking.Monad.Base import Agda.TypeChecking.Monad.State import Agda.TypeChecking.Monad.Benchmark@@ -34,6 +35,7 @@ import Agda.Utils.Monad import Agda.Utils.Lens import Agda.Utils.List+import Agda.Utils.Pretty import Agda.Utils.Trie (Trie) import qualified Agda.Utils.Trie as Trie import Agda.Utils.Except@@ -46,9 +48,10 @@ setPragmaOptions :: PragmaOptions -> TCM () setPragmaOptions opts = do+ stPragmaOptions %= Lens.mapSafeMode (Lens.getSafeMode opts ||) clo <- commandLineOptions let unsafe = unsafePragmaOptions opts- when (optSafe clo && not (null unsafe)) $ typeError (SafeFlagPragma unsafe)+ when (Lens.getSafeMode clo && not (null unsafe)) $ warning $ SafeFlagPragma unsafe ok <- liftIO $ runOptM $ checkOpts (clo { optPragmaOptions = opts }) case ok of Left err -> __IMPOSSIBLE__@@ -113,20 +116,6 @@ (libs, incs) <- libToTCM $ getDefaultLibraries (filePath root) (optDefaultLibs o) return o{ optIncludePaths = incs ++ optIncludePaths o, optLibraries = libs } -class (Functor m, Applicative m, Monad m) => HasOptions m where- -- | Returns the pragma options which are currently in effect.- pragmaOptions :: m PragmaOptions- -- | Returns the command line options which are currently in effect.- commandLineOptions :: m CommandLineOptions--instance MonadIO m => HasOptions (TCMT m) where- pragmaOptions = use stPragmaOptions-- commandLineOptions = do- p <- use stPragmaOptions- cl <- stPersistentOptions . stPersistentState <$> get- return $ cl { optPragmaOptions = p }- setOptionsFromPragma :: OptionsPragma -> TCM () setOptionsFromPragma ps = do opts <- commandLineOptions@@ -174,7 +163,7 @@ getProjectRoot :: RelativeTo -> TCM AbsolutePath getProjectRoot CurrentDir = liftIO (absolute =<< getCurrentDirectory) getProjectRoot (ProjectRoot f) = do- Ranged _ m <- moduleName' f+ m <- moduleName' f return (projectRoot f m) -- | Makes the given directories absolute and stores them as include@@ -209,12 +198,26 @@ -- Might also be useful to overwrite default imports... incs <- return $ incs ++ [primdir] + reportSDoc "setIncludeDirs" 10 $ return $ vcat+ [ text "Old include directories:"+ , nest 2 $ vcat $ map pretty oldIncs+ , text "New include directories:"+ , nest 2 $ vcat $ map pretty incs+ ]+ -- Check whether the include dirs have changed. If yes, reset state. -- Andreas, 2013-10-30 comments: -- The logic, namely using the include-dirs variable as a driver -- for the interaction, qualifies for a code-obfuscation contest. -- I guess one Boolean more in the state cost 10.000 EUR at the time -- of this implementation...+ --+ -- Andreas, perhaps you have misunderstood something: If the include+ -- directories have changed and we do not reset the decoded modules,+ -- then we might (depending on how the rest of the code works) end+ -- up in a situation in which we use the contents of the file+ -- "old-path/M.agda", when the user actually meant+ -- "new-path/M.agda". when (oldIncs /= incs) $ do ho <- getInteractionOutputCallback resetAllState@@ -236,7 +239,7 @@ ProjectRoot f -> void $ moduleName f -- Andreas, 2016-07-12 WAS: -- do- -- Ranged _ m <- moduleName' f+ -- m <- moduleName' f -- checkModuleName m f Nothing @@ -291,32 +294,29 @@ -- | Switch on printing of implicit and irrelevant arguments. -- E.g. for reification in with-function generation.+--+-- Restores all 'PragmaOptions' after completion.+-- Thus, do not attempt to make persistent 'PragmaOptions'+-- changes in a `withShowAllArguments` bracket.+ withShowAllArguments :: TCM a -> TCM a withShowAllArguments = withShowAllArguments' True withShowAllArguments' :: Bool -> TCM a -> TCM a-withShowAllArguments' yes ret = do- opts <- pragmaOptions- let imp = optShowImplicit opts- irr = optShowIrrelevant opts- setPragmaOptions $ opts { optShowImplicit = yes, optShowIrrelevant = yes }- x <- ret- opts <- pragmaOptions- setPragmaOptions $ opts { optShowImplicit = imp, optShowIrrelevant = irr }- return x+withShowAllArguments' yes = withPragmaOptions $ \ opts ->+ opts { optShowImplicit = yes, optShowIrrelevant = yes } -{- RETIRED, Andreas, 2012-04-30-setShowImplicitArguments :: Bool -> TCM a -> TCM a-setShowImplicitArguments showImp ret = do- opts <- pragmaOptions- let imp = optShowImplicit opts- setPragmaOptions $ opts { optShowImplicit = showImp }- x <- ret+-- | Change 'PragmaOptions' for a computation and restore afterwards.++withPragmaOptions :: (PragmaOptions -> PragmaOptions) -> TCM a -> TCM a+withPragmaOptions f cont = do opts <- pragmaOptions- setPragmaOptions $ opts { optShowImplicit = imp }+ setPragmaOptions $ f opts+ x <- cont+ setPragmaOptions opts return x--} + ignoreInterfaces :: TCM Bool ignoreInterfaces = optIgnoreInterfaces <$> commandLineOptions @@ -362,48 +362,24 @@ m = last $ 0 : Trie.lookupPath ks t return (n <= m) --- | Displays a debug message in a suitable way.-{-# SPECIALIZE displayDebugMessage :: Int -> String -> TCM () #-}-displayDebugMessage :: MonadTCM tcm- => Int -- ^ The message's debug level.- -> String -- ^ Message.- -> tcm ()-displayDebugMessage n s = liftTCM $- appInteractionOutputCallback (Resp_RunningInfo n s)+-- | Check whether a certain verbosity level is activated (exact match). +{-# SPECIALIZE hasExactVerbosity :: VerboseKey -> Int -> TCM Bool #-}+hasExactVerbosity :: HasOptions m => VerboseKey -> Int -> m Bool+hasExactVerbosity k n =+ (Just n ==) . Trie.lookup (wordsBy (`elem` ".:") k) <$> getVerbosity++-- | Run a computation if a certain verbosity level is activated (exact match).++{-# SPECIALIZE whenExactVerbosity :: VerboseKey -> Int -> TCM () -> TCM () #-}+whenExactVerbosity :: MonadTCM tcm => VerboseKey -> Int -> tcm () -> tcm ()+whenExactVerbosity k n = whenM $ liftTCM $ hasExactVerbosity k n+ -- | Run a computation if a certain verbosity level is activated. -- -- Precondition: The level must be non-negative. {-# SPECIALIZE verboseS :: VerboseKey -> Int -> TCM () -> TCM () #-}-verboseS :: MonadTCM tcm => VerboseKey -> Int -> tcm () -> tcm ()-verboseS k n action = whenM (liftTCM $ hasVerbosity k n) action---- | Conditionally print debug string.-{-# SPECIALIZE reportS :: VerboseKey -> Int -> String -> TCM () #-}-reportS :: MonadTCM tcm => VerboseKey -> Int -> String -> tcm ()-reportS k n s = liftTCM $ verboseS k n $ displayDebugMessage n s---- | Conditionally println debug string.-{-# SPECIALIZE reportSLn :: VerboseKey -> Int -> String -> TCM () #-}-reportSLn :: MonadTCM tcm => VerboseKey -> Int -> String -> tcm ()-reportSLn k n s = verboseS k n $- displayDebugMessage n (s ++ "\n")---- | Conditionally render debug 'Doc' and print it.-{-# SPECIALIZE reportSDoc :: VerboseKey -> Int -> TCM Doc -> TCM () #-}-reportSDoc :: MonadTCM tcm => VerboseKey -> Int -> TCM Doc -> tcm ()-reportSDoc k n d = liftTCM $ verboseS k n $ do- displayDebugMessage n . (++ "\n") . show =<< do- d `catchError` \ err ->- (\ s -> (sep $ map text- [ "Printing debug message"- , k ++ ":" ++show n- , "failed due to error:" ]) $$- (nest 2 $ text s)) <$> prettyError err---- | Print brackets around debug messages issued by a computation.-{-# SPECIALIZE verboseBracket :: VerboseKey -> Int -> String -> TCM a -> TCM a #-}-verboseBracket :: MonadTCM tcm => VerboseKey -> Int -> String -> TCM a -> tcm a-verboseBracket k n s m = liftTCM $ ifNotM (hasVerbosity k n) m $ {- else -} do- displayDebugMessage n $ "{ " ++ s ++ "\n"- m `finally` displayDebugMessage n "}\n"+-- {-# SPECIALIZE verboseS :: MonadIO m => VerboseKey -> Int -> TCMT m () -> TCMT m () #-} -- RULE left-hand side too complicated to desugar+{-# SPECIALIZE verboseS :: MonadTCM tcm => VerboseKey -> Int -> tcm () -> tcm () #-}+verboseS :: HasOptions m => VerboseKey -> Int -> m () -> m ()+verboseS k n action = whenM (hasVerbosity k n) action
src/full/Agda/TypeChecking/Monad/Options.hs-boot view
@@ -12,15 +12,5 @@ type VerboseKey = String -class (Functor m, Applicative m, Monad m) => HasOptions m where- -- | Returns the pragma options which are currently in effect.- pragmaOptions :: m PragmaOptions- -- | Returns the command line options which are currently in effect.- commandLineOptions :: m CommandLineOptions--instance MonadIO m => HasOptions (TCMT m)- hasVerbosity :: HasOptions m => VerboseKey -> Int -> m Bool-verboseS :: MonadTCM tcm => VerboseKey -> Int -> tcm () -> tcm ()-reportSLn :: MonadTCM tcm => VerboseKey -> Int -> String -> tcm ()-reportSDoc :: MonadTCM tcm => VerboseKey -> Int -> TCM Doc -> tcm ()+verboseS :: HasOptions m => VerboseKey -> Int -> m () -> m ()
src/full/Agda/TypeChecking/Monad/Sharing.hs view
@@ -4,12 +4,13 @@ import Control.Applicative import Control.Monad.Reader-import Data.List+import qualified Data.List as List import Data.Function import Data.Traversable import Agda.Syntax.Internal import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.Options import Agda.Utils.Monad @@ -43,7 +44,7 @@ forceEqualTerms :: Term -> Term -> TCM () forceEqualTerms u v = whenM (asks envAllowDestructiveUpdate) $- when (null $ (intersect `on` pointerChain) u v) $+ when (null $ (List.intersect `on` pointerChain) u v) $ case (u, v) of (Shared p, Shared q) | p > q -> update u v (_, Shared{}) -> update v u@@ -56,5 +57,4 @@ setPtr v p `seq` compressPointerChain u `seq` return () where p = last $ pointerChain u update _ _ = __IMPOSSIBLE__- report x y = reportSLn "tc.ptr" 50 $ "setting " ++ show x ++ "\n to " ++ show y-+ report u v = reportSLn "tc.ptr" 50 $ "setting " ++ show u ++ "\n to " ++ show v
src/full/Agda/TypeChecking/Monad/Signature.hs view
@@ -11,7 +11,7 @@ import Control.Monad.Reader import Control.Monad.Trans.Maybe -import Data.List hiding (null)+import qualified Data.List as List import Data.Set (Set) import qualified Data.Set as Set import Data.Map (Map)@@ -27,17 +27,17 @@ import Agda.Syntax.Position import Agda.Syntax.Treeless (Compiled(..), TTerm) -import qualified Agda.Compiler.UHC.Pragmas.Base as CR- import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.Context import Agda.TypeChecking.Monad.Options import Agda.TypeChecking.Monad.Env-import Agda.TypeChecking.Monad.Exception ( ExceptionT ) import Agda.TypeChecking.Monad.Mutual import Agda.TypeChecking.Monad.Open import Agda.TypeChecking.Monad.Local import Agda.TypeChecking.Monad.State+import Agda.TypeChecking.Monad.Trace+import Agda.TypeChecking.Warnings import Agda.TypeChecking.Positivity.Occurrence import Agda.TypeChecking.Substitute import {-# SOURCE #-} Agda.TypeChecking.Telescope@@ -45,7 +45,7 @@ import {-# SOURCE #-} Agda.TypeChecking.Polarity import {-# SOURCE #-} Agda.TypeChecking.ProjectionLike -import Agda.Utils.Except ( Error )+import Agda.Utils.Except ( ExceptT ) import Agda.Utils.Functor import Agda.Utils.Lens import Agda.Utils.List@@ -64,11 +64,11 @@ -- | Add a constant to the signature. Lifts the definition to top level. addConstant :: QName -> Definition -> TCM () addConstant q d = do- reportSLn "tc.signature" 20 $ "adding constant " ++ show q ++ " to signature"+ reportSLn "tc.signature" 20 $ "adding constant " ++ prettyShow q ++ " to signature" tel <- getContextTelescope let tel' = replaceEmptyName "r" $ killRange $ case theDef d of Constructor{} -> fmap hideOrKeepInstance tel- Function{ funProjection = Just Projection{ projProper = True, projIndex = n } } ->+ Function{ funProjection = Just Projection{ projProper = Just{}, projIndex = n } } -> let fallback = fmap hideOrKeepInstance tel in if n > 0 then fallback else -- if the record value is part of the telescope, its hiding should left unchanged@@ -77,7 +77,7 @@ Just (doms, dom) -> telFromList $ fmap hideOrKeepInstance doms ++ [dom] _ -> tel let d' = abstract tel' $ d { defName = q }- reportSLn "tc.signature" 30 $ "lambda-lifted definition = " ++ show d'+ reportSDoc "tc.signature" 60 $ return $ text "lambda-lifted definition =" <?> pretty d' modifySignature $ updateDefinitions $ HMap.insertWith (+++) q d' i <- currentOrFreshMutualBlock setMutualBlock i q@@ -87,10 +87,9 @@ -- | Set termination info of a defined function symbol. setTerminates :: QName -> Bool -> TCM ()-setTerminates q b = modifySignature $ updateDefinition q $ updateTheDef $ setT- where- setT def@Function{} = def { funTerminates = Just b }- setT def = def+setTerminates q b = modifySignature $ updateDefinition q $ updateTheDef $ \case+ def@Function{} -> def { funTerminates = Just b }+ def -> def -- | Modify the clauses of a function. modifyFunClauses :: QName -> ([Clause] -> [Clause]) -> TCM ()@@ -98,66 +97,74 @@ modifySignature $ updateDefinition q $ updateTheDef $ updateFunClauses f -- | Lifts clauses to the top-level and adds them to definition.+-- Also adjusts the 'funCopatternLHS' field if necessary. addClauses :: QName -> [Clause] -> TCM () addClauses q cls = do tel <- getContextTelescope- modifyFunClauses q (++ abstract tel cls)+ modifySignature $ updateDefinition q $ updateTheDef+ $ updateFunClauses (++ abstract tel cls)+ . updateFunCopatternLHS (|| isCopatternLHS cls) -ensureNoCompiledHaskell :: QName -> TCM ()-ensureNoCompiledHaskell q =- whenM (isJust . compiledHaskell . defCompiledRep <$> getConstInfo q) $- typeError $ GenericError $ "Multiple Haskell bindings for " ++ show q ++ ". " ++- "Note that builtin numbers, booleans, chars and strings don't need " ++- "COMPILED pragmas."+mkPragma :: String -> TCM CompilerPragma+mkPragma s = CompilerPragma <$> getCurrentRange <*> pure s -addHaskellCode :: QName -> HaskellType -> HaskellCode -> TCM ()-addHaskellCode q hsTy hsDef = do- ensureNoCompiledHaskell q- modifySignature $ updateDefinition q $ updateDefCompiledRep $ addHs- where- addHs crep = crep { compiledHaskell = Just $ HsDefn hsTy hsDef }+-- | Add a compiler pragma `{-# COMPILE <backend> <name> <text> #-}`+addPragma :: BackendName -> QName -> String -> TCM ()+addPragma b q s = modifySignature . updateDefinition q . addCompilerPragma b =<< mkPragma s -addHaskellExport :: QName -> HaskellType -> String -> TCM ()-addHaskellExport q hsTy hsName = do- ensureNoCompiledHaskell q- modifySignature $ updateDefinition q $ updateDefCompiledRep $ addHs- where- addHs crep = crep { exportHaskell = Just (HsExport hsTy hsName)}+-- ** Temporary **+-- The functions below are only needed while we still parse the old COMPILED+-- pragmas. +type HaskellCode = String+type HaskellType = String+type JSCode = String+type CoreCode = String++addDeprecatedPragma :: String -> BackendName -> QName -> String -> TCM ()+addDeprecatedPragma old b q s = do+ let pq = prettyShow $ nameConcrete $ qnameName q+ warning $ DeprecationWarning (unwords ["The", old, "pragma"])+ (unwords ["{-# COMPILE", b, pq, s, "#-}"]) "2.6"+ addPragma b q s++dataFormat :: String -> [String] -> String+dataFormat ty cons = "= data " ++ ty ++ " (" ++ List.intercalate " | " cons ++ ")"++addHaskellCode :: QName -> HaskellCode -> TCM ()+addHaskellCode q hsCode = addDeprecatedPragma "COMPILED" ghcBackendName q $ "= " ++ hsCode++addHaskellExport :: QName -> String -> TCM ()+addHaskellExport q hsName = addDeprecatedPragma "COMPILED_EXPORT" ghcBackendName q $ "as " ++ hsName+ addHaskellType :: QName -> HaskellType -> TCM ()-addHaskellType q hsTy = do- ensureNoCompiledHaskell q- modifySignature $ updateDefinition q $ updateDefCompiledRep $ addHs- where- addHs crep = crep { compiledHaskell = Just $ HsType hsTy }+addHaskellType q hsTy = addDeprecatedPragma "COMPILED_TYPE" ghcBackendName q $ "= type " ++ hsTy -addEpicCode :: QName -> EpicCode -> TCM ()-addEpicCode q epDef = modifySignature $ updateDefinition q $ updateDefCompiledRep $ addEp- -- TODO: sanity checking- where- addEp crep = crep { compiledEpic = Just epDef }+addHaskellData :: QName -> HaskellType -> [HaskellCode] -> TCM ()+addHaskellData q hsTy hsCons = addDeprecatedPragma "COMPILED_DATA" ghcBackendName q $ dataFormat hsTy hsCons -addJSCode :: QName -> String -> TCM ()-addJSCode q jsDef = modifySignature $ updateDefinition q $ updateDefCompiledRep $ addJS- where- addJS crep = crep { compiledJS = Just jsDef }+addJSCode :: QName -> JSCode -> TCM ()+addJSCode q jsDef = addDeprecatedPragma "COMPILED_JS" jsBackendName q ("= " ++ jsDef) -addCoreCode :: QName -> CR.CoreExpr -> TCM ()-addCoreCode q crDef = modifySignature $ updateDefinition q $ updateDefCompiledRep $ addCore crDef- where- addCore e crep = crep { compiledCore = Just $ CrDefn e }+addCoreCode :: QName -> CoreCode -> TCM ()+addCoreCode q crDef = addDeprecatedPragma "COMPILED_UHC" uhcBackendName q $ "= " ++ crDef -addCoreConstr :: QName -> CR.CoreConstr -> TCM ()-addCoreConstr q con = modifySignature $ updateDefinition q $ updateDefCompiledRep $ addCore- where- addCore crep = crep {compiledCore = Just $ CrConstr con }+addCoreType :: QName -> CoreCode -> [CoreCode] -> TCM ()+addCoreType q crTy crCons = addDeprecatedPragma "COMPILED_DATA_UHC" uhcBackendName q $ dataFormat crTy crCons -addCoreType :: QName -> CR.CoreType -> TCM ()-addCoreType q crTy = modifySignature $ updateDefinition q $ updateDefCompiledRep $ addCr- -- TODO: sanity checking- where- addCr crep = crep { compiledCore = Just $ CrType crTy }+-- ** End of temporary functions ** +getUniqueCompilerPragma :: BackendName -> QName -> TCM (Maybe CompilerPragma)+getUniqueCompilerPragma backend q = do+ ps <- defCompilerPragmas backend <$> getConstInfo q+ case ps of+ [] -> return Nothing+ [p] -> return $ Just p+ _ -> setCurrentRange (ps !! 1) $+ genericDocError $+ hang (text ("Conflicting " ++ backend ++ " pragmas for") <+> pretty q <+> text "at") 2 $+ vcat [ text "-" <+> pretty (getRange p) | p <- ps ]+ setFunctionFlag :: FunctionFlag -> Bool -> QName -> TCM () setFunctionFlag flag val q = modifyGlobalDefinition q $ set (theDefLens . funFlag flag) val @@ -167,6 +174,9 @@ markInline :: QName -> TCM () markInline = setFunctionFlag FunInline True +markInjective :: QName -> TCM ()+markInjective q = modifyGlobalDefinition q $ \def -> def { defInjective = True }+ unionSignatures :: [Signature] -> Signature unionSignatures ss = foldr unionSignature emptySignature ss where@@ -189,12 +199,12 @@ if (sec == sec') then do -- Andreas, 2015-12-02: test/Succeed/Issue1701II.agda -- reports a "redundantly adding existing section".- reportSLn "tc.section" 10 $ "warning: redundantly adding existing section " ++ show m- reportSLn "tc.section" 60 $ "with content " ++ show sec+ reportSLn "tc.section" 10 $ "warning: redundantly adding existing section " ++ prettyShow m+ reportSLn "tc.section" 60 $ "with content " ++ prettyShow sec else do- reportSLn "impossible" 10 $ "overwriting existing section " ++ show m- reportSLn "impossible" 60 $ "of content " ++ show sec'- reportSLn "impossible" 60 $ "with content " ++ show sec+ reportSLn "impossible" 10 $ "overwriting existing section " ++ prettyShow m+ reportSLn "impossible" 60 $ "of content " ++ prettyShow sec'+ reportSLn "impossible" 60 $ "with content " ++ prettyShow sec __IMPOSSIBLE__ -- Add the new section. setDefaultModuleParameters m@@ -258,8 +268,10 @@ case unSpine <$> body of Just (Def y es) -> do let df = Display m es $ DTerm $ Def top $ map Apply args- reportSLn "tc.display.section" 20 $ "adding display form " ++ show y ++ " --> " ++ show top- ++ "\n " ++ show df+ reportSLn "tc.display.section" 20 $ unlines+ [ "adding display form " ++ prettyShow y ++ " --> " ++ prettyShow top+ , show df+ ] addDisplayForm y df add args top y es Just v -> noDispForm x $ "not a def body, but " ++ show v@@ -267,14 +279,16 @@ [] | Constructor{ conSrcCon = h } <- theDef def -> do let y = conName h df = Display 0 [] $ DTerm $ Con (h {conName = top }) ConOSystem []- reportSLn "tc.display.section" 20 $ "adding display form " ++ show y ++ " --> " ++ show top- ++ "\n " ++ show df+ reportSLn "tc.display.section" 20 $ unlines+ [ "adding display form " ++ prettyShow y ++ " --> " ++ prettyShow top+ , show df+ ] addDisplayForm y df [] -> noDispForm x "no clauses" (_:_:_) -> noDispForm x "many clauses" noDispForm x reason = reportSLn "tc.display.section" 30 $- "no display form from " ++ show x ++ " because " ++ reason+ "no display form from " ++ prettyShow x ++ " because " ++ reason isVar VarP{} = True isVar _ = False@@ -293,47 +307,49 @@ where -- If a datatype is being copied, all its constructors need to be copied, -- and if a constructor is copied its datatype needs to be.+ closeConstructors :: Ren QName -> TCM (Ren QName) closeConstructors rd = do- ds <- nub . concat <$> mapM (constructorData . fst) rd- cs <- nub . concat <$> mapM (dataConstructors . fst) rd+ ds <- List.nub . concat <$> mapM (constructorData . fst) rd+ cs <- List.nub . concat <$> mapM (dataConstructors . fst) rd new <- concat <$> mapM rename (ds ++ cs) reportSLn "tc.mod.apply.complete" 30 $- "also copying: " ++ show new+ "also copying: " ++ prettyShow new return $ new ++ rd where+ rename :: QName -> TCM (Ren QName) rename x = case lookup x rd of- Nothing -> do y <- freshName_ (show x)+ Nothing -> do y <- freshName_ (prettyShow x) return [(x, qnameFromList [y])] Just{} -> return [] + constructorData :: QName -> TCM [QName] constructorData x = do def <- theDef <$> getConstInfo x return $ case def of Constructor{ conData = d } -> [d] _ -> []++ dataConstructors :: QName -> TCM [QName] dataConstructors x = do def <- theDef <$> getConstInfo x return $ case def of Datatype{ dataCons = cs } -> cs- Record{ recConHead = h } -> [conName h]+ Record{ recConHead = h } -> [conName h] _ -> [] applySection' :: ModuleName -> Telescope -> ModuleName -> Args -> ScopeCopyInfo -> TCM () applySection' new ptel old ts ScopeCopyInfo{ renNames = rd, renModules = rm } = do reportSLn "tc.mod.apply" 10 $ render $ vcat [ text "applySection"- , text "new =" <+> text (show new)- , text "ptel =" <+> text (show ptel)- , text "old =" <+> text (show old)- , text "ts =" <+> text (show ts)- ]- reportSLn "tc.mod.apply" 80 $ render $ vcat- [ text "arguments: " <+> text (show ts)+ , text "new =" <+> pretty new+ , text "ptel =" <+> pretty ptel+ , text "old =" <+> pretty old+ , text "ts =" <+> pretty ts ] mapM_ (copyDef ts) rd mapM_ (copySec ts) rm- mapM_ computePolarity (map snd rd)+ computePolarity (map snd rd) where -- Andreas, 2013-10-29 -- Here, if the name x is not imported, it persists as@@ -347,7 +363,7 @@ argsToUse x = do let m = commonParentModule old x- reportSLn "tc.mod.apply" 80 $ "Common prefix: " ++ show m+ reportSLn "tc.mod.apply" 80 $ "Common prefix: " ++ prettyShow m size <$> lookupSection m copyDef :: Args -> (QName, QName) -> TCM ()@@ -357,7 +373,7 @@ copyDef' np def where copyDef' np d = do- reportSLn "tc.mod.apply" 60 $ "making new def for " ++ show y ++ " from " ++ show x ++ " with " ++ show np ++ " args " ++ show (defAbstract d)+ reportSLn "tc.mod.apply" 60 $ "making new def for " ++ prettyShow y ++ " from " ++ prettyShow x ++ " with " ++ show np ++ " args " ++ show (defAbstract d) reportSLn "tc.mod.apply" 80 $ "args = " ++ show ts' ++ "\n" ++ "old type = " ++ prettyShow (defType d)@@ -400,10 +416,11 @@ , defInstance = inst , defCopy = True , defMatchable = False+ , defInjective = False , theDef = df } oldDef = theDef d isCon = case oldDef of { Constructor{} -> True ; _ -> False }- mutual = case oldDef of { Function{funMutual = m} -> m ; _ -> [] }+ mutual = case oldDef of { Function{funMutual = m} -> m ; _ -> Nothing } extlam = case oldDef of { Function{funExtLam = e} -> e ; _ -> Nothing } with = case oldDef of { Function{funWith = w} -> copyName <$> w ; _ -> Nothing } -- Andreas, 2015-05-11, to fix issue 1413:@@ -416,6 +433,7 @@ | size ts' < n || (size ts' == n && maybe True isVar0 (lastMaybe ts')) -> Just $ p { projIndex = n - size ts' , projLams = projLams p `apply` ts'+ , projProper= fmap copyName $ projProper p } _ -> Nothing def =@@ -450,10 +468,11 @@ , funWith = with , funCopatternLHS = isCopatternLHS [cl] }- reportSLn "tc.mod.apply" 80 $ "new def for " ++ show x ++ "\n " ++ show newDef+ reportSDoc "tc.mod.apply" 80 $ return $ (text "new def for" <+> pretty x) <?> pretty newDef return newDef - cl = Clause { clauseRange = getRange $ defClauses d+ cl = Clause { clauseLHSRange = getRange $ defClauses d+ , clauseFullRange = getRange $ defClauses d , clauseTel = EmptyTel , namedClausePats = [] , clauseBody = Just $ case oldDef of@@ -461,6 +480,7 @@ _ -> Def x $ map Apply ts' , clauseType = Just $ defaultArg t , clauseCatchall = False+ , clauseUnreachable = Just False -- definitely not unreachable } {- Example@@ -498,11 +518,11 @@ totalArgs <- argsToUse x tel <- lookupSection x let sectionTel = apply tel $ take totalArgs ts- reportSLn "tc.mod.apply" 80 $ "Copying section " ++ show x ++ " to " ++ show y- reportSLn "tc.mod.apply" 80 $ " ts = " ++ intercalate "; " (map prettyShow ts)+ reportSLn "tc.mod.apply" 80 $ "Copying section " ++ prettyShow x ++ " to " ++ prettyShow y+ reportSLn "tc.mod.apply" 80 $ " ts = " ++ List.intercalate "; " (map prettyShow ts) reportSLn "tc.mod.apply" 80 $ " totalArgs = " ++ show totalArgs- reportSLn "tc.mod.apply" 80 $ " tel = " ++ intercalate " " (map (fst . unDom) $ telToList tel) -- only names- reportSLn "tc.mod.apply" 80 $ " sectionTel = " ++ intercalate " " (map (fst . unDom) $ telToList ptel) -- only names+ reportSLn "tc.mod.apply" 80 $ " tel = " ++ List.intercalate " " (map (fst . unDom) $ telToList tel) -- only names+ reportSLn "tc.mod.apply" 80 $ " sectionTel = " ++ List.intercalate " " (map (fst . unDom) $ telToList ptel) -- only names addContext sectionTel $ addSection y -- | Add a display form to a definition (could be in this or imported signature).@@ -517,13 +537,13 @@ typeError . GenericDocError $ text "Cannot add recursive display form for" <+> pretty x isLocal :: QName -> TCM Bool-isLocal x = isJust . HMap.lookup x <$> use (stSignature . sigDefinitions)+isLocal x = HMap.member x <$> use (stSignature . sigDefinitions) getDisplayForms :: QName -> TCM [LocalDisplayForm] getDisplayForms q = do- ds <- defDisplay <$> getConstInfo q- ds1 <- maybe [] id . HMap.lookup q <$> use stImportsDisplayForms- ds2 <- maybe [] id . HMap.lookup q <$> use stImportedDisplayForms+ ds <- either (const []) defDisplay <$> getConstInfo' q+ ds1 <- HMap.lookupDefault [] q <$> use stImportsDisplayForms+ ds2 <- HMap.lookupDefault [] q <$> use stImportedDisplayForms ifM (isLocal q) (return $ ds ++ ds1 ++ ds2) (return $ ds1 ++ ds ++ ds2) @@ -564,12 +584,12 @@ -- | Can be called on either a (co)datatype, a record type or a -- (co)constructor.-whatInduction :: QName -> TCM Induction-whatInduction c = do+whatInduction :: MonadTCM tcm => QName -> tcm Induction+whatInduction c = liftTCM $ do def <- theDef <$> getConstInfo c case def of Datatype{ dataInduction = i } -> return i- Record{ recRecursive = False} -> return Inductive+ Record{} | not (recRecursive def) -> return Inductive Record{ recInduction = i } -> return $ fromMaybe Inductive i Constructor{ conInd = i } -> return i _ -> __IMPOSSIBLE__@@ -590,10 +610,31 @@ _ -> __IMPOSSIBLE__ _ -> __IMPOSSIBLE__ -class (Functor m, Applicative m, Monad m) => HasConstInfo m where+-- | Signature lookup errors.+data SigError+ = SigUnknown String -- ^ The name is not in the signature; default error message.+ | SigAbstract -- ^ The name is not available, since it is abstract.++-- | Standard eliminator for 'SigError'.+sigError :: (String -> a) -> a -> SigError -> a+sigError f a = \case+ SigUnknown s -> f s+ SigAbstract -> a++class (Functor m, Applicative m, Monad m, HasOptions m, MonadDebug m) => HasConstInfo m where -- | Lookup the definition of a name. The result is a closed thing, all free -- variables have been abstracted over. getConstInfo :: QName -> m Definition+ getConstInfo q = getConstInfo' q >>= \case+ Right d -> return d+ Left (SigUnknown err) -> __IMPOSSIBLE_VERBOSE__ err+ Left SigAbstract -> __IMPOSSIBLE_VERBOSE__ $+ "Abstract, thus, not in scope: " ++ prettyShow q++ -- | Version that reports exceptions:+ getConstInfo' :: QName -> m (Either SigError Definition)+ getConstInfo' q = Right <$> getConstInfo q+ -- | Lookup the rewrite rules with the given head symbol. getRewriteRulesFor :: QName -> m RewriteRules @@ -614,21 +655,33 @@ instance HasConstInfo (TCMT IO) where getRewriteRulesFor = defaultGetRewriteRulesFor get- getConstInfo q = join $ pureTCM $ \st env ->+ getConstInfo' q = do+ st <- get+ env <- ask+ defaultGetConstInfo st env q+ getConstInfo q = getConstInfo' q >>= \case+ Right d -> return d+ Left (SigUnknown err) -> fail err+ Left SigAbstract -> notInScope $ qnameToConcrete q++defaultGetConstInfo+ :: (HasOptions m, MonadDebug m)+ => TCState -> TCEnv -> QName -> m (Either SigError Definition)+defaultGetConstInfo st env q = do let defs = st^.(stSignature . sigDefinitions) idefs = st^.(stImports . sigDefinitions)- in case catMaybes [HMap.lookup q defs, HMap.lookup q idefs] of- [] -> fail $ "Unbound name: " ++ show q ++ " " ++ showQNameId q+ case catMaybes [HMap.lookup q defs, HMap.lookup q idefs] of+ [] -> return $ Left $ SigUnknown $ "Unbound name: " ++ prettyShow q ++ " " ++ showQNameId q [d] -> mkAbs env d- ds -> fail $ "Ambiguous name: " ++ show q+ ds -> __IMPOSSIBLE_VERBOSE__ $ "Ambiguous name: " ++ prettyShow q where mkAbs env d | treatAbstractly' q' env = case makeAbstract d of- Just d -> return d- Nothing -> notInScope $ qnameToConcrete q+ Just d -> return $ Right d+ Nothing -> return $ Left SigAbstract -- the above can happen since the scope checker is a bit sloppy with 'abstract'- | otherwise = return d+ | otherwise = return $ Right d where q' = case theDef d of -- Hack to make abstract constructors work properly. The constructors@@ -640,12 +693,12 @@ dropLastModule q@QName{ qnameModule = m } = q{ qnameModule = mnameFromList $ ifNull (mnameToList m) __IMPOSSIBLE__ init } -instance (HasConstInfo m) => HasConstInfo (MaybeT m) where- getConstInfo = lift . getConstInfo+instance HasConstInfo m => HasConstInfo (MaybeT m) where+ getConstInfo' = lift . getConstInfo' getRewriteRulesFor = lift . getRewriteRulesFor -instance (HasConstInfo m, Error err) => HasConstInfo (ExceptionT err m) where- getConstInfo = lift . getConstInfo+instance HasConstInfo m => HasConstInfo (ExceptT err m) where+ getConstInfo' = lift . getConstInfo' getRewriteRulesFor = lift . getRewriteRulesFor {-# INLINE getConInfo #-}@@ -666,7 +719,7 @@ setPolarity :: QName -> [Polarity] -> TCM () setPolarity q pol = do reportSLn "tc.polarity.set" 20 $- "Setting polarity of " ++ show q ++ " to " ++ show pol ++ "."+ "Setting polarity of " ++ prettyShow q ++ " to " ++ prettyShow pol ++ "." modifySignature $ updateDefinition q $ updateDefPolarity $ const pol -- | Get argument occurrence info for argument @i@ of definition @d@ (never fails).@@ -687,23 +740,21 @@ modifySignature $ updateDefinition d $ updateDefArgOccurrences f setTreeless :: QName -> TTerm -> TCM ()-setTreeless q t = modifyGlobalDefinition q $ setTT- where- setTT def@Defn{theDef = fun@Function{}} =- def{theDef = fun{funTreeless = Just (Compiled t [])}}- setTT def = __IMPOSSIBLE__+setTreeless q t =+ modifyGlobalDefinition q $ updateTheDef $ \case+ fun@Function{} -> fun{ funTreeless = Just $ Compiled t [] }+ _ -> __IMPOSSIBLE__ setCompiledArgUse :: QName -> [Bool] -> TCM ()-setCompiledArgUse q use = modifyGlobalDefinition q $ setTT- where- setTT def@Defn{theDef = fun@Function{}} =- def{theDef = fun{funTreeless = for (funTreeless fun) $ \ c -> c { cArgUsage = use }}}- setTT def = __IMPOSSIBLE__+setCompiledArgUse q use =+ modifyGlobalDefinition q $ updateTheDef $ \case+ fun@Function{} ->+ fun{ funTreeless = for (funTreeless fun) $ \ c -> c { cArgUsage = use } }+ _ -> __IMPOSSIBLE__ getCompiled :: QName -> TCM (Maybe Compiled) getCompiled q = do- def <- theDef <$> getConstInfo q- return $ case def of+ (theDef <$> getConstInfo q) <&> \case Function{ funTreeless = t } -> t _ -> Nothing @@ -711,22 +762,13 @@ getErasedConArgs q = do def <- getConstInfo q case theDef def of- Constructor{ conData = d, conPars = np, conErased = es } -> do- ddef <- getConstInfo d- case compiledHaskell $ defCompiledRep ddef of- Nothing -> return es- Just _ -> do- -- Can't erase arguments of COMPILED_DATA constructors yet- TelV tel _ <- telView $ defType def- return $ replicate (size tel - np) False+ Constructor{ conData = d, conPars = np, conErased = es } -> return es _ -> __IMPOSSIBLE__ setErasedConArgs :: QName -> [Bool] -> TCM ()-setErasedConArgs q args = modifyGlobalDefinition q setArgs- where- setArgs def@Defn{theDef = con@Constructor{}} =- def{ theDef = con{ conErased = args } }- setArgs def = def -- no-op for non-constructors+setErasedConArgs q args = modifyGlobalDefinition q $ updateTheDef $ \case+ def@Constructor{} -> def{ conErased = args }+ def -> def -- no-op for non-constructors getTreeless :: QName -> TCM (Maybe TTerm) getTreeless q = fmap cTreeless <$> getCompiled q@@ -734,29 +776,36 @@ getCompiledArgUse :: QName -> TCM [Bool] getCompiledArgUse q = maybe [] cArgUsage <$> getCompiled q --- | Get the mutually recursive identifiers.-getMutual :: QName -> TCM [QName]-getMutual d = do- def <- theDef <$> getConstInfo d- return $ case def of+-- | Get the mutually recursive identifiers of a symbol from the signature.+getMutual :: QName -> TCM (Maybe [QName])+getMutual d = getMutual_ . theDef <$> getConstInfo d++-- | Get the mutually recursive identifiers from a `Definition`.+getMutual_ :: Defn -> Maybe [QName]+getMutual_ = \case Function { funMutual = m } -> m Datatype { dataMutual = m } -> m Record { recMutual = m } -> m- _ -> []+ _ -> Nothing -- | Set the mutually recursive identifiers. setMutual :: QName -> [QName] -> TCM () setMutual d m = modifySignature $ updateDefinition d $ updateTheDef $ \ def -> case def of- Function{} -> def { funMutual = m }- Datatype{} -> def {dataMutual = m }- Record{} -> def { recMutual = m }- _ -> __IMPOSSIBLE__+ Function{} -> def { funMutual = Just m }+ Datatype{} -> def {dataMutual = Just m }+ Record{} -> def { recMutual = Just m }+ _ -> if null m then def else __IMPOSSIBLE__ -- nothing to do -- | Check whether two definitions are mutually recursive. mutuallyRecursive :: QName -> QName -> TCM Bool-mutuallyRecursive d d' = (d `elem`) <$> getMutual d'+mutuallyRecursive d d1 = (d `elem`) . fromMaybe __IMPOSSIBLE__ <$> getMutual d1 +-- | A function/data/record definition is nonRecursive if it is not even mutually+-- recursive with itself.+definitelyNonRecursive_ :: Defn -> Bool+definitelyNonRecursive_ = maybe False null . getMutual_+ -- | Get the number of parameters to the current module. getCurrentModuleFreeVars :: TCM Nat getCurrentModuleFreeVars = size <$> (lookupSection =<< currentModule)@@ -767,12 +816,20 @@ getDefFreeVars :: (Functor m, Applicative m, ReadTCState m, MonadReader TCEnv m) => QName -> m Nat getDefFreeVars = getModuleFreeVars . qnameModule -freeVarsToApply :: QName -> TCM Args-freeVarsToApply = moduleParamsToApply . qnameModule+freeVarsToApply :: (Functor m, HasConstInfo m, HasOptions m,+ ReadTCState m, MonadReader TCEnv m, MonadDebug m)+ => QName -> m Args+freeVarsToApply q = do+ vs <- moduleParamsToApply $ qnameModule q+ t <- defType <$> getConstInfo q+ let TelV tel _ = telView'UpTo (size vs) t+ unless (size tel == size vs) __IMPOSSIBLE__+ return $ zipWith (\ (Arg _ v) (Dom ai _) -> Arg ai v) vs $ telToList tel {-# SPECIALIZE getModuleFreeVars :: ModuleName -> TCM Nat #-} {-# SPECIALIZE getModuleFreeVars :: ModuleName -> ReduceM Nat #-}-getModuleFreeVars :: (Functor m, Applicative m, ReadTCState m, MonadReader TCEnv m) => ModuleName -> m Nat+getModuleFreeVars :: (Functor m, Applicative m, MonadReader TCEnv m, ReadTCState m)+ => ModuleName -> m Nat getModuleFreeVars m = do m0 <- commonParentModule m <$> currentModule (+) <$> getAnonymousVariables m <*> (size <$> lookupSection m0)@@ -782,7 +839,7 @@ -- We have to insert the module telescope of the common prefix -- of the current module and the module where the definition comes from. -- (Properly raised to the current context.)---+--y -- Example: -- @ -- module M₁ Γ where@@ -791,20 +848,23 @@ -- module M₃ Θ where -- ... M₁.M₂.f [insert Γ raised by Θ] -- @-moduleParamsToApply :: ModuleName -> TCM Args+moduleParamsToApply :: (Functor m, Applicative m, HasOptions m,+ MonadReader TCEnv m, ReadTCState m, MonadDebug m)+ => ModuleName -> m Args moduleParamsToApply m = do -- Get the correct number of free variables (correctly raised) of @m@. - reportSLn "tc.sig.param" 90 $ "computing module parameters of " ++ show m- cxt <- getContext+ reportSLn "tc.sig.param" 90 $ "computing module parameters of " ++ prettyShow m n <- getModuleFreeVars m tel <- take n . telToList <$> lookupSection m sub <- getModuleParameterSub m- reportSLn "tc.sig.param" 60 $ unlines $- [ " n = " ++ show n- , " cxt = " ++ show (map (fmap fst) cxt)- , " sub = " ++ show sub- ]+ verboseS "tc.sig.param" 60 $ do+ cxt <- getContext+ reportSLn "tc.sig.param" 60 $ unlines $+ [ " n = " ++ show n+ , " cxt = " ++ show (map (fmap fst) cxt)+ , " sub = " ++ show sub+ ] unless (size tel == n) __IMPOSSIBLE__ let args = applySubst sub $ zipWith (\ i a -> var i <$ argFromDom a) (downFrom n) tel reportSLn "tc.sig.param" 60 $ " args = " ++ show args@@ -850,10 +910,26 @@ ctx <- getContext m <- currentModule reportSLn "tc.sig.inst" 30 $- "instDef in " ++ show m ++ ": " ++ show (defName d) ++ " " +++ "instDef in " ++ prettyShow m ++ ": " ++ prettyShow (defName d) ++ " " ++ unwords (map show $ zipWith (<$) (reverse $ map (fst . unDom) ctx) vs) return $ d `apply` vs +instantiateRewriteRule :: (Functor m, HasConstInfo m, HasOptions m,+ ReadTCState m, MonadReader TCEnv m, MonadDebug m)+ => RewriteRule -> m RewriteRule+instantiateRewriteRule rew = do+ traceSLn "rewriting" 60 ("instantiating rewrite rule " ++ show (rewName rew) ++ " to the local context.") $ do+ vs <- freeVarsToApply $ rewName rew+ let rew' = rew `apply` vs+ traceSLn "rewriting" 60 ("instantiated rewrite rule: ") $ do+ traceSLn "rewriting" 60 (show rew') $ do+ return rew'++instantiateRewriteRules :: (Functor m, HasConstInfo m, HasOptions m,+ ReadTCState m, MonadReader TCEnv m, MonadDebug m)+ => RewriteRules -> m RewriteRules+instantiateRewriteRules = mapM instantiateRewriteRule+ -- | Give the abstract view of a definition. makeAbstract :: Definition -> Maybe Definition makeAbstract d =@@ -867,13 +943,16 @@ } where makeAbs Axiom = Just Axiom- makeAbs Datatype {} = Just AbstractDefn- makeAbs Function {} = Just AbstractDefn+ makeAbs d@Datatype {} = Just $ AbstractDefn d+ makeAbs d@Function {} = Just $ AbstractDefn d makeAbs Constructor{} = Nothing -- Andreas, 2012-11-18: Make record constructor and projections abstract.- makeAbs d@Record{} = Just AbstractDefn+ -- Andreas, 2017-08-14: Projections are actually not abstract (issue #2682).+ -- Return the Defn under a wrapper to allow e.g. eligibleForProjectionLike+ -- to see whether the abstract thing is a record type or not.+ makeAbs d@Record{} = Just $ AbstractDefn d makeAbs Primitive{} = __IMPOSSIBLE__- makeAbs AbstractDefn = __IMPOSSIBLE__+ makeAbs AbstractDefn{}= __IMPOSSIBLE__ -- | Enter abstract mode. Abstract definition in the current module are transparent. {-# SPECIALIZE inAbstractMode :: TCM a -> TCM a #-}@@ -942,14 +1021,6 @@ relOfConst :: QName -> TCM Relevance relOfConst q = defRelevance <$> getConstInfo q --- | The name must be a datatype.-sortOfConst :: QName -> TCM Sort-sortOfConst q =- do d <- theDef <$> getConstInfo q- case d of- Datatype{dataSort = s} -> return s- _ -> fail $ "Expected " ++ show q ++ " to be a datatype."- -- | The number of dropped parameters for a definition. -- 0 except for projection(-like) functions and constructors. droppedPars :: Definition -> Int@@ -960,7 +1031,7 @@ Record {recPars = _} -> 0 -- not dropped Constructor{conPars = n} -> n Primitive{} -> 0- AbstractDefn -> __IMPOSSIBLE__+ AbstractDefn{} -> __IMPOSSIBLE__ -- | Is it the name of a record projection? {-# SPECIALIZE isProjection :: QName -> TCM (Maybe Projection) #-}@@ -986,7 +1057,7 @@ -- (projection applied to argument). isProperProjection :: Defn -> Bool isProperProjection d = caseMaybe (isProjection_ d) False $ \ isP ->- if projIndex isP <= 0 then False else projProper isP+ if projIndex isP <= 0 then False else isJust $ projProper isP -- | Number of dropped initial arguments of a projection(-like) function. projectionArgs :: Defn -> Int@@ -1008,5 +1079,5 @@ caseMaybeM (isProjection f) fallback $ \ isP -> do if projIndex isP <= 0 then fallback else do -- Get the original projection, if existing.- if not (projProper isP) then fallback else do+ if isNothing (projProper isP) then fallback else do return $ unArg a `applyE` [Proj o $ projOrig isP]
src/full/Agda/TypeChecking/Monad/SizedTypes.hs view
@@ -14,6 +14,7 @@ import Agda.Syntax.Internal import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.Options import Agda.TypeChecking.Monad.Builtin import Agda.TypeChecking.Monad.State@@ -42,6 +43,12 @@ class IsSizeType a where isSizeType :: a -> TCM (Maybe BoundedSize) +instance IsSizeType a => IsSizeType (Dom a) where+ isSizeType = isSizeType . unDom++instance IsSizeType a => IsSizeType (b,a) where+ isSizeType = isSizeType . snd+ instance IsSizeType a => IsSizeType (Type' a) where isSizeType = isSizeType . unEl @@ -163,6 +170,7 @@ -- | A useful view on sizes. data SizeView = SizeInf | SizeSuc Term | OtherSize Term +-- | Expects argument to be 'reduce'd. sizeView :: Term -> TCM SizeView sizeView v = do Def inf [] <- ignoreSharing <$> primSizeInf
src/full/Agda/TypeChecking/Monad/State.hs view
@@ -8,9 +8,11 @@ import Control.Arrow (first) import Control.Applicative import qualified Control.Exception as E-import Control.Monad.State (put, get, gets, modify)+import Control.Monad.Reader (asks)+import Control.Monad.State (put, get, gets, modify, modify') import Control.Monad.Trans (liftIO) +import Data.Maybe import Data.Map (Map) import qualified Data.Map as Map import Data.Monoid@@ -31,6 +33,8 @@ import Agda.Syntax.Internal import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Warnings+import {-# SOURCE #-} Agda.TypeChecking.Monad.Debug import {-# SOURCE #-} Agda.TypeChecking.Monad.Options import Agda.TypeChecking.Positivity.Occurrence import Agda.TypeChecking.CompiledClause@@ -38,7 +42,7 @@ import Agda.Utils.Hash import qualified Agda.Utils.HashMap as HMap import Agda.Utils.Lens-import Agda.Utils.Monad (bracket_, modify')+import Agda.Utils.Monad (bracket_) import Agda.Utils.Pretty import Agda.Utils.Tuple @@ -54,12 +58,14 @@ -- | Resets all of the type checking state. ----- Keep only 'Benchmark' information.+-- Keep only 'Benchmark' and backend information. resetAllState :: TCM () resetAllState = do b <- getBenchmark+ backends <- use stBackends put $ updatePersistentState (\ s -> s { stBenchmark = b }) initState+ stBackends .= backends -- resetAllState = put initState -- | Restore 'TCState' after performing subcomputation.@@ -85,7 +91,32 @@ modifyBenchmark $ const b return (result, newState) +-- | A fresh TCM instance.+--+-- The computation is run in a fresh state, with the exception that+-- the persistent state is preserved. If the computation changes the+-- state, then these changes are ignored, except for changes to the+-- persistent state. (Changes to the persistent state are also ignored+-- if errors other than type errors or IO exceptions are encountered.) +freshTCM :: TCM a -> TCM (Either TCErr a)+freshTCM m = do+ ps <- use lensPersistentState+ let s = set lensPersistentState ps initState+ r <- liftIO $ (Right <$> runTCM initEnv s m) `E.catch` (return . Left)+ case r of+ Right (a, s) -> do+ lensPersistentState .= s ^. lensPersistentState+ return $ Right a+ Left err -> do+ case err of+ TypeError { tcErrState = s } ->+ lensPersistentState .= s ^. lensPersistentState+ IOException s _ _ ->+ lensPersistentState .= s ^. lensPersistentState+ _ -> return ()+ return $ Left err+ --------------------------------------------------------------------------- -- * Lens for persistent states and its fields ---------------------------------------------------------------------------@@ -162,7 +193,7 @@ printScope :: String -> Int -> String -> TCM () printScope tag v s = verboseS ("scope." ++ tag) v $ do scope <- getScope- reportSDoc ("scope." ++ tag) v $ return $ vcat [ text s, text $ show scope ]+ reportSDoc ("scope." ++ tag) v $ return $ vcat [ text s, pretty scope ] --------------------------------------------------------------------------- -- * Signature@@ -184,8 +215,9 @@ -- module. This function is currently used to update the compiled -- representation of a function during compilation. modifyGlobalDefinition :: QName -> (Definition -> Definition) -> TCM ()-modifyGlobalDefinition q f = modifySignature (updateDefinition q f) >>- modifyImportedSignature (updateDefinition q f)+modifyGlobalDefinition q f = do+ modifySignature $ updateDefinition q f+ modifyImportedSignature $ updateDefinition q f setSignature :: Signature -> TCM () setSignature sig = modifySignature $ const sig@@ -237,6 +269,9 @@ updateDefCompiledRep :: (CompiledRepresentation -> CompiledRepresentation) -> (Definition -> Definition) updateDefCompiledRep f def = def { defCompiledRep = f (defCompiledRep def) } +addCompilerPragma :: BackendName -> CompilerPragma -> Definition -> Definition+addCompilerPragma backend pragma = updateDefCompiledRep $ Map.insertWith (++) backend [pragma]+ updateFunClauses :: ([Clause] -> [Clause]) -> (Defn -> Defn) updateFunClauses f def@Function{ funClauses = cs} = def { funClauses = f cs } updateFunClauses f _ = __IMPOSSIBLE__@@ -245,6 +280,10 @@ updateCompiledClauses f def@Function{ funCompiled = cc} = def { funCompiled = f cc } updateCompiledClauses f _ = __IMPOSSIBLE__ +updateFunCopatternLHS :: (Bool -> Bool) -> Defn -> Defn+updateFunCopatternLHS f def@Function{ funCopatternLHS = b } = def { funCopatternLHS = f b }+updateFunCopatternLHS f _ = __IMPOSSIBLE__+ --------------------------------------------------------------------------- -- * Top level module ---------------------------------------------------------------------------@@ -256,7 +295,7 @@ -- implementation of 'setTopLevelModule' should be changed. setTopLevelModule :: C.QName -> TCM ()-setTopLevelModule x = stFreshNameId .= NameId 0 (hashString (show x))+setTopLevelModule x = stFreshNameId .= NameId 0 (hashString $ prettyShow x) -- | Use a different top-level module for a computation. Used when generating -- names for imported modules.@@ -269,27 +308,41 @@ return y ------------------------------------------------------------------------------ * Haskell imports+-- * Foreign code --------------------------------------------------------------------------- +addForeignCode :: BackendName -> String -> TCM ()+addForeignCode backend code = do+ r <- asks envRange -- can't use TypeChecking.Monad.Trace.getCurrentRange without cycle+ stForeignCode . key backend %= Just . (ForeignCode r code :) . fromMaybe []++---------------------------------------------------------------------------+-- * Temporary: Haskell imports+-- These will go away when we remove the IMPORT and HASKELL pragmas in+-- favour of the FOREIGN pragma.+---------------------------------------------------------------------------++addDeprecatedForeignCode :: String -> BackendName -> String -> TCM ()+addDeprecatedForeignCode old backend code = do+ warning $ DeprecationWarning (unwords ["The", old, "pragma"])+ foreignPragma "2.6"+ addForeignCode backend code+ where+ spc | length (lines code) > 1 = "\n"+ | otherwise = " "+ foreignPragma =+ "{-# FOREIGN " ++ backend ++ spc ++ code ++ spc ++ "#-}"+ -- | Tell the compiler to import the given Haskell module. addHaskellImport :: String -> TCM ()-addHaskellImport i = stHaskellImports %= Set.insert i---- | Get the Haskell imports.-getHaskellImports :: TCM (Set String)-getHaskellImports = use stHaskellImports+addHaskellImport i = addDeprecatedForeignCode "IMPORT" ghcBackendName $ "import qualified " ++ i -- | Tell the compiler to import the given Haskell module. addHaskellImportUHC :: String -> TCM ()-addHaskellImportUHC i = stHaskellImportsUHC %= Set.insert i---- | Get the Haskell imports.-getHaskellImportsUHC :: TCM (Set String)-getHaskellImportsUHC = use stHaskellImportsUHC+addHaskellImportUHC i = addDeprecatedForeignCode "IMPORT_UHC" ghcBackendName $ "__IMPORT__ " ++ i addInlineHaskell :: String -> TCM ()-addInlineHaskell s = stHaskellCode %= (s :)+addInlineHaskell s = addDeprecatedForeignCode "HASKELL" ghcBackendName s --------------------------------------------------------------------------- -- * Interaction output callback@@ -301,7 +354,7 @@ appInteractionOutputCallback :: Response -> TCM () appInteractionOutputCallback r- = getInteractionOutputCallback >>= \ cb -> cb r+ = getInteractionOutputCallback >>= \ cb -> liftIO $ cb r setInteractionOutputCallback :: InteractionOutputCallback -> TCM () setInteractionOutputCallback cb@@ -355,30 +408,6 @@ modifyBenchmark :: (Benchmark -> Benchmark) -> TCM () modifyBenchmark = modify' . updateBenchmark --- | Run a fresh instance of the TCM (with initial state).--- 'Benchmark' info is preserved.-freshTCM :: TCM a -> TCM (Either TCErr a)-freshTCM m = do- -- Prepare an initial state with current benchmark info.- b <- getBenchmark- a <- use lensAccumStatistics- let s = updateBenchmark (const b)- . set lensAccumStatistics a- $ initState- -- Run subcomputation in initial state.- -- If we encounter an exception, we lose the state and the- -- benchmark info.- -- We could retrieve i from a type error, which carries the state,- -- but we do not care for benchmarking in the presence of errors.- r <- liftIO $ (Right <$> runTCM initEnv s m) `E.catch` (return . Left)- case r of- Left err -> return $ Left err- Right (a, s) -> do- -- Keep only the benchmark info from the final state of the subcomp.- modifyBenchmark $ const $ theBenchmark s- lensAccumStatistics .= (s^.lensAccumStatistics)- return $ Right a- --------------------------------------------------------------------------- -- * Instance definitions ---------------------------------------------------------------------------@@ -415,7 +444,9 @@ -- | Add an instance whose type is still unresolved. addUnknownInstance :: QName -> TCM () addUnknownInstance x = do- reportSLn "tc.decl.instance" 10 $ "adding definition " ++ show x ++ " to the instance table (the type is not yet known)"+ reportSLn "tc.decl.instance" 10 $+ "adding definition " ++ prettyShow x +++ " to the instance table (the type is not yet known)" modifyInstanceDefs $ mapSnd $ Set.insert x -- | Add instance to some ``class''.@@ -424,7 +455,8 @@ -> QName -- ^ Name of the class. -> TCM () addNamedInstance x n = do- reportSLn "tc.decl.instance" 10 $ ("adding definition " ++ show x ++ " to instance table for " ++ show n)+ reportSLn "tc.decl.instance" 10 $+ "adding definition " ++ prettyShow x ++ " to instance table for " ++ prettyShow n -- Mark x as instance for n. modifySignature $ updateDefinition x $ \ d -> d { defInstance = Just n } -- Add x to n's instances.
src/full/Agda/TypeChecking/Monad/Statistics.hs view
@@ -11,6 +11,7 @@ import Agda.Syntax.Concrete.Name as C import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.Options import Agda.Utils.Lens
src/full/Agda/TypeChecking/Monad/Trace.hs view
@@ -11,6 +11,7 @@ import Agda.Syntax.Position import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Debug import Agda.TypeChecking.Monad.Options import Agda.Utils.Function@@ -36,12 +37,14 @@ NoHighlighting{} -> False _ -> True -traceCallM :: MonadTCM tcm => tcm Call -> tcm a -> tcm a+traceCallM :: (MonadTCM tcm, MonadDebug tcm) => tcm Call -> tcm a -> tcm a traceCallM mkCall m = flip traceCall m =<< mkCall -- | Record a function call in the trace.-{-# SPECIALIZE traceCall :: Call -> TCM a -> TCM a #-}-traceCall :: MonadTCM tcm => Call -> tcm a -> tcm a++-- RULE left-hand side too complicated to desugar+-- {-# SPECIALIZE traceCall :: Call -> TCM a -> TCM a #-}+traceCall :: (MonadTCM tcm, MonadDebug tcm) => Call -> tcm a -> tcm a traceCall mkCall m = do let call = mkCall callRange = getRange call@@ -107,12 +110,16 @@ isNoHighlighting NoHighlighting{} = True isNoHighlighting _ = False -{-# SPECIALIZE traceCallCPS :: Call -> (r -> TCM a) -> ((r -> TCM a) -> TCM b) -> TCM b #-}-traceCallCPS :: MonadTCM tcm => Call -> (r -> tcm a) -> ((r -> tcm a) -> tcm b) -> tcm b+-- RULE left-hand side too complicated to desugar+-- {-# SPECIALIZE traceCallCPS :: Call -> (r -> TCM a) -> ((r -> TCM a) -> TCM b) -> TCM b #-}+traceCallCPS :: (MonadTCM tcm, MonadDebug tcm)+ => Call -> (r -> tcm a) -> ((r -> tcm a) -> tcm b) -> tcm b traceCallCPS mkCall ret cc = traceCall mkCall (cc ret) -{-# SPECIALIZE traceCallCPS_ :: Call -> TCM a -> (TCM a -> TCM b) -> TCM b #-}-traceCallCPS_ :: MonadTCM tcm => Call -> tcm a -> (tcm a -> tcm b) -> tcm b+-- RULE left-hand side too complicated to desugar+-- {-# SPECIALIZE traceCallCPS_ :: Call -> TCM a -> (TCM a -> TCM b) -> TCM b #-}+traceCallCPS_ :: (MonadTCM tcm, MonadDebug tcm)+ => Call -> tcm a -> (tcm a -> tcm b) -> tcm b traceCallCPS_ mkCall ret cc = traceCallCPS mkCall (const ret) (\k -> cc $ k ())
src/full/Agda/TypeChecking/Patterns/Abstract.hs view
@@ -1,16 +1,17 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE TypeFamilies #-} -- | Tools to manipulate patterns in abstract syntax -- in the TCM (type checking monad). module Agda.TypeChecking.Patterns.Abstract where -import Data.List+import qualified Data.List as List import Data.Traversable hiding (mapM, sequence) import Data.Void import qualified Agda.Syntax.Abstract as A+import Agda.Syntax.Abstract.Pattern import Agda.Syntax.Abstract.Views import Agda.Syntax.Concrete (FieldAssignment') import Agda.Syntax.Common@@ -34,7 +35,7 @@ where expand p = case asView p of (xs, A.LitP (LitNat r n))- | n < 0 -> __IMPOSSIBLE__+ | n < 0 -> negLit -- Andreas, issue #2365, negative literals not yet supported. | n > 20 -> tooBig | otherwise -> do Con z _ _ <- ignoreSharing <$> primZero@@ -43,58 +44,64 @@ suc p = A.ConP cinfo (A.AmbQ [setRange r $ conName s]) [defaultNamedArg p] info = A.PatRange r cinfo = A.ConPatInfo ConOCon info- p' = foldr ($) zero $ genericReplicate n suc+ p' = foldr ($) zero $ List.genericReplicate n suc return $ foldr (A.AsP info) p' xs _ -> return p tooBig = typeError $ GenericError $ "Matching on natural number literals is done by expanding " ++ "the literal to the corresponding constructor pattern, so " ++ "you probably don't want to do it this way."+ negLit = typeError $ GenericError $+ "Negative literals are not supported in patterns" -- | Expand away (deeply) all pattern synonyms in a pattern.-class ExpandPatternSynonyms a where- expandPatternSynonyms :: a -> TCM a -instance ExpandPatternSynonyms a => ExpandPatternSynonyms (Maybe a) where- expandPatternSynonyms = traverse expandPatternSynonyms+-- Unfortunately, the more general type signature+--+-- expandPatternSynonyms :: forall a p . APatternLike a p => p -> TCM p+--+-- is rejected by GHC 7.10+--+-- Could not deduce (APatternLike A.Expr p)+-- arising from a use of ‘postTraverseAPatternM’+--+-- I am mystified (Andreas, 2017-07-27) -instance ExpandPatternSynonyms a => ExpandPatternSynonyms [a] where- expandPatternSynonyms = traverse expandPatternSynonyms+-- expandPatternSynonyms :: forall a p . APatternLike a p => p -> TCM p -instance ExpandPatternSynonyms a => ExpandPatternSynonyms (Arg a) where- expandPatternSynonyms = traverse expandPatternSynonyms+-- As a workaround, we define this function only for a = A.Exp, p = A.Pattern'+-- and keep the type class ExpandPatternSynonyms (which would otherwise be superfluous). -instance ExpandPatternSynonyms a => ExpandPatternSynonyms (Named n a) where+expandPatternSynonyms' :: A.Pattern -> TCM A.Pattern+expandPatternSynonyms' = postTraverseAPatternM $ \case++ A.PatternSynP i x as -> setCurrentRange i $ do+ (ns, p) <- killRange <$> lookupPatternSyn x++ -- Must expand arguments before instantiating otherwise pattern+ -- synonyms could get into dot patterns (which is __IMPOSSIBLE__).+ p :: A.Pattern <- expandPatternSynonyms' (vacuous p :: A.Pattern)++ case A.insertImplicitPatSynArgs (A.WildP . PatRange) (getRange x) ns as of+ Nothing -> typeError $ BadArgumentsToPatternSynonym x+ Just (_, _:_) -> typeError $ TooFewArgumentsToPatternSynonym x+ Just (s, []) -> return $ setRange (getRange i) $ A.substPattern s p++ p -> return p++class ExpandPatternSynonyms a where+ expandPatternSynonyms :: a -> TCM a++ default expandPatternSynonyms+ :: (Traversable f, ExpandPatternSynonyms b, f b ~ a) => a -> TCM a expandPatternSynonyms = traverse expandPatternSynonyms +instance ExpandPatternSynonyms a => ExpandPatternSynonyms (Maybe a) where+instance ExpandPatternSynonyms a => ExpandPatternSynonyms [a] where+instance ExpandPatternSynonyms a => ExpandPatternSynonyms (Arg a) where+instance ExpandPatternSynonyms a => ExpandPatternSynonyms (Named n a) where instance ExpandPatternSynonyms a => ExpandPatternSynonyms (FieldAssignment' a) where- expandPatternSynonyms = traverse expandPatternSynonyms instance ExpandPatternSynonyms A.Pattern where- expandPatternSynonyms p =- case p of- A.VarP{} -> return p- A.WildP{} -> return p- A.DotP{} -> return p- A.LitP{} -> return p- A.AbsurdP{} -> return p- A.ProjP{} -> return p- A.ConP i ds as -> A.ConP i ds <$> expandPatternSynonyms as- A.DefP i q as -> A.DefP i q <$> expandPatternSynonyms as- A.AsP i x p -> A.AsP i x <$> expandPatternSynonyms p- A.RecP i as -> A.RecP i <$> expandPatternSynonyms as- A.PatternSynP i x as -> setCurrentRange i $ do- p <- killRange <$> lookupPatternSyn x- -- Must expand arguments before instantiating otherwise pattern- -- synonyms could get into dot patterns (which is __IMPOSSIBLE__)- instPatternSyn p =<< expandPatternSynonyms as-- where- instPatternSyn :: A.PatternSynDefn -> [NamedArg A.Pattern] -> TCM A.Pattern- instPatternSyn (ns, p) as = do- p <- expandPatternSynonyms (vacuous p)- case A.insertImplicitPatSynArgs (A.WildP . PatRange) (getRange x) ns as of- Nothing -> typeError $ BadArgumentsToPatternSynonym x- Just (_, _:_) -> typeError $ TooFewArgumentsToPatternSynonym x- Just (s, []) -> return $ setRange (getRange i) $ A.substPattern s p+ expandPatternSynonyms = expandPatternSynonyms'
src/full/Agda/TypeChecking/Patterns/Match.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE NondecreasingIndentation #-} -- | Pattern matcher used in the reducer for clauses that@@ -20,7 +19,7 @@ import Agda.TypeChecking.Reduce import Agda.TypeChecking.Reduce.Monad import Agda.TypeChecking.Substitute-import Agda.TypeChecking.Monad hiding (reportSDoc)+import Agda.TypeChecking.Monad import Agda.TypeChecking.Pretty import Agda.TypeChecking.Records import Agda.TypeChecking.Datatypes@@ -142,9 +141,9 @@ , nest 2 $ text "ps =" <+> fsep (punctuate comma $ map (prettyTCM . namedArg) ps) , nest 2 $ text "vs =" <+> fsep (punctuate comma $ map prettyTCM vs) ]) $ do- -- Buggy, see issue 1124:- -- mapFst mconcat . unzip <$> zipWithM' (matchCopattern . namedArg) ps vs- foldMatch (matchCopattern . namedArg) ps vs+ -- Buggy, see issue 1124:+ -- mapFst mconcat . unzip <$> zipWithM' (matchCopattern . namedArg) ps vs+ foldMatch (matchCopattern . namedArg) ps vs -- | Match a single copattern. matchCopattern :: DeBruijnPattern@@ -168,10 +167,10 @@ , nest 2 $ text "ps =" <+> fsep (punctuate comma $ map (text . show) ps) , nest 2 $ text "vs =" <+> fsep (punctuate comma $ map prettyTCM vs) ]) $ do- -- Buggy, see issue 1124:- -- (ms,vs) <- unzip <$> zipWithM' (matchPattern . namedArg) ps vs- -- return (mconcat ms, vs)- foldMatch (matchPattern . namedArg) ps vs+ -- Buggy, see issue 1124:+ -- (ms,vs) <- unzip <$> zipWithM' (matchPattern . namedArg) ps vs+ -- return (mconcat ms, vs)+ foldMatch (matchPattern . namedArg) ps vs -- | Match a single pattern. matchPattern :: DeBruijnPattern@@ -182,6 +181,7 @@ (VarP x , arg ) -> return (Yes NoSimplification entry, arg) where entry = singleton (dbPatVarIndex x, arg) (DotP _ , arg@(Arg _ v)) -> return (Yes NoSimplification empty, arg)+ (AbsurdP _ , arg@(Arg _ v)) -> return (Yes NoSimplification empty, arg) (LitP l , arg@(Arg _ v)) -> do w <- reduceB' v let arg' = arg $> ignoreBlocking w
src/full/Agda/TypeChecking/Polarity.hs view
@@ -5,7 +5,6 @@ import Control.Applicative import Control.Monad.State -import Data.List import Data.Maybe import Data.Traversable (traverse) @@ -16,6 +15,7 @@ import Agda.TypeChecking.Monad import Agda.TypeChecking.Pretty+import Agda.TypeChecking.SizedTypes import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope import Agda.TypeChecking.Reduce@@ -28,6 +28,7 @@ import Agda.Utils.Maybe ( whenNothingM ) import Agda.Utils.Monad import Agda.Utils.Permutation+import Agda.Utils.Pretty ( prettyShow ) import Agda.Utils.Size #include "undefined.h"@@ -84,31 +85,53 @@ purgeNonvariant :: [Polarity] -> [Polarity] purgeNonvariant = map (\ p -> if p == Nonvariant then Covariant else p) ++-- | A quick transliterations of occurrences to polarities.+polarityFromPositivity :: QName -> TCM ()+polarityFromPositivity x = inConcreteOrAbstractMode x $ \ def -> do++ -- Get basic polarity from positivity analysis.+ let npars = droppedPars def+ let pol0 = replicate npars Nonvariant ++ map polFromOcc (defArgOccurrences def)+ reportSLn "tc.polarity.set" 15 $+ "Polarity of " ++ prettyShow x ++ " from positivity: " ++ prettyShow pol0++ -- set the polarity in the signature (not the final polarity, though)+ setPolarity x $ drop npars pol0+ ------------------------------------------------------------------------ -- * Computing the polarity of a symbol. ------------------------------------------------------------------------ -- | Main function of this module.-computePolarity :: QName -> TCM ()-computePolarity x = inConcreteOrAbstractMode x $ \ def -> do- reportSLn "tc.polarity.set" 25 $ "Computing polarity of " ++ show x+computePolarity :: [QName] -> TCM ()+computePolarity xs = do - -- get basic polarity from positivity analysis+ -- Andreas, 2017-04-26, issue #2554+ -- First, for mutual definitions, obtain a crude polarity from positivity.+ when (length xs >= 2) $ mapM_ polarityFromPositivity xs++ -- Then, refine it.+ forM_ xs $ \ x -> inConcreteOrAbstractMode x $ \ def -> do+ reportSLn "tc.polarity.set" 25 $ "Refining polarity of " ++ prettyShow x++ -- Again: get basic polarity from positivity analysis. let npars = droppedPars def let pol0 = replicate npars Nonvariant ++ map polFromOcc (defArgOccurrences def)- reportSLn "tc.polarity.set" 15 $ "Polarity of " ++ show x ++ " from positivity: " ++ show pol0+ reportSLn "tc.polarity.set" 15 $+ "Polarity of " ++ prettyShow x ++ " from positivity: " ++ prettyShow pol0 {- -- get basic polarity from shape of def (arguments matched on or not?) def <- getConstInfo x let usagePol = usagePolarity $ theDef def- reportSLn "tc.polarity.set" 15 $ "Polarity of " ++ show x ++ " from definition form: " ++ show usagePol+ reportSLn "tc.polarity.set" 15 $ "Polarity of " ++ prettyShow x ++ " from definition form: " ++ prettyShow usagePol let n = genericLength usagePol -- n <- getArity x reportSLn "tc.polarity.set" 20 $ " arity = " ++ show n -- refine polarity by positivity information pol0 <- zipWith (/\) usagePol <$> mapM getPol [0..n - 1]- reportSLn "tc.polarity.set" 15 $ "Polarity of " ++ show x ++ " from positivity: " ++ show pol0+ reportSLn "tc.polarity.set" 15 $ "Polarity of " ++ prettyShow x ++ " from positivity: " ++ prettyShow pol0 -} -- compute polarity of sized types@@ -119,29 +142,17 @@ -- Instantiation takes place in Rules.Decl.instantiateDefinitionType -- t <- instantiateFull t -- Andreas, 2014-04-11 Issue 1099: needed for -- -- variable occurrence test in dependentPolarity.- reportSDoc "tc.polarity.set" 15 $ text "Refining polarity with type " <+> prettyTCM t+ reportSDoc "tc.polarity.set" 15 $+ text "Refining polarity with type " <+> prettyTCM t+ reportSDoc "tc.polarity.set" 60 $+ text "Refining polarity with type (raw): " <+> (text .show) t+ pol <- dependentPolarity t (enablePhantomTypes (theDef def) pol1) pol1- reportSLn "tc.polarity.set" 10 $ "Polarity of " ++ show x ++ ": " ++ show pol+ reportSLn "tc.polarity.set" 10 $ "Polarity of " ++ prettyShow x ++ ": " ++ prettyShow pol -- set the polarity in the signature setPolarity x $ drop npars pol -- purgeNonvariant pol -- temporarily disable non-variance - -- make 'Nonvariant' args 'UnusedArg' in type and clause telescope- -- Andreas 2012-11-18: skip this for abstract definitions (fixing issue 755).- -- This means that the most precise type for abstract definitions- -- is not available, even to other abstract definitions.- -- A proper fix would be to introduce a second type for use within abstract.- --- -- Andreas, 2015-07-01: I thought one should do this for- -- abstract local definitions in @where@ blocks to fix Issue 1366b,- --but it is not necessary.- -- t <- if (defAbstract def == AbstractDef) && not (isAnonymousModuleName $ qnameModule x)- t <- if (defAbstract def == AbstractDef)- then return t- else nonvariantToUnusedArg pol t- modifySignature $ updateDefinition x $- updateTheDef (nonvariantToUnusedArgInDef pol) . updateDefType (const t)- -- | Data and record parameters are used as phantom arguments all over -- the test suite (and possibly in user developments). -- @enablePhantomTypes@ turns 'Nonvariant' parameters to 'Covariant'@@ -151,7 +162,7 @@ Datatype{ dataPars = np } -> enable np Record { recPars = np } -> enable np _ -> pol- where enable np = let (pars, rest) = genericSplitAt np pol+ where enable np = let (pars, rest) = splitAt np pol in purgeNonvariant pars ++ rest {- UNUSED@@ -186,20 +197,21 @@ dependentPolarity t [] (_ : _) = __IMPOSSIBLE__ dependentPolarity t (q:qs) pols@(p:ps) = do t <- reduce $ unEl t+ reportSDoc "tc.polarity.dep" 20 $ text "dependentPolarity t = " <+> prettyTCM t+ reportSDoc "tc.polarity.dep" 70 $ text "dependentPolarity t = " <+> (text . show) t case ignoreSharing t of Pi dom b -> do- let c = absBody b- ps <- dependentPolarity c qs ps- let mp = ifM (isJust <$> isSizeType (unDom dom)) (return p) (return q)- p <- case b of- Abs{} | p /= Invariant ->- -- Andreas, 2014-04-11 see Issue 1099- -- Free variable analysis is not in the monad,- -- hence metas must have been instantiated before!- ifM (relevantInIgnoringNonvariant 0 c ps)- (return Invariant)- mp- _ -> mp+ ps <- underAbstraction dom b $ \ c -> dependentPolarity c qs ps+ let fallback = ifM (isJust <$> isSizeType (unDom dom)) (return p) (return q)+ p <- case b of+ Abs{} | p /= Invariant ->+ -- Andreas, 2014-04-11 see Issue 1099+ -- Free variable analysis is not in the monad,+ -- hence metas must have been instantiated before!+ ifM (relevantInIgnoringNonvariant 0 (absBody b) ps)+ {- then -} (return Invariant)+ {- else -} fallback+ _ -> fallback return $ p : ps _ -> return pols @@ -214,55 +226,6 @@ else relevantInIgnoringNonvariant (i + 1) (absBody b) ps _ -> return $ i `relevantInIgnoringSortAnn` t --- * Turn polarity 'Nonvariant' into relevance 'UnusedArg'---- | Record information that an argument is unused in 'Relevance'.-mkUnused :: Relevance -> Relevance-mkUnused Relevant = UnusedArg -- commenting out this line switches off 'UnusedArg' polarity machinery-mkUnused r = r -- 'Irrelevant' is more informative than 'UnusedArg'.---- | Improve 'Relevance' information in a type by polarity information.--- 'Nonvariant' becomes 'UnusedArg'.-nonvariantToUnusedArg :: [Polarity] -> Type -> TCM Type-nonvariantToUnusedArg [] t = return t-nonvariantToUnusedArg (p:ps) t = do- t <- reduce t- case ignoreSharingType t of- El s (Pi a b) -> do- let a' = if p == Nonvariant then mapRelevance mkUnused a else a- El s . Pi a' <$> traverse (nonvariantToUnusedArg ps) b- -- we do not lift properly but bound variables do not matter for reduce- -- also, we do not maintain the context- _ -> return t---- | Propagate 'Nonvariant' 'Polarity' to 'Relevance' information in--- 'Arg's of a defined symbol.-nonvariantToUnusedArgInDef :: [Polarity] -> Defn -> Defn-nonvariantToUnusedArgInDef pol def = case def of- Function { funClauses = cl } ->- def { funClauses = map (nonvariantToUnusedArgInClause pol) cl }- _ -> def--nonvariantToUnusedArgInClause :: [Polarity] -> Clause -> Clause-nonvariantToUnusedArgInClause pol cl@Clause{clauseTel = tel, namedClausePats = ps} =- let adjPat p Nonvariant- | properlyMatching (namedArg p) = __IMPOSSIBLE__ -- if we match, we cannot be Nonvariant (sanity check)- | otherwise = mapRelevance mkUnused p- adjPat p _ = p- -- change relevance of 'Nonvariant' arguments to 'UnusedArg'- -- note that the associated patterns cannot be 'ConP' or 'LitP'- ps' = zipWith adjPat ps (pol ++ repeat Invariant)- -- get a list of 'Relevance's for the variables bound in the pattern- rels0 = getRelevance <$> (concatMap (patternVars . fmap namedThing) ps')- -- this is the order the variables appear in the telescope- perm = fromMaybe __IMPOSSIBLE__ $ clausePerm cl- rels = permute perm rels0- -- now improve 'Relevance' in 'Telescope' by pattern relevance- updateDom UnusedArg = mapRelevance mkUnused- updateDom r = id- tel' = telFromList $ zipWith updateDom rels $ telToList tel- in cl { namedClausePats = ps', clauseTel = tel'}- ------------------------------------------------------------------------ -- * Sized types ------------------------------------------------------------------------@@ -278,12 +241,12 @@ case theDef def of Datatype{ dataPars = np, dataCons = cons } -> do let TelV tel _ = telView' $ defType def- (parTel, ixTel) = genericSplitAt np $ telToList tel+ (parTel, ixTel) = splitAt np $ telToList tel case ixTel of [] -> exit -- No size index Dom _ (_, a) : _ -> ifM ((/= Just BoundedNo) <$> isSizeType a) exit $ do -- we assume the size index to be 'Covariant' ...- let pol = genericTake np pol0+ let pol = take np pol0 polCo = pol ++ [Covariant] polIn = pol ++ [Invariant] setPolarity d $ polCo@@ -303,7 +266,7 @@ let isPos = underAbstraction arg tel $ \ tel -> do pols <- zipWithM polarity [0..] $ map (snd . unDom) $ telToList tel reportSDoc "tc.polarity.size" 25 $- text $ "to pass size polarity check, the following polarities need all to be covariant: " ++ show pols+ text $ "to pass size polarity check, the following polarities need all to be covariant: " ++ prettyShow pols return $ all (`elem` [Nonvariant, Covariant]) pols -- check that the size argument appears in the@@ -329,25 +292,26 @@ _ -> exit -- | @checkSizeIndex d np i a@ checks that constructor target type @a@--- has form @d ps (↑ i) idxs@ where @|ps| = np@.+-- has form @d ps (↑ⁿ i) idxs@ where @|ps| = np@. -- -- Precondition: @a@ is reduced and of form @d ps idxs0@. checkSizeIndex :: QName -> Nat -> Nat -> Type -> TCM Bool checkSizeIndex d np i a = do- reportSDoc "tc.polarity.size" 15 $ withShowAllArguments $- text "checking that constructor target type " <+> prettyTCM a <+>- text "is data type " <+> prettyTCM d <+>- text "has size index successor of " <+> prettyTCM (var i)+ reportSDoc "tc.polarity.size" 15 $ withShowAllArguments $ vcat+ [ text "checking that constructor target type " <+> prettyTCM a+ , text " is data type " <+> prettyTCM d+ , text " and has size index (successor(s) of) " <+> prettyTCM (var i)+ ] case ignoreSharing $ unEl a of Def d0 es -> do whenNothingM (sameDef d d0) __IMPOSSIBLE__- s <- sizeView $ unArg ix+ s <- deepSizeView $ unArg ix case s of- SizeSuc v | Var j [] <- ignoreSharing v, i == j+ DSizeVar j _ | i == j -> return $ not $ freeIn i (pars ++ ixs) _ -> return False where- (pars, Apply ix : ixs) = genericSplitAt np es+ (pars, Apply ix : ixs) = splitAt np es _ -> __IMPOSSIBLE__ -- | @polarities i a@ computes the list of polarities of de Bruijn index @i@
src/full/Agda/TypeChecking/Polarity.hs-boot view
@@ -4,5 +4,5 @@ import Agda.Syntax.Internal import Agda.TypeChecking.Monad.Base -computePolarity :: QName -> TCM ()+computePolarity :: [QName] -> TCM () composePol :: Polarity -> Polarity -> Polarity
src/full/Agda/TypeChecking/Positivity.hs view
@@ -18,7 +18,7 @@ import Data.Graph (SCC(..), flattenSCC) import Data.IntMap (IntMap) import qualified Data.IntMap as IntMap-import Data.List as List hiding (null)+import qualified Data.List as List import Data.Map (Map) import qualified Data.Map as Map import Data.Monoid (mconcat)@@ -30,26 +30,31 @@ import Agda.Syntax.Common import qualified Agda.Syntax.Info as Info-import Agda.Syntax.Position (fuseRange, Range, HasRange(..), noRange) import Agda.Syntax.Internal import Agda.Syntax.Internal.Pattern-import Agda.TypeChecking.Datatypes (isDataOrRecordType, DataOrRecord(..))-import Agda.TypeChecking.Records+import Agda.Syntax.Position (fuseRange, Range, HasRange(..), noRange)+import Agda.TypeChecking.Datatypes ( isDataOrRecordType )+import Agda.TypeChecking.Functions import Agda.TypeChecking.Monad import Agda.TypeChecking.Monad.Builtin (primInf, CoinductionKit(..), coinductionKit)-import Agda.TypeChecking.Reduce import Agda.TypeChecking.Positivity.Occurrence import Agda.TypeChecking.Pretty+import Agda.TypeChecking.Records+import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope+import Agda.TypeChecking.Warnings import qualified Agda.Utils.Graph.AdjacencyMap.Unidirectional as Graph+import Agda.Utils.Function (applyUnless) import Agda.Utils.Functor import Agda.Utils.List import Agda.Utils.Maybe import Agda.Utils.Monad import Agda.Utils.Null import qualified Agda.Utils.Permutation as Perm+import qualified Agda.Utils.Pretty as P+import Agda.Utils.Pretty (Pretty, prettyShow) import Agda.Utils.SemiRing import Agda.Utils.Singleton import Agda.Utils.Size@@ -70,7 +75,7 @@ let qs = Set.toList qset reportSDoc "tc.pos.tick" 100 $ text "positivity of" <+> prettyTCM qs g <- buildOccurrenceGraph qset- let (gstar, sccs') =+ let (gstar, sccs) = Graph.gaussJordanFloydWarshallMcNaughtonYamada $ fmap occ g reportSDoc "tc.pos.tick" 100 $ text "constructed graph" reportSLn "tc.pos.graph" 5 $ "Positivity graph: N=" ++ show (size $ Graph.nodes g) ++@@ -92,18 +97,27 @@ reportSDoc "tc.pos.tick" 100 $ text "set args" -- check positivity for all strongly connected components of the graph for qs- let sccs = map flattenSCC sccs' reportSDoc "tc.pos.graph.sccs" 10 $ do- let (triv, others) = partitionEithers $ for sccs' $ \ scc -> case scc of+ let (triv, others) = partitionEithers $ for sccs $ \case AcyclicSCC v -> Left v CyclicSCC vs -> Right vs sep [ text $ show (length triv) ++ " trivial sccs" , text $ show (length others) ++ " non-trivial sccs with lengths " ++ show (map length others) ]- reportSDoc "tc.pos.graph.sccs" 15 $ text $ " sccs = " ++ show sccs- forM_ sccs $ \ scc -> setMut [ q | DefNode q <- scc ]- mapM_ (checkPos g gstar) $ qs+ reportSLn "tc.pos.graph.sccs" 15 $+ " sccs = " ++ prettyShow [ scc | CyclicSCC scc <- sccs ]+ forM_ sccs $ \case+ -- If the mutuality information has never been set, we set it to []+ AcyclicSCC (DefNode q) -> whenM (isNothing <$> getMutual q) $ do+ reportSLn "tc.pos.mutual" 10 $ "setting " ++ prettyShow q ++ " to non-recursive"+ -- Andreas, 2017-04-26, issue #2555+ -- We should not have @DefNode@s pointing outside our formal mutual block.+ unless (Set.member q qset) __IMPOSSIBLE__+ setMutual q []+ AcyclicSCC (ArgNode{}) -> return ()+ CyclicSCC scc -> setMut [ q | DefNode q <- scc ]+ mapM_ (checkPos g gstar) qs reportSDoc "tc.pos.tick" 100 $ text "checked positivity" where@@ -195,12 +209,12 @@ -- Set the mutually recursive identifiers for a SCC. setMut :: [QName] -> TCM ()- setMut [] = return () -- nothing to do- setMut [q] = return () -- no mutual recursion- setMut qs = forM_ qs $ \ q -> setMutual q (delete q qs)- -- TODO: The previous line is at least quadratic in the length- -- of qs (assuming that the expression "delete q qs" is always- -- forced, for instance due to serialisation). Presumably qs is+ setMut [] = return () -- nothing to do+ setMut qs = forM_ qs $ \ q -> do+ reportSLn "tc.pos.mutual" 10 $ "setting " ++ prettyShow q ++ " to (mutually) recursive"+ setMutual q qs+ -- TODO: The previous line produces data of quadratic size+ -- (which has to be processed upon serialization). Presumably qs is -- usually short, but in some cases (for instance for generated -- code) it may be long. Wouldn't it be better to assign a -- unique identifier to each SCC, and avoid storing lists?@@ -221,7 +235,7 @@ map findOcc [0 .. max m (n - 1)] reportSDoc "tc.pos.args" 10 $ sep [ text "args of" <+> prettyTCM q <+> text "="- , nest 2 $ prettyList $ map (text . show) args+ , nest 2 $ prettyList $ map prettyTCM args ] -- The list args can take a long time to compute, but contains -- small elements, and is stored in the interface (right?), so@@ -258,7 +272,7 @@ nth n = pwords $ show (n + 1) ++ "th" -- remove consecutive duplicates- uniq = map head . group+ uniq = map head . List.group prettyOs [] = __IMPOSSIBLE__ prettyOs [o] = prettyO o <> text "."@@ -564,63 +578,44 @@ <+> prettyTCM cur OccursAs (InDefOf q) <$> case theDef def of Function{funClauses = cs} -> do- n <- getDefArity def- cs <- map (etaExpandClause n) <$> instantiateFull cs+ cs <- mapM etaExpandClause =<< instantiateFull cs Concat . zipWith (OccursAs . InClause) [0..] <$> mapM (getOccurrences []) cs Datatype{dataClause = Just c} -> getOccurrences [] =<< instantiateFull c- Datatype{dataPars = np, dataCons = cs} -> do+ Datatype{dataPars = np0, dataCons = cs} -> do -- Andreas, 2013-02-27: first, each data index occurs as matched on. TelV tel t <- telView $ defType def- let xs = [np .. size tel - 1] -- argument positions corresponding to indices- ioccs = Concat $ map (OccursAs Matched . OccursHere . AnArg) xs+ -- Andreas, 2017-04-26, issue #2554: count first index as parameter if it has type Size.+ -- We compute sizeIndex=1 if first first index has type Size, otherwise sizeIndex==0+ sizeIndex <- caseMaybe (headMaybe $ drop np0 $ telToList tel) (return 0) $ \ dom -> do+ caseMaybeM (isSizeType dom) (return 0) $ \ _ -> return 1+ let np = np0 + sizeIndex+ let xs = [np .. size tel - 1] -- argument positions corresponding to indices+ ioccs = Concat $ map (OccursHere . AnArg) [np0 .. np - 1]+ ++ map (OccursAs Matched . OccursHere . AnArg) xs -- Then, we compute the occurrences in the constructor types. let conOcc c = do a <- defType <$> getConstInfo c TelV tel t <- telView' <$> normalise a -- normalization needed e.g. for test/succeed/Bush.agda let indices = case unEl t of- Def _ vs -> genericDrop np vs+ Def _ vs -> drop np vs _ -> __IMPOSSIBLE__- let tel' = telFromList $ genericDrop np $ telToList tel+ let tel' = telFromList $ drop np $ telToList tel vars np = map (Just . AnArg) $ downFrom np (>+<) <$> (OccursAs (ConArgType c) <$> getOccurrences (vars np) tel') <*> (OccursAs (IndArgType c) . OnlyVarsUpTo np <$> getOccurrences (vars $ size tel) indices) (>+<) ioccs <$> (Concat <$> mapM conOcc cs) Record{recClause = Just c} -> getOccurrences [] =<< instantiateFull c Record{recPars = np, recTel = tel} -> do- let tel' = telFromList $ genericDrop np $ telToList tel+ let tel' = telFromList $ drop np $ telToList tel vars = map (Just . AnArg) $ downFrom np- getOccurrences vars =<< instantiateFull tel'+ getOccurrences vars =<< normalise tel' -- Andreas, 2017-01-01, issue #1899, treat like data types -- Arguments to other kinds of definitions are hard-wired. Constructor{} -> return emptyOB Axiom{} -> return emptyOB Primitive{} -> return emptyOB- AbstractDefn -> __IMPOSSIBLE__---- | Eta expand a clause to have the given number of variables.--- Warning: doesn't put correct types in telescope!--- This is used instead of special treatment of lambdas--- (which was unsound: issue 121)-etaExpandClause :: Nat -> Clause -> Clause-etaExpandClause n c- | m <= 0 = c- | otherwise = c- { namedClausePats = raise m (namedClausePats c) ++- map (\i -> defaultArg $ namedDBVarP i underscore) (downFrom m)- , clauseBody = liftBody m $ clauseBody c- , clauseTel = telFromList $- telToList (clauseTel c) ++ (replicate m $ (underscore,) <$> dummyDom)- -- dummyDom, not __IMPOSSIBLE__, because of debug printing.- }- where- m = n - genericLength (namedClausePats c)-- vars = map (defaultArg . var) $ downFrom m--- vars = reverse [ defaultArg $ var i | i <- [0..m - 1] ]-- liftBody m (Just v) = Just $ raise m v `apply` vars- liftBody m Nothing = Nothing+ AbstractDefn{}-> __IMPOSSIBLE__ -- Building the occurrence graph ------------------------------------------ @@ -628,17 +623,19 @@ | ArgNode !QName !Nat deriving (Eq, Ord) -instance Show Node where- show (DefNode q) = show q- show (ArgNode q i) = show q ++ "." ++ show i+instance Pretty Node where+ pretty = \case+ DefNode q -> P.pretty q+ ArgNode q i -> P.pretty q P.<> P.text ("." ++ show i) instance PrettyTCM Node where- prettyTCM (DefNode q) = prettyTCM q- prettyTCM (ArgNode q i) = prettyTCM q <> text ("." ++ show i)+ prettyTCM = return . P.pretty instance PrettyTCM n => PrettyTCM (WithNode n Edge) where- prettyTCM (WithNode n (Edge o w)) =- prettyTCM o <+> prettyTCM n <+> fsep (pwords $ show w)+ prettyTCM (WithNode n (Edge o w)) = vcat+ [ prettyTCM o <+> prettyTCM n+ , nest 2 $ return $ P.pretty w+ ] -- | Edge labels for the positivity graph. data Edge = Edge !Occurrence OccursWhere@@ -698,7 +695,7 @@ text (show i) <> text ":" <+> text (show n) <+> text "occurrences, of total size" <+> text (show s)) $- sortBy (compare `on` fst . snd) $+ List.sortBy (compare `on` fst . snd) $ map (\(i, os) -> (i, (length os, sum $ map size os))) $ Map.toList (flatten occs)) reportSDoc "tc.pos.occs" 50 $@@ -706,7 +703,7 @@ map (\(i, os) -> (text (show i) <> text ":") $+$- (nest 2 $ vcat $ map (text . show) os))+ (nest 2 $ vcat $ map (return . P.pretty) os)) (Map.toList (flatten occs))) -- Placing this line before the reportSDoc lines above creates a@@ -720,8 +717,8 @@ map (\e -> let Edge o w = Graph.label e in prettyTCM (Graph.source e) <+>- text "-[" <+> text (show o) <> text "," <+>- text (show w) <+> text "]->" <+>+ text "-[" <+> return (P.pretty o) <> text "," <+>+ return (P.pretty w) <+> text "]->" <+> prettyTCM (Graph.target e)) es) @@ -762,16 +759,20 @@ [ mkEdge to pol ob | ob <- obs ] OccursAs' w ob -> do (to, pol) <- mkEdge' to pol w mkEdge to pol ob- OccursHere' i o -> return $- if null pol- then id- else (Graph.Edge- { Graph.source = case i of- AnArg i -> ArgNode q i- ADef q -> DefNode q- , Graph.target = to- , Graph.label = Edge pol o- } :)+ OccursHere' (AnArg i) o ->+ return $ applyUnless (null pol) (Graph.Edge+ { Graph.source = ArgNode q i+ , Graph.target = to+ , Graph.label = Edge pol o+ } :)+ OccursHere' (ADef q') o ->+ -- Andreas, 2017-04-26, issue #2555+ -- Skip nodes pointing outside the mutual block.+ return $ applyUnless (null pol || Set.notMember q' muts) (Graph.Edge+ { Graph.source = DefNode q'+ , Graph.target = to+ , Graph.label = Edge pol o+ } :) mkEdge' to !pol w = case w of VarArg -> mixed
src/full/Agda/TypeChecking/Positivity/Occurrence.hs view
@@ -15,20 +15,26 @@ import Control.Applicative import Control.DeepSeq import Control.Monad++import Data.Data (Data) import Data.Either+import Data.Foldable (toList) import Data.Maybe-import Data.Typeable (Typeable) import Data.Map.Strict (Map) import qualified Data.Map.Strict as Map-import qualified Data.Sequence as DS+import Data.Sequence (Seq)+import qualified Data.Sequence as Seq+import Data.Typeable (Typeable) import Agda.Syntax.Common import Agda.Syntax.Abstract.Name import Agda.Syntax.Position+ import Agda.Utils.Graph.AdjacencyMap.Unidirectional (Graph) import qualified Agda.Utils.Graph.AdjacencyMap.Unidirectional as Graph import Agda.Utils.List import Agda.Utils.Null+import Agda.Utils.Pretty import Agda.Utils.SemiRing #include "undefined.h"@@ -42,10 +48,10 @@ data OccursWhere = Unknown -- ^ an unknown position (treated as negative)- | Known Range (DS.Seq Where)+ | Known Range (Seq Where) -- ^ The elements of the sequence, from left to right, explain how -- to get to the occurrence.- deriving (Show, Eq, Ord)+ deriving (Show, Eq, Ord, Typeable, Data) -- | One part of the description of an occurrence. data Where@@ -59,7 +65,7 @@ | InClause Nat -- ^ in the nth clause of a defined function | Matched -- ^ matched against in a clause of a defined function | InDefOf QName -- ^ in the definition of a constant- deriving (Show, Eq, Ord)+ deriving (Show, Eq, Ord, Typeable, Data) -- | Subterm occurrences for positivity checking. -- The constructors are listed in increasing information they provide:@@ -72,8 +78,39 @@ | StrictPos -- ^ Strictly positive occurrence. | GuardPos -- ^ Guarded strictly positive occurrence (i.e., under ∞). For checking recursive records. | Unused -- ^ No occurrence.- deriving (Typeable, Show, Eq, Ord, Enum, Bounded)+ deriving (Typeable, Data, Show, Eq, Ord, Enum, Bounded) +-- * Pretty instances++instance Pretty Occurrence where+ pretty = text . \case+ Unused -> "_"+ Mixed -> "*"+ JustNeg -> "-"+ JustPos -> "+"+ StrictPos -> "++"+ GuardPos -> "g+"++instance Pretty Where where+ pretty = \case+ LeftOfArrow -> text "LeftOfArrow"+ DefArg q i -> text "DefArg" <+> pretty q <+> pretty i+ UnderInf -> text "UnderInf"+ VarArg -> text "VarArg"+ MetaArg -> text "MetaArg"+ ConArgType q -> text "ConArgType" <+> pretty q+ IndArgType q -> text "IndArgType" <+> pretty q+ InClause i -> text "InClause" <+> pretty i+ Matched -> text "Matched"+ InDefOf q -> text "InDefOf" <+> pretty q++instance Pretty OccursWhere where+ pretty = \case+ Unknown -> text "Unknown"+ Known _r ws -> text "Known _" <+> pretty (toList ws)++-- * Instances for 'Occurrence'+ instance NFData Occurrence where rnf x = seq x () instance KillRange Occurrence where@@ -129,7 +166,7 @@ instance Null Occurrence where empty = Unused --- | The map contains bindings of the form @bound |-> es@, satisfying+-- | The map contains bindings of the form @bound |-> ess@, satisfying -- the following property: for every non-empty list @w@, -- @'foldr1' 'otimes' w '<=' bound@ iff -- @'or' [ 'all' every w '&&' 'any' some w | (every, some) <- ess ]@.
src/full/Agda/TypeChecking/Pretty.hs view
@@ -7,11 +7,11 @@ #if __GLASGOW_HASKELL__ >= 800 {-# OPTIONS_GHC -Wno-semigroup #-} #endif+ #if __GLASGOW_HASKELL__ <= 708 {-# LANGUAGE OverlappingInstances #-} #endif - module Agda.TypeChecking.Pretty where import Prelude hiding (null)@@ -21,6 +21,8 @@ import Data.Map (Map) import qualified Data.Map as Map+import Data.Set (Set)+import qualified Data.Set as Set import Data.Maybe import Agda.Syntax.Position@@ -50,6 +52,7 @@ import Agda.Utils.Maybe import Agda.Utils.Null import Agda.Utils.Permutation (Permutation)+import Agda.Utils.Pretty (Pretty, prettyShow) import qualified Agda.Utils.Pretty as P #include "undefined.h"@@ -97,11 +100,15 @@ hang :: TCM Doc -> Int -> TCM Doc -> TCM Doc hang p n q = P.hang <$> p <*> pure n <*> q -($$), ($+$), (<>), (<+>) :: TCM Doc -> TCM Doc -> TCM Doc+infixl 6 <>, <+>, <?>+infixl 5 $$, $+$++($$), ($+$), (<>), (<+>), (<?>) :: TCM Doc -> TCM Doc -> TCM Doc d1 $$ d2 = (P.$$) <$> d1 <*> d2 d1 $+$ d2 = (P.$+$) <$> d1 <*> d2 d1 <> d2 = (P.<>) <$> d1 <*> d2 d1 <+> d2 = (P.<+>) <$> d1 <*> d2+d1 <?> d2 = (P.<?>) <$> d1 <*> d2 nest :: Int -> TCM Doc -> TCM Doc nest n d = P.nest n <$> d@@ -112,9 +119,12 @@ brackets d = P.brackets <$> d parens d = P.parens <$> d +pshow :: Show a => a -> TCM Doc+pshow = pure . P.pshow+ -- | Comma-separated list in brackets. prettyList :: [TCM Doc] -> TCM Doc-prettyList ds = brackets $ fsep $ punctuate comma ds+prettyList ds = P.pretty <$> sequence ds -- | 'prettyList' without the brackets. prettyList_ :: [TCM Doc] -> TCM Doc@@ -147,11 +157,7 @@ instance PrettyTCM a => PrettyTCM (Closure a) where prettyTCM cl = enterClosure cl prettyTCM -#if __GLASGOW_HASKELL__ >= 710-instance {-# OVERLAPPABLE #-} PrettyTCM a => PrettyTCM [a] where-#else instance PrettyTCM a => PrettyTCM [a] where-#endif prettyTCM = prettyList . map prettyTCM instance (PrettyTCM a, PrettyTCM b) => PrettyTCM (a,b) where@@ -172,10 +178,10 @@ instance PrettyTCM Polarity where prettyTCM = text . show instance PrettyTCM R.Term where prettyTCM = prettyA <=< toAbstractWithoutImplicit -instance (Show a, PrettyTCM a, Subst a a) => PrettyTCM (Substitution' a) where+instance (Pretty a, PrettyTCM a, Subst a a) => PrettyTCM (Substitution' a) where prettyTCM IdS = text "idS" prettyTCM (Wk m IdS) = text "wkS" <+> pretty m- prettyTCM EmptyS = text "emptyS"+ prettyTCM (EmptyS _) = text "emptyS" prettyTCM rho = prettyTCM u <+> comma <+> prettyTCM rho1 where (rho1, rho2) = splitS 1 rho@@ -199,7 +205,7 @@ pretty $ NamedMeta mn x instance PrettyTCM a => PrettyTCM (Blocked a) where- prettyTCM (Blocked x a) = text "[" <+> prettyTCM a <+> text "]" <> text (show x)+ prettyTCM (Blocked x a) = text "[" <+> prettyTCM a <+> text "]" <> text (P.prettyShow x) prettyTCM (NotBlocked _ x) = prettyTCM x instance (Reify a e, ToConcrete e c, P.Pretty c) => PrettyTCM (Named_ a) where@@ -220,7 +226,7 @@ #else instance PrettyTCM ArgName where #endif- prettyTCM = text . show+ prettyTCM = text . P.prettyShow -- instance (Reify a e, ToConcrete e c, P.Pretty c, PrettyTCM a) => PrettyTCM (Elim' a) where instance PrettyTCM Elim where@@ -244,11 +250,11 @@ prettyTCM NonStrict = text ".." prettyTCM Relevant = empty prettyTCM Forced{} = empty- prettyTCM UnusedArg = empty instance PrettyTCM ProblemConstraint where- prettyTCM (PConstr [] c) = prettyTCM c- prettyTCM (PConstr pids c) = prettyList (map prettyTCM pids) <+> prettyTCM c+ prettyTCM (PConstr pids c)+ | Set.null pids = prettyTCM c+ | otherwise = prettyList (map prettyTCM $ Set.toList pids) <+> prettyTCM c instance PrettyTCM Constraint where prettyTCM c = case c of@@ -296,7 +302,18 @@ , nest 2 $ prettyTCM p ] Open{} -> __IMPOSSIBLE__ OpenIFS{} -> __IMPOSSIBLE__- InstV{} -> __IMPOSSIBLE__+ InstV{} -> empty+ -- Andreas, 2017-01-11, issue #2637:+ -- The size solver instantiates some metas with infinity+ -- without cleaning up the UnBlock constraints.+ -- Thus, this case is not IMPOSSIBLE.+ --+ -- InstV args t -> do+ -- reportSLn "impossible" 10 $ unlines+ -- [ "UnBlock meta " ++ show m ++ " surprisingly has InstV instantiation:"+ -- , show m ++ show args ++ " := " ++ show t+ -- ]+ -- __IMPOSSIBLE__ FindInScope m mb mcands -> do t <- getMetaType m sep [ hang (text "Resolve instance argument" <+> blk) 2 $@@ -384,6 +401,7 @@ instance PrettyTCM a => PrettyTCM (Pattern' a) where prettyTCM (VarP x) = prettyTCM x prettyTCM (DotP t) = text ".(" <> prettyTCM t <> text ")"+ prettyTCM (AbsurdP _) = text absurdPatternName prettyTCM (ConP c i ps) = (if b then braces else parens) $ prTy $ prettyTCM c <+> fsep (map (prettyTCM . namedArg) ps) where@@ -397,10 +415,13 @@ sep [ prettyTCM (A.qnameName x) <+> text "=" , nest 2 $ prettyTCM $ namedArg p ] showCon = parens $ prTy $ prettyTCM c <+> fsep (map (prettyTCM . namedArg) ps) prTy d = d -- caseMaybe (conPType i) d $ \ t -> d <+> text ":" <+> prettyTCM t- prettyTCM (LitP l) = text (show l)- prettyTCM (ProjP _ q) = text ("." ++ show q)+ prettyTCM (LitP l) = text (P.prettyShow l)+ prettyTCM (ProjP _ q) = text ("." ++ P.prettyShow q) -- | Proper pretty printing of patterns:+prettyTCMPatterns :: [NamedArg DeBruijnPattern] -> TCM [Doc]+prettyTCMPatterns = mapM prettyA <=< reifyPatterns+ prettyTCMPatternList :: [NamedArg DeBruijnPattern] -> TCM Doc prettyTCMPatternList = prettyList . map prettyA <=< reifyPatterns @@ -408,31 +429,17 @@ prettyTCM (Apply v) = text "$" <+> prettyTCM (unArg v) prettyTCM (Proj _ f)= text "." <> prettyTCM f -raisePatVars :: Int -> NLPat -> NLPat-raisePatVars k (PVar id x bvs) = PVar id (k+x) bvs-raisePatVars k (PWild) = PWild-raisePatVars k (PDef f es) = PDef f $ (fmap . fmap) (raisePatVars k) es-raisePatVars k (PLam i u) = PLam i $ fmap (raisePatVars k) u-raisePatVars k (PPi a b) =- PPi (fmap (raisePatVarsInType k) a) (fmap (raisePatVarsInType k) b)-raisePatVars k (PBoundVar i es) = PBoundVar i $ (fmap . fmap) (raisePatVars k) es-raisePatVars k (PTerm t) = PTerm t--raisePatVarsInType :: Int -> NLPType -> NLPType-raisePatVarsInType k (NLPType l a) =- NLPType (raisePatVars k l) (raisePatVars k a)- instance PrettyTCM NLPat where- prettyTCM (PVar id x bvs) = prettyTCM (Var x (map (Apply . fmap var) bvs))+ prettyTCM (PVar x bvs) = prettyTCM (Var x (map (Apply . fmap var) bvs)) prettyTCM (PWild) = text $ "_" prettyTCM (PDef f es) = parens $ prettyTCM f <+> fsep (map prettyTCM es) prettyTCM (PLam i u) = parens $ text ("λ " ++ absName u ++ " →") <+>- (addContext (absName u) $ prettyTCM (raisePatVars 1 $ absBody u))+ (addContext (absName u) $ prettyTCM $ absBody u) prettyTCM (PPi a b) = parens $ text ("(" ++ absName b ++ " :") <+> prettyTCM (unDom a) <> text ") →" <+>- (addContext (absName b) $ prettyTCM (raisePatVarsInType 1 $ unAbs b))+ (addContext (absName b) $ prettyTCM $ unAbs b) prettyTCM (PBoundVar i []) = prettyTCM (var i) prettyTCM (PBoundVar i es) = parens $ prettyTCM (var i) <+> fsep (map prettyTCM es) prettyTCM (PTerm t) = text "." <> parens (prettyTCM t)@@ -462,12 +469,7 @@ ] instance PrettyTCM Occurrence where- prettyTCM GuardPos = text "-[g+]->"- prettyTCM StrictPos = text "-[++]->"- prettyTCM JustPos = text "-[+]->"- prettyTCM JustNeg = text "-[-]->"- prettyTCM Mixed = text "-[*]->"- prettyTCM Unused = text "-[ ]->"+ prettyTCM occ = text $ "-[" ++ prettyShow occ ++ "]->" -- | Pairing something with a node (for printing only). data WithNode n a = WithNode n a
src/full/Agda/TypeChecking/Pretty.hs-boot view
@@ -6,7 +6,7 @@ import Agda.Syntax.Internal -- import Agda.Syntax.Literal -import Agda.TypeChecking.Monad+import Agda.TypeChecking.Monad.Base import Agda.Utils.Pretty (Doc) -- import qualified Agda.Utils.Pretty as P
src/full/Agda/TypeChecking/Primitive.hs view
@@ -1,8 +1,13 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE UndecidableInstances #-} +-- ASR (2017-04-10). TODO: Is this option required by the final+-- version of GHC 8.2.1 (it was required by the RC 1)?+#if __GLASGOW_HASKELL__ >= 802+{-# OPTIONS -Wno-simplifiable-class-constraints #-}+#endif+ {-| Primitive functions, such as addition on builtin integers. -} module Agda.TypeChecking.Primitive where@@ -21,6 +26,7 @@ import Numeric.IEEE ( IEEE(identicalIEEE) ) import Agda.Interaction.Options+import qualified Agda.Interaction.Options.Lenses as Lens import Agda.Syntax.Position import Agda.Syntax.Common hiding (Nat)@@ -36,15 +42,21 @@ import Agda.TypeChecking.Reduce import Agda.TypeChecking.Reduce.Monad import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Telescope import Agda.TypeChecking.Errors+import Agda.TypeChecking.Functions import Agda.TypeChecking.Level import Agda.TypeChecking.Quote (QuotingKit, quoteTermWithKit, quoteTypeWithKit, quoteClauseWithKit, quotingKit) import Agda.TypeChecking.Pretty () -- instances only+import Agda.TypeChecking.Warnings +import Agda.Utils.Functor+import Agda.Utils.List+import Agda.Utils.Maybe import Agda.Utils.Monad-import Agda.Utils.Pretty (pretty)+import Agda.Utils.Pretty (pretty, prettyShow)+import Agda.Utils.Size import Agda.Utils.String ( Str(Str), unStr )-import Agda.Utils.Maybe #include "undefined.h" import Agda.Utils.Impossible@@ -69,7 +81,6 @@ where (q, r) = quotRem a b instance TermLike Nat where- traverseTerm _ = id traverseTermM _ = pure foldTerm _ = mempty @@ -164,15 +175,14 @@ irr <- primIrrelevant return $ \ i -> info `applys` [ case getHiding i of- NotHidden -> vis- Hidden -> hid- Instance -> ins+ NotHidden -> vis+ Hidden -> hid+ Instance{} -> ins , case getRelevance i of Relevant -> rel Irrelevant -> irr NonStrict -> rel Forced{} -> irr- UnusedArg -> irr ] instance ToTerm Fixity' where@@ -358,47 +368,69 @@ Lit lit -> f lit _ -> Nothing --- trustMe : {a : Level} {A : Set a} {x y : A} -> x ≡ y+-- | @trustMe : {a : Level} {A : Set a} {x y : A} -> x ≡ y@ primTrustMe :: TCM PrimitiveImpl primTrustMe = do- clo <- commandLineOptions- when (optSafe clo) (typeError SafeFlagPrimTrustMe)- t <- hPi "a" (el primLevel) $- hPi "A" (return $ sort $ varSort 0) $- hPi "x" (El (varSort 1) <$> varM 0) $- hPi "y" (El (varSort 2) <$> varM 1) $- El (varSort 3) <$>- primEquality <#> varM 3 <#> varM 2 <@> varM 1 <@> varM 0- Con rf ci [] <- ignoreSharing <$> primRefl- n <- conPars . theDef <$> getConInfo rf- -- Andreas, 2015-02-27 Forced Big vs. Forced Small should not matter here- let refl x | n == 2 = Con rf ci [setRelevance (Forced Small) $ hide $ defaultArg x]- | n == 3 = Con rf ci []- | otherwise = __IMPOSSIBLE__- return $ PrimImpl t $ PrimFun __IMPOSSIBLE__ 4 $ \ts ->- case ts of- [a, t, u, v] -> do- -- Andreas, 2013-07-22.- -- Note that we cannot call the conversion checker here,- -- because 'reduce' might be called in a context where- -- some bound variables do not have a type (just 'Prop),- -- and the conversion checker for eliminations does not- -- like this.- -- We can only do untyped equality, e.g., by normalisation.- (u', v') <- normalise' (u, v)- if u' == v' then redReturn (refl $ unArg u) else- return (NoReduction $ map notReduced [a, t, u, v])-{- OLD:+ -- primTrustMe is not --safe+ whenM (Lens.getSafeMode <$> commandLineOptions) $ warning SafeFlagPrimTrustMe - -- BAD:- noConstraints $- equalTerm (El (Type $ lvlView $ unArg a) (unArg t)) (unArg u) (unArg v)- redReturn (refl $ unArg u)- `catchError` \_ -> return (NoReduction $ map notReduced [a, t, u, v])--}- _ -> __IMPOSSIBLE__+ -- Get the name and type of BUILTIN EQUALITY+ eq <- primEqualityName+ eqTy <- defType <$> getConstInfo eq+ -- E.g. @eqTy = eqTel → Set a@ where @eqTel = {a : Level} {A : Set a} (x y : A)@.+ TelV eqTel eqCore <- telView eqTy+ let eqSort = case ignoreSharing $ unEl eqCore of+ Sort s -> s+ _ -> __IMPOSSIBLE__ --- Used for both primForce and primForceLemma.+ -- Construct the type of primTrustMe.+ -- E.g., type of @trustMe : {a : Level} {A : Set a} {x y : A} → eq {a} {A} x y@.+ let t = telePi_ (fmap hide eqTel) $ El eqSort $ Def eq $ map Apply $ teleArgs eqTel++ -- BUILTIN REFL maybe a constructor with one (the principal) argument or only parameters.+ -- Get the ArgInfo of the principal argument of refl.+ con@(Con rf ci []) <- ignoreSharing <$> primRefl+ minfo <- fmap (setOrigin Inserted) <$> getReflArgInfo rf+ let (refl :: Arg Term -> Term) = case minfo of+ Just ai -> Con rf ci . (:[]) . setArgInfo ai+ Nothing -> const con++ -- The implementation of primTrustMe:+ return $ PrimImpl t $ PrimFun __IMPOSSIBLE__ (size eqTel) $ \ ts -> do+ let (u, v) = fromMaybe __IMPOSSIBLE__ $ last2 ts+ -- Andreas, 2013-07-22.+ -- Note that we cannot call the conversion checker here,+ -- because 'reduce' might be called in a context where+ -- some bound variables do not have a type (just 'Prop),+ -- and the conversion checker for eliminations does not+ -- like this.+ -- We can only do untyped equality, e.g., by normalisation.+ (u', v') <- normalise' (u, v)+ if u' == v' then redReturn $ refl u else+ return $ NoReduction $ map notReduced ts++-- | Get the 'ArgInfo' of the principal argument of BUILTIN REFL.+--+-- Returns @Nothing@ for e.g.+-- @+-- data Eq {a} {A : Set a} (x : A) : A → Set a where+-- refl : Eq x x+-- @+--+-- Returns @Just ...@ for e.g.+-- @+-- data Eq {a} {A : Set a} : (x y : A) → Set a where+-- refl : ∀ x → Eq x x+-- @++getReflArgInfo :: ConHead -> TCM (Maybe ArgInfo)+getReflArgInfo rf = do+ def <- getConInfo rf+ TelV reflTel _ <- telView $ defType def+ return $ fmap getArgInfo $ headMaybe $ drop (conPars $ theDef def) $ telToList reflTel+++-- | Used for both @primForce@ and @primForceLemma@. genPrimForce :: TCM Type -> (Term -> Arg Term -> Term) -> TCM PrimitiveImpl genPrimForce b ret = do let varEl s a = El (varSort s) <$> a@@ -589,7 +621,7 @@ gpi :: ArgInfo -> String -> TCM Type -> TCM Type -> TCM Type gpi info name a b = do a <- a- b <- addContext (name, Dom info a) b+ b <- addContext' (name, Dom info a) b let y = stringToArgName name return $ El (getSort a `dLub` Abs y (getSort b)) (Pi (Dom info a) (Abs y b))@@ -800,19 +832,22 @@ lookupPrimitiveFunctionQ :: QName -> TCM (String, PrimitiveImpl) lookupPrimitiveFunctionQ q = do let s = case qnameName q of- Name _ x _ _ -> show x+ Name _ x _ _ -> prettyShow x PrimImpl t pf <- lookupPrimitiveFunction s return (s, PrimImpl t $ pf { primFunName = q }) getBuiltinName :: String -> TCM (Maybe QName) getBuiltinName b = do- caseMaybeM (getBuiltin' b) (return Nothing) $ \v -> do- v <- normalise v- let getName (Def x _) = x- getName (Con x _ _) = conName x- getName (Lam _ b) = getName $ ignoreSharing $ unAbs b- getName _ = __IMPOSSIBLE__- return $ Just $ getName (ignoreSharing v)+ caseMaybeM (getBuiltin' b) (return Nothing) (Just <.> getName)+ where+ getName v = do+ v <- reduce v+ case unSpine $ ignoreSharing v of+ Def x _ -> return x+ Con x _ _ -> return $ conName x+ Lam _ b -> getName $ unAbs b+ _ -> __IMPOSSIBLE__+ isBuiltin :: QName -> String -> TCM Bool isBuiltin q b = (Just q ==) <$> getBuiltinName b
src/full/Agda/TypeChecking/ProjectionLike.hs view
@@ -1,5 +1,61 @@ {-# LANGUAGE CPP #-} +-- | Dropping initial arguments (``parameters'') from a function which can be+-- easily reconstructed from its principal argument.+--+-- A function which has such parameters is called ``projection-like''.+--+-- The motivation for this optimization comes from the use of nested records.+--+-- First, let us look why proper projections need not store the parameters:+-- The type of a projection @f@ is of the form+-- @+-- f : Γ → R Γ → C+-- @+-- where @R@ is the record type and @C@ is the type of the field @f@.+-- Given a projection application+-- @+-- p pars u+-- @+-- we know that the type of the principal argument @u@ is+-- @+-- u : R pars+-- @+-- thus, the parameters @pars@ are redundant in the projection application+-- if we can always infer the type of @u@.+-- For projections, this is case, because the principal argument @u@ must be+-- neutral; otherwise, if it was a record value, we would have a redex,+-- yet Agda maintains a β-normal form.+--+-- The situation for projections can be generalized to ``projection-like''+-- functions @f@. Conditions:+--+-- 1. The type of @f@ is of the form @f : Γ → D Γ → ...@ for some+-- type constructor @D@ which can never reduce.+--+-- 2. For every reduced welltyped application @f pars u ...@,+-- the type of @u@ is inferable.+--+-- This then allows @pars@ to be dropped always.+--+-- Condition 2 is approximated by a bunch of criteria, for details see function+-- 'makeProjection'.+--+-- Typical projection-like functions are compositions of projections+-- which arise from nested records.+--+-- Notes:+--+-- 1. This analysis could be dualized to ``constructor-like'' functions+-- whose parameters are reconstructable from the target type.+-- But such functions would need to be fully applied.+--+-- 2. A more general analysis of which arguments are reconstructible+-- can be found in+--+-- Jason C. Reed, Redundancy elimination for LF+-- LFTMP 2004.+ module Agda.TypeChecking.ProjectionLike where import Control.Monad@@ -21,10 +77,12 @@ import Agda.TypeChecking.DropArgs +import Agda.Utils.List import Agda.Utils.Maybe import Agda.Utils.Monad-import Agda.Utils.Size import Agda.Utils.Permutation+import Agda.Utils.Pretty ( prettyShow )+import Agda.Utils.Size #include "undefined.h" import Agda.Utils.Impossible@@ -113,25 +171,59 @@ -- | Which @Def@types are eligible for the principle argument -- of a projection-like function? eligibleForProjectionLike :: QName -> TCM Bool-eligibleForProjectionLike d = do- defn <- theDef <$> getConstInfo d- return $ case defn of+eligibleForProjectionLike d = eligible . theDef <$> getConstInfo d+ where+ eligible = \case Datatype{} -> True Record{} -> True Axiom{} -> True Function{} -> False Primitive{} -> False Constructor{} -> __IMPOSSIBLE__- AbstractDefn -> False+ AbstractDefn d -> eligible d+ -- Andreas, 2017-08-14, issue #2682:+ -- Abstract records still export the projections. -- Andreas, 2016-10-11 AIM XXIV -- Projection-like at abstract types violates the parameter reconstructibility property. -- See test/Fail/AbstractTypeProjectionLike. -- | Turn a definition into a projection if it looks like a projection.+--+-- Conditions for projection-likeness of @f@:+--+-- 1. The type of @f@ must be of the shape @Γ → D Γ → C@ for @D@+-- a name (@Def@) which is 'eligibleForProjectionLike':+-- @data@ / @record@ / @postulate@.+--+-- 2. The application of f should only get stuck if the principal argument+-- is inferable (neutral). Thus:+--+-- a. @f@ cannot have absurd clauses (which are stuck even if the principal+-- argument is a constructor)+--+-- b. @f@ cannot be abstract as it does not reduce outside abstract blocks+-- (always stuck).+--+-- c. @f@ cannot match on other arguments than the principal argument.+--+-- d. @f@ cannot match deeply.+--+-- e. @f@s body may not mention the paramters.+--+-- For internal reasons:+--+-- 3. @f@ cannot be constructor headed+--+-- 4. @f@ cannot be recursive, since we have not implemented a function+-- which goes through the bodies of the @f@ and the mutually recursive+-- functions and drops the parameters from all applications of @f@.+--+-- Examples for these reasons: see test/Succeed/NotProjectionLike.agda+ makeProjection :: QName -> TCM () makeProjection x = -- if True then return () else do inTopContext $ do- -- reportSLn "tc.proj.like" 30 $ "Considering " ++ show x ++ " for projection likeness"+ reportSLn "tc.proj.like" 70 $ "Considering " ++ prettyShow x ++ " for projection likeness" defn <- getConstInfo x let t = defType defn reportSDoc "tc.proj.like" 20 $ sep@@ -148,7 +240,7 @@ -- Nor can abstract definitions be projection-like since they won't reduce -- outside the abstract block. def@Function{funProjection = Nothing, funClauses = cls, funCompiled = cc0, funInv = NotInjective,- funMutual = [], -- Andreas, 2012-09-28: only consider non-mutual funs (or those whose recursion status has not yet been determined)+ funMutual = Just [], -- Andreas, 2012-09-28: only consider non-mutual funs (or those whose recursion status has not yet been determined) funAbstr = ConcreteDef} -> do ps0 <- filterM validProj $ candidateArgs [] t reportSLn "tc.proj.like" 30 $ if null ps0 then " no candidates found"@@ -157,25 +249,20 @@ -- Andreas 2012-09-26: only consider non-recursive functions for proj.like. -- Issue 700: problems with recursive funs. in term.checker and reduction ifM recursive (reportSLn "tc.proj.like" 30 $ " recursive functions are not considered for projection-likeness") $ do- ps <- return $ filter (checkOccurs cls . snd) ps0- when (null ps) $- reportSLn "tc.proj.like" 50 $+ {- else -}+ case lastMaybe (filter (checkOccurs cls . snd) ps0) of+ Nothing -> reportSLn "tc.proj.like" 50 $ " occurs check failed\n clauses = " ++ show cls- case reverse ps of- [] -> return ()- (d, n) : _ -> do+ Just (d, n) -> do+ -- Yes, we are projection-like! reportSDoc "tc.proj.like" 10 $ sep [ prettyTCM x <+> text " : " <+> prettyTCM t , text $ " is projection like in argument " ++ show n ++ " for type " ++ show d ]-{-- reportSLn "tc.proj.like" 10 $- show (defName defn) ++ " is projection like in argument " ++- show n ++ " for type " ++ show d--}+ __CRASH_WHEN__ "tc.proj.like.crash" 1000+ let cls' = map (dropArgs n) cls cc = dropArgs n cc0- -- cc <- compileClauses (Just (x, __IMPOSSIBLE__)) cls' reportSLn "tc.proj.like" 60 $ " rewrote clauses to\n " ++ show cc -- Andreas, 2013-10-20 build parameter dropping function@@ -183,7 +270,7 @@ tel = take pIndex $ telToList $ theTel $ telView' t unless (length tel == pIndex) __IMPOSSIBLE__ let projection = Projection- { projProper = False+ { projProper = Nothing , projOrig = x , projFromType = d , projIndex = pIndex@@ -235,8 +322,9 @@ where Perm _ p = fromMaybe __IMPOSSIBLE__ $ clausePerm cl ps = namedClausePats cl- b = compiledClauseBody cl- m = size $ concatMap patternVars $ clausePats cl+ b = compiledClauseBody cl -- Renumbers variables to match order in patterns+ -- and includes dot patterns as variables.+ m = size $ concatMap patternVars ps -- This also counts dot patterns! onlyMatch n ps = all (shallowMatch . namedArg) (take 1 ps1) &&@@ -251,9 +339,11 @@ noMatch ProjP{}= False noMatch VarP{} = True noMatch DotP{} = True+ noMatch AbsurdP{} = True + -- Make sure non of the parameters occurs in the body of the function. checkBody m n b = not . getAny $ runFree badVar IgnoreNot b- where badVar (x,_) = Any $ m-1-n < x && x < m+ where badVar x = Any $ m - n <= x && x < m -- @candidateArgs [var 0,...,var(n-1)] t@ adds @(n,d)@ to the output, -- if @t@ is a function-type with domain @t 0 .. (n-1)@
src/full/Agda/TypeChecking/Quote.hs view
@@ -3,6 +3,8 @@ module Agda.TypeChecking.Quote where import Control.Applicative+import Control.Arrow ((&&&))+import Control.Monad import Control.Monad.State (runState, get, put) import Control.Monad.Reader (asks) import Control.Monad.Writer (execWriterT, tell)@@ -20,13 +22,11 @@ import Agda.Syntax.Translation.InternalToAbstract import Agda.TypeChecking.CompiledClause-import Agda.TypeChecking.Datatypes ( getConHead ) import Agda.TypeChecking.DropArgs import Agda.TypeChecking.Free import Agda.TypeChecking.Level import Agda.TypeChecking.Monad import Agda.TypeChecking.Monad.Builtin-import Agda.TypeChecking.Monad.Exception import Agda.TypeChecking.Pretty import Agda.TypeChecking.Reduce import Agda.TypeChecking.Reduce.Monad@@ -116,19 +116,18 @@ t !@! u = pure t @@ pure u quoteHiding :: Hiding -> ReduceM Term- quoteHiding Hidden = pure hidden- quoteHiding Instance = pure instanceH- quoteHiding NotHidden = pure visible+ quoteHiding Hidden = pure hidden+ quoteHiding Instance{} = pure instanceH+ quoteHiding NotHidden = pure visible quoteRelevance :: Relevance -> ReduceM Term quoteRelevance Relevant = pure relevant quoteRelevance Irrelevant = pure irrelevant quoteRelevance NonStrict = pure relevant quoteRelevance Forced{} = pure relevant- quoteRelevance UnusedArg = pure relevant quoteArgInfo :: ArgInfo -> ReduceM Term- quoteArgInfo (ArgInfo h r _ _) = arginfo !@ quoteHiding h @@ quoteRelevance r+ quoteArgInfo (ArgInfo h r _) = arginfo !@ quoteHiding h @@ quoteRelevance r quoteLit :: Literal -> ReduceM Term quoteLit l@LitNat{} = litNat !@! Lit l@@ -162,7 +161,7 @@ quotePats ps = list $ map (quoteArg quotePat . fmap namedThing) ps quotePat :: DeBruijnPattern -> ReduceM Term- quotePat (VarP x) | isAbsurdPatternName (dbPatVarName x) = pure absurdP+ quotePat (AbsurdP x) = pure absurdP quotePat (VarP x) = varP !@! quoteString (dbPatVarName x) quotePat (DotP _) = pure dotP quotePat (ConP c _ ps) = conP !@ quoteQName (conName c) @@ quotePats ps@@ -206,18 +205,26 @@ in var !@! Lit (LitNat noRange $ fromIntegral n) @@ quoteArgs ts Lam info t -> lam !@ quoteHiding (getHiding info) @@ quoteAbs quoteTerm t Def x es -> do- def <- getConstInfo x- let d = theDef def+ defn <- getConstInfo x n <- getDefFreeVars x -- #2220: remember to restore dropped parameters- qx d @@ list (drop n $ defParameters def ++ map (quoteArg quoteTerm) ts)- where+ let+ conOrProjPars = defParameters defn ts = fromMaybe __IMPOSSIBLE__ $ allApplyElims es- qx Function{ funExtLam = Just (ExtLamInfo h nh), funClauses = cs } =- extlam !@ list (map (quoteClause . dropArgs (h + nh)) cs)+ qx Function{ funExtLam = Just (ExtLamInfo h nh), funClauses = cs } = do+ -- An extended lambda should not have any extra parameters!+ unless (null conOrProjPars) __IMPOSSIBLE__+ -- Andreas, 2017-01-23 quoting Ulf+ -- "One would hope that @n@ includes the @h + nh@ parameters of the ext.lam."+ -- Let's see!+ -- unless (n >= h + nh) __IMPOSSIBLE__+ -- Actually, no, it does not! ExtLam is not touched by module application.+ -- TODO: fixe me! See #2404.+ extlam !@ list (map (quoteClause . (`apply` (take (h + nh) ts))) cs) qx Function{ funCompiled = Just Fail, funClauses = [cl] } = extlam !@ list [quoteClause $ dropArgs (length (namedClausePats cl) - 1) cl] qx _ = def !@! quoteName x+ qx (theDef defn) @@ list (drop n $ conOrProjPars ++ map (quoteArg quoteTerm) ts) Con x ci ts -> do cDef <- getConstInfo (conName x) n <- getDefFreeVars (conName x)@@ -241,8 +248,8 @@ Function{ funProjection = Just p } -> projIndex p - 1 _ -> 0 TelV tel _ = telView' (defType def)- hiding = map getHiding $ take np $ telToList tel- par h = arg !@ (arginfo !@ quoteHiding h @@ pure relevant) @@ pure unsupported+ hiding = map (getHiding &&& getRelevance) $ take np $ telToList tel+ par (h, r) = arg !@ (arginfo !@ quoteHiding h @@ quoteRelevance r) @@ pure unsupported quoteDefn :: Definition -> ReduceM Term quoteDefn def =@@ -251,8 +258,10 @@ agdaDefinitionFunDef !@ quoteList quoteClause cs Datatype{dataPars = np, dataCons = cs} -> agdaDefinitionDataDef !@! quoteNat (fromIntegral np) @@ quoteList (pure . quoteName) cs- Record{recConHead = c} ->- agdaDefinitionRecordDef !@! quoteName (conName c)+ Record{recConHead = c, recFields = fs} ->+ agdaDefinitionRecordDef+ !@! quoteName (conName c)+ @@ quoteList (quoteArg (pure . quoteName)) fs Axiom{} -> pure agdaDefinitionPostulate AbstractDefn{}-> pure agdaDefinitionPostulate Primitive{primClauses = cs} | not $ null cs ->
src/full/Agda/TypeChecking/ReconstructParameters.hs view
@@ -1,8 +1,10 @@ {-# LANGUAGE CPP #-}+ -- | Reconstruct dropped parameters from constructors. Used by -- with-abstraction to avoid ill-typed abstractions (#745). Note that the--- term in invalid after parameter reconstruction. Parameters need to be+-- term is invalid after parameter reconstruction. Parameters need to be -- dropped again before using it.+ module Agda.TypeChecking.ReconstructParameters where import Control.Applicative
src/full/Agda/TypeChecking/RecordPatterns.hs view
@@ -17,7 +17,7 @@ import Control.Monad.Reader import Control.Monad.State -import Data.List+import qualified Data.List as List import Data.Maybe import qualified Data.Map as Map import qualified Data.Traversable as Trav@@ -27,6 +27,7 @@ import Agda.Syntax.Internal.Pattern as I import Agda.TypeChecking.CompiledClause import Agda.TypeChecking.Coverage.SplitTree+import Agda.TypeChecking.EtaContract import Agda.TypeChecking.Datatypes import Agda.TypeChecking.Monad import Agda.TypeChecking.Pretty hiding (pretty)@@ -64,6 +65,7 @@ VarP{} -> return [ \ x -> x ] LitP{} -> typeError $ ShouldBeRecordPattern p DotP{} -> typeError $ ShouldBeRecordPattern p+ AbsurdP{} -> typeError $ ShouldBeRecordPattern p ConP c ci ps -> do whenNothing (conPRecord ci) $ typeError $ ShouldBeRecordPattern p@@ -114,13 +116,22 @@ getEtaAndArity :: QName -> TCM (Bool, Nat) getEtaAndArity c =- for (getConstructorInfo c) $ \i ->- case i of+ for (getConstructorInfo c) $ \case DataCon n -> (False, n) RecordCon eta fs -> (eta == YesEta, size fs) translateCompiledClauses :: CompiledClauses -> TCM CompiledClauses-translateCompiledClauses cc = snd <$> loop cc+translateCompiledClauses cc = do+ reportSDoc "tc.cc.record" 20 $ vcat+ [ text "translate record patterns in compiled clauses"+ , nest 2 $ return $ pretty cc+ ]+ cc <- snd <$> loop cc+ reportSDoc "tc.cc.record" 20 $ vcat+ [ text "translated compiled clauses (no eta record patterns):"+ , nest 2 $ return $ pretty cc+ ]+ return cc where loop :: CompiledClauses -> TCM ([Bool], CompiledClauses)@@ -139,7 +150,7 @@ -- recurse on and compute variable status of catch-all clause (xssa, catchAll) <- unzipMaybe <$> Trav.mapM loop catchAll- let xsa = maybe (repeat True) id xssa+ let xsa = fromMaybe (repeat True) xssa -- recurse on compute variable status of literal clauses (xssl, litMap) <- Map.unzip <$> Trav.mapM loop litMap@@ -160,8 +171,8 @@ RecordCon YesEta fs -> return $ Right fs Just{} -> return $ Left 0 let (isRC, n) = either (False,) ((True,) . size) dataOrRecCon- (xs0, rest) = genericSplitAt (unArg i) xs- (xs1, xs2 ) = genericSplitAt n rest+ (xs0, rest) = splitAt (unArg i) xs+ (xs1, xs2 ) = splitAt n rest -- if all dropped variables (xs1) are virgins and we are record cons. -- then new variable x is also virgin -- and we can translate away the split@@ -171,7 +182,8 @@ -- get the record fields fs = either __IMPOSSIBLE__ id dataOrRecCon -- if x we can translate- mcc = if x then [replaceByProjections i (map unArg fs) cc] else []+ mcc <- if x then etaContract [replaceByProjections i (map unArg fs) cc]+ else return [] when (n /= ar) __IMPOSSIBLE__ return (mcc, xs', WithArity ar cc)@@ -317,8 +329,8 @@ forM ts $ \ (c, t) -> do (xs, t) <- loop t (isRC, n) <- getEtaAndArity c- let (xs0, rest) = genericSplitAt i xs- (xs1, xs2) = genericSplitAt n rest+ let (xs0, rest) = splitAt i xs+ (xs1, xs2) = splitAt n rest x = isRC && and xs1 xs' = xs0 ++ x : xs2 return (xs, (RecordSplitNode c n x, t))@@ -360,8 +372,8 @@ (xs, t) <- loop t (isRC, n) <- getEtaAndArity c -- now drop variables from i to i+n-1- let (xs0, rest) = genericSplitAt i xs- (xs1, xs2) = genericSplitAt n rest+ let (xs0, rest) = splitAt i xs+ (xs1, xs2) = splitAt n rest -- if all dropped variables are virgins and we are record cons. -- then new variable x is also virgin -- and we can translate away the split@@ -484,7 +496,7 @@ -- It is important that dummyDom does not mention any variable -- (see the definition of reorderTel). where- isDotP n = case genericIndex cs n of+ isDotP n = case List.genericIndex cs n of Left DotP{} -> True _ -> False @@ -523,8 +535,8 @@ , text "Intermediate results:" , nest 2 $ vcat [ text "ps =" <+> text (show ps)- , text "s =" <+> prettyList (map prettyTCM s)- , text "cs =" <+> prettyList (map prettyTCM cs)+ , text "s =" <+> prettyTCM s+ , text "cs =" <+> prettyTCM cs , text "flattenedOldTel =" <+> (text . show) flattenedOldTel , text "newTel' =" <+> (text . show) newTel' , text "newPerm =" <+> prettyTCM newPerm@@ -562,7 +574,7 @@ newtype RecPatM a = RecPatM (TCMT (ReaderT Nat (StateT Nat IO)) a) deriving (Functor, Applicative, Monad,- MonadIO, MonadTCM,+ MonadIO, MonadTCM, HasOptions, MonadDebug, MonadReader TCEnv, MonadState TCState) -- | Runs a computation in the 'RecPatM' monad.@@ -652,7 +664,7 @@ let ps = projections tree s = map (\(p, _) -> p x) ps - count k = genericLength $ filter ((== k) . snd) ps+ count k = length $ filter ((== k) . snd) ps return $ case tree of Leaf p -> (p, s, [Left p])@@ -697,6 +709,7 @@ return (ConP c ci ps, s, cs) translatePattern p@VarP{} = removeTree (Leaf p) translatePattern p@DotP{} = removeTree (Leaf p)+translatePattern p@AbsurdP{} = removeTree (Leaf p) translatePattern p@LitP{} = return (p, [], []) translatePattern p@ProjP{}= return (p, [], []) @@ -741,6 +754,7 @@ recordTree p@(ConP _ ci _) = return $ Left $ translatePattern p recordTree p@VarP{} = return (Right (Leaf p)) recordTree p@DotP{} = return (Right (Leaf p))+recordTree p@AbsurdP{} = return (Right (Leaf p)) recordTree p@LitP{} = return $ Left $ translatePattern p recordTree p@ProjP{}= return $ Left $ translatePattern p @@ -762,7 +776,7 @@ translateTel (Left (DotP{}) : rest) tel = Nothing : translateTel rest tel translateTel (Right (n, x, t) : rest) tel = Just (x, t) : translateTel rest- (genericDrop (n VarPat) tel)+ (drop (n VarPat) tel) translateTel (Left _ : rest) (t : tel) = Just t : translateTel rest tel translateTel [] [] = [] translateTel (Left _ : _) [] = __IMPOSSIBLE__
src/full/Agda/TypeChecking/Records.hs view
@@ -7,7 +7,7 @@ import Control.Monad import Data.Function-import Data.List+import qualified Data.List as List import Data.Maybe import qualified Data.Set as Set import Data.Traversable (traverse)@@ -46,9 +46,9 @@ -- Use the second argument for missing fields. orderFields :: QName -> a -> [C.Name] -> [(C.Name, a)] -> TCM [a] orderFields r def xs fs = do- unlessNull (ys \\ nub ys) $ typeError . DuplicateFields . nub- unlessNull (ys \\ xs) $ typeError . TooManyFields r- -- shouldBeNull (xs \\ ys) $ TooFewFields r+ unlessNull (ys List.\\ List.nub ys) $ typeError . DuplicateFields . List.nub+ unlessNull (ys List.\\ xs) $ typeError . TooManyFields r+ -- shouldBeNull (xs List.\\ ys) $ TooFewFields r return $ order xs fs where ys = map fst fs@@ -73,18 +73,16 @@ -> [Arg C.Name] -- ^ All record field names with 'ArgInfo'. -> TCM [NamedArg a] -- ^ Given fields enriched by placeholders for missing explicit fields. insertMissingFields r placeholder fs axs = do- let -- Just field names.- xs = map unArg axs -- Compute the list of given fields, decorated with the ArgInfo from the record def. let arg x e = case [ a | a <- axs, unArg a == x ] of- [a] -> unnamed e <$ a+ [a] -> nameIfHidden a e <$ a _ -> defaultNamedArg e -- we only end up here if the field names are bad givenFields = [ (x, Just $ arg x e) | FieldAssignment x e <- fs ] -- Compute a list of p[aceholders for the missing visible fields. let missingExplicits =- [ (x, Just $ setOrigin Inserted $ unnamed . placeholder <$> a)- | a <- filter notHidden axs+ [ (x, Just $ setOrigin Inserted $ nameIfHidden a . placeholder <$> a)+ | a <- filter visible axs , let x = unArg a , x `notElem` map (view nameFieldA) fs ]@@ -94,8 +92,15 @@ catMaybes <$> do -- Default value @Nothing@ will only be used for missing hidden fields. -- These can be ignored as they will be inserted by @checkArguments_@.- orderFields r Nothing xs $ givenFields ++ missingExplicits-+ orderFields r Nothing (map unArg axs) $ givenFields ++ missingExplicits+ where+ -- Andreas, 2017-04-13, issue #2494+ -- We need to put the field names as argument names for hidden arguments.+ -- Otherwise, insertImplicit does not do the right thing.+ nameIfHidden :: Arg C.Name -> c -> Named_ c+ nameIfHidden ax+ | visible ax = unnamed+ | otherwise = named (Ranged (getRange ax) $ prettyShow $ unArg ax) -- | The name of the module corresponding to a record. recordModule :: QName -> ModuleName@@ -111,7 +116,7 @@ getRecordOfField :: QName -> TCM (Maybe QName) getRecordOfField d = caseMaybeM (isProjection d) (return Nothing) $ \ Projection{ projProper = proper, projFromType = r} ->- return $ if proper then Just (unArg r) else Nothing+ return $ unArg r <$ proper -- if proper then Just (unArg r) else Nothing -- | Get the field names of a record. getRecordFieldNames :: QName -> TCM [Arg C.Name]@@ -196,7 +201,7 @@ fallback = return (f, def, proj) caseMaybe proj fallback $ \ p@Projection{ projProper = proper, projOrig = f' } ->- if not proper || f == f' then fallback else do+ if isNothing proper || f == f' then fallback else do def <- getConstInfo f' return (f', def, isProjection_ $ theDef def) @@ -222,7 +227,7 @@ -- if @f@ is not a projection (like) function, @a@ is the correct type fallback = return $ Just a reportSDoc "tc.deftype" 20 $ vcat- [ text "definition f = " <> prettyTCM f <+> text ("raw: " ++ show f)+ [ text "definition f = " <> prettyTCM f <+> text (" -- raw: " ++ prettyShow f) , text "has type a = " <> prettyTCM a , text "principal t = " <> prettyTCM t ]@@ -244,7 +249,7 @@ -- now we know it is reduced, we can safely take the parameters let pars = fromMaybe __IMPOSSIBLE__ $ allApplyElims $ take npars es reportSDoc "tc.deftype" 20 $ vcat- [ text $ "head d = " ++ show d+ [ text $ "head d = " ++ prettyShow d , text "parameters =" <+> sep (map prettyTCM pars) ] reportSLn "tc.deftype" 60 $ "parameters = " ++ show pars@@ -271,12 +276,46 @@ -- In this case, the first result is not a record type. -- -- Precondition: @t@ is reduced.-projectTyped :: Term -> Type -> ProjOrigin -> QName -> TCM (Maybe (Dom Type, Term, Type))+--+projectTyped+ :: Term -- ^ Head (record value).+ -> Type -- ^ Its type.+ -> ProjOrigin+ -> QName -- ^ Projection.+ -> TCM (Maybe (Dom Type, Term, Type)) projectTyped v t o f = caseMaybeM (getDefType f t) (return Nothing) $ \ tf -> do ifNotPiType tf (const $ return Nothing) {- else -} $ \ dom b -> do u <- applyDef o f (argFromDom dom $> v) return $ Just (dom, u, b `absApp` v) +-- | Typing of an elimination.++data ElimType+ = ArgT (Dom Type) -- ^ Type of the argument.+ | ProjT+ { projTRec :: Dom Type -- ^ The type of the record which is eliminated.+ , projTField :: Type -- ^ The type of the field.+ }++instance PrettyTCM ElimType where+ prettyTCM (ArgT a) = prettyTCM a+ prettyTCM (ProjT a b) =+ text "." <> parens (prettyTCM a <+> text "->" <+> prettyTCM b)++-- | Given a head and its type, compute the types of the eliminations.++typeElims :: Type -> Term -> Elims -> TCM [ElimType]+typeElims a _ [] = return []+typeElims a self (e : es) = do+ case e of+ Apply v -> ifNotPiType a __IMPOSSIBLE__ {- else -} $ \ a b -> do+ (ArgT a :) <$> typeElims (absApp b $ unArg v) (self `applyE` [e]) es+ Proj o f -> do+ a <- reduce a+ (dom, self, a) <- fromMaybe __IMPOSSIBLE__ <$> projectTyped self a o f+ (ProjT dom a :) <$> typeElims a self es++ -- | Check if a name refers to an eta expandable record. {-# SPECIALIZE isEtaRecord :: QName -> TCM Bool #-} {-# SPECIALIZE isEtaRecord :: QName -> ReduceM Bool #-}@@ -284,9 +323,10 @@ isEtaRecord r = maybe False recEtaEquality <$> isRecord r isEtaCon :: HasConstInfo m => QName -> m Bool-isEtaCon c = do- cdef <- theDef <$> getConstInfo c- case cdef of+isEtaCon c = getConstInfo' c >>= \case+ Left (SigUnknown err) -> __IMPOSSIBLE__+ Left SigAbstract -> return False+ Right def -> case theDef def of Constructor {conData = r} -> isEtaRecord r _ -> return False @@ -305,39 +345,39 @@ -- | Check if a name refers to a record constructor. -- If yes, return record definition. isRecordConstructor :: HasConstInfo m => QName -> m (Maybe (QName, Defn))-isRecordConstructor c = do- def <- theDef <$> getConstInfo c- case def of+isRecordConstructor c = getConstInfo' c >>= \case+ Left (SigUnknown err) -> __IMPOSSIBLE__+ Left SigAbstract -> return Nothing+ Right def -> case theDef $ def of Constructor{ conData = r } -> fmap (r,) <$> isRecord r _ -> return Nothing -- | Check if a constructor name is the internally generated record constructor.+--+-- Works also for abstract constructors. isGeneratedRecordConstructor :: QName -> TCM Bool-isGeneratedRecordConstructor c = do- def <- theDef <$> getConstInfo c- case def of- Constructor{ conData = r } -> do- def <- theDef <$> getConstInfo r- case def of- Record{ recNamedCon = False } -> return True- _ -> return False- _ -> return False+isGeneratedRecordConstructor c = ignoreAbstractMode $ do+ caseMaybeM (isRecordConstructor c) (return False) $ \ (_, def) ->+ case def of+ Record{ recNamedCon = False } -> return True+ _ -> return False --- | Mark record type as unguarded.--- No eta-expansion. Projections do not preserve guardedness.++-- | Turn off eta for unguarded recursive records.+-- Projections do not preserve guardedness. unguardedRecord :: QName -> TCM () unguardedRecord q = modifySignature $ updateDefinition q $ updateTheDef $ \case- r@Record{} -> r { recEtaEquality' = setEtaEquality (recEtaEquality' r) False, recRecursive = True }+ r@Record{} -> r { recEtaEquality' = setEtaEquality (recEtaEquality' r) False } _ -> __IMPOSSIBLE__ --- | Mark record type as recursive.+-- | Turn on eta for inductive guarded recursive records. -- Projections do not preserve guardedness. recursiveRecord :: QName -> TCM () recursiveRecord q = do ok <- etaEnabled modifySignature $ updateDefinition q $ updateTheDef $ \case r@Record{ recInduction = ind, recEtaEquality' = eta } ->- r { recRecursive = True, recEtaEquality' = eta' }+ r { recEtaEquality' = eta' } where eta' | ok, eta == Inferred False, ind /= Just CoInductive = Inferred True | otherwise = eta@@ -359,12 +399,7 @@ -- -- Precondition: record type identifier exists in signature. isRecursiveRecord :: QName -> TCM Bool-isRecursiveRecord q = recRecursive_ . theDef . fromMaybe __IMPOSSIBLE__ . lookupDefinition q <$> getSignature---- | Version of @recRecursive@ with proper internal error.-recRecursive_ :: Defn -> Bool-recRecursive_ (Record { recRecursive = b }) = b-recRecursive_ _ = __IMPOSSIBLE__+isRecursiveRecord q = recRecursive . theDef . fromMaybe __IMPOSSIBLE__ . lookupDefinition q <$> getSignature {- | @etaExpandBoundVar i = (Δ, σ, τ)@ @@ -431,7 +466,11 @@ -- Use "f(x)" as variable name for the projection f(x). s = prettyShow x tel' = mapAbsNames (\ f -> stringToArgName $ argNameToString f ++ "(" ++ s ++ ")") tel- delta = telFromList $ gamma1 ++ telToList tel' ++ applySubst tau0 gamma2+ delta = telFromList $ gamma1 ++ telToList tel' +++ telToList (applySubst tau0 $ telFromList gamma2)+ -- Andreas, 2017-07-29, issue #2644+ -- We cannot substitute directly into a ListTel like gamma2,+ -- we have to convert it to a telescope first, otherwise we get garbage. return (delta, sigma, tau, tel) @@ -533,8 +572,8 @@ when (con /= con_) $ do reportSDoc "impossible" 10 $ vcat [ text "etaExpandRecord_: the following two constructors should be identical"- , nest 2 $ text $ "con = " ++ show con- , nest 2 $ text $ "con_ = " ++ show con_+ , nest 2 $ text $ "con = " ++ prettyShow con+ , nest 2 $ text $ "con_ = " ++ prettyShow con_ ] __IMPOSSIBLE__ return (tel', con, ci, args)@@ -614,7 +653,7 @@ -- contains garbage. isSingletonRecord' :: Bool -> QName -> Args -> TCM (Either MetaId (Maybe Term)) isSingletonRecord' regardIrrelevance r ps = do- reportSLn "tc.meta.eta" 30 $ "Is " ++ show r ++ " a singleton record type?"+ reportSLn "tc.meta.eta" 30 $ "Is " ++ prettyShow r ++ " a singleton record type?" def <- getRecordDef r emap (Con (recConHead def) ConOSystem) <$> check (recTel def `apply` ps) where@@ -663,6 +702,8 @@ emap :: (a -> b) -> Either c (Maybe a) -> Either c (Maybe b) emap = mapRight . fmap +-- | Replace projection patterns by the original projections.+-- class NormaliseProjP a where normaliseProjP :: HasConstInfo m => a -> m a @@ -683,6 +724,7 @@ instance NormaliseProjP (Pattern' x) where normaliseProjP p@VarP{} = return p normaliseProjP p@DotP{} = return p+ normaliseProjP p@AbsurdP{} = return p normaliseProjP (ConP c cpi ps) = ConP c cpi <$> normaliseProjP ps normaliseProjP p@LitP{} = return p normaliseProjP (ProjP o d0) = ProjP o <$> getOriginalProjection d0
src/full/Agda/TypeChecking/Reduce.hs view
@@ -8,7 +8,7 @@ import Control.Monad.Reader hiding (mapM) import Control.Applicative -import Data.List as List hiding (sort)+import qualified Data.List as List import Data.Maybe import Data.Map (Map) import Data.Traversable@@ -73,7 +73,7 @@ isFullyInstantiatedMeta m = do mv <- TCM.lookupMeta m case mvInstantiation mv of- InstV sub v -> null . allMetas <$> instantiateFull (sub, v)+ InstV _tel v -> null . allMetas <$> instantiateFull v _ -> return False -- | Instantiate something.@@ -207,7 +207,7 @@ instantiate' (EqualityType s eq l t a b) = EqualityType <$> instantiate' s <*> return eq- <*> instantiate' l+ <*> mapM instantiate' l <*> instantiate' t <*> instantiate' a <*> instantiate' b@@ -327,7 +327,7 @@ else do s <- optSharing <$> commandLineOptions allowed <- asks envAllowedReductions- let notAll = delete NonTerminatingReductions allowed /= allReductions+ let notAll = List.delete NonTerminatingReductions allowed /= allReductions if s || notAll then slowReduceTerm v else fastReduce (elem NonTerminatingReductions allowed) v slowReduceTerm :: Term -> ReduceM (Blocked Term)@@ -363,7 +363,7 @@ case v of _ | Just v == mz -> return $ Lit $ LitNat (getRange c) 0 _ -> return v- reduceNat v@(Con c ci [a]) | notHidden a && isRelevant a = do+ reduceNat v@(Con c ci [a]) | visible a && isRelevant a = do ms <- fmap ignoreSharing <$> getBuiltin' builtinSuc case v of _ | Just (Con c ci []) == ms -> inc <$> reduce' (unArg a)@@ -422,7 +422,7 @@ unfoldDefinitionStep unfoldDelayed v0 f es = {-# SCC "reduceDef" #-} do info <- getConstInfo f- rewr <- getRewriteRulesFor f+ rewr <- instantiateRewriteRules =<< getRewriteRulesFor f allowed <- asks envAllowedReductions let def = theDef info v = v0 `applyE` es@@ -432,6 +432,7 @@ -- are not unfolded unless explicitely permitted. dontUnfold = (defNonterminating info && notElem NonTerminatingReductions allowed)+ || (defTerminationUnconfirmed info && notElem UnconfirmedReductions allowed) || (defDelayed info == Delayed && not unfoldDelayed) copatterns = case def of@@ -447,10 +448,11 @@ cls (defCompiled info) rewr else noReduction $ notBlocked v _ -> do- if FunctionReductions `elem` allowed ||+ if (RecursiveReductions `elem` allowed) || (isJust (isProjection_ def) && ProjectionReductions `elem` allowed) || -- includes projection-like (isInlineFun def && InlineReductions `elem` allowed) ||- (copatterns && CopatternReductions `elem` allowed)+ (definitelyNonRecursive_ def && copatterns && CopatternReductions `elem` allowed) ||+ (definitelyNonRecursive_ def && FunctionReductions `elem` allowed) then reduceNormalE v0 f (map notReduced es) dontUnfold (defClauses info) (defCompiled info) rewr@@ -460,10 +462,10 @@ noReduction = return . NoReduction yesReduction s = return . YesReduction s reducePrimitive x v0 f es pf dontUnfold cls mcc rewr- | genericLength es < ar+ | length es < ar = noReduction $ NotBlocked Underapplied $ v0 `applyE` es -- not fully applied | otherwise = {-# SCC "reducePrimitive" #-} do- let (es1,es2) = genericSplitAt ar es+ let (es1,es2) = splitAt ar es args1 = fromMaybe __IMPOSSIBLE__ $ mapM isApplyElim es1 r <- primFunImplementation pf args1 case r of@@ -487,15 +489,32 @@ case (def,rewr) of _ | dontUnfold -> defaultResult -- non-terminating or delayed ([],[]) -> defaultResult -- no definition for head- (cls,rewr) -> appDefE_ f v0 cls mcc rewr es- where defaultResult = noReduction $ NotBlocked AbsurdMatch vfull- vfull = v0 `applyE` map ignoreReduced es+ (cls,rewr) -> do+ ev <- appDefE_ f v0 cls mcc rewr es+ debugReduce ev+ return ev+ where+ defaultResult = noReduction $ NotBlocked AbsurdMatch vfull+ vfull = v0 `applyE` map ignoreReduced es+ debugReduce ev = verboseS "tc.reduce" 90 $ do+ case ev of+ NoReduction v -> do+ reportSDoc "tc.reduce" 90 $ vcat+ [ text "*** tried to reduce " <+> prettyTCM f+ , text " es = " <+> sep (map (prettyTCM . ignoreReduced) es)+ -- , text "*** tried to reduce " <+> prettyTCM vfull+ , text " stuck on" <+> prettyTCM (ignoreBlocking v)+ ]+ YesReduction _simpl v -> do+ reportSDoc "tc.reduce" 90 $ text "*** reduced definition: " <+> prettyTCM f+ reportSDoc "tc.reduce" 95 $ text " result" <+> prettyTCM v+ reportSDoc "tc.reduce" 100 $ text " raw " <+> text (show v) -- | Reduce a non-primitive definition if it is a copy linking to another def. reduceDefCopy :: QName -> Elims -> TCM (Reduced () Term) reduceDefCopy f es = do info <- TCM.getConstInfo f- rewr <- TCM.getRewriteRulesFor f+ rewr <- instantiateRewriteRules =<< TCM.getRewriteRulesFor f if (defCopy info) then reduceDef_ info rewr f es else return $ NoReduction () where reduceDef_ :: Definition -> RewriteRules -> QName -> Elims -> TCM (Reduced () Term)@@ -649,7 +668,7 @@ reduce' (EqualityType s eq l t a b) = EqualityType <$> reduce' s <*> return eq- <*> reduce' l+ <*> mapM reduce' l <*> reduce' t <*> reduce' a <*> reduce' b@@ -809,7 +828,7 @@ simplify' (EqualityType s eq l t a b) = EqualityType <$> simplify' s <*> return eq- <*> simplify' l+ <*> mapM simplify' l <*> simplify' t <*> simplify' a <*> simplify' b@@ -945,6 +964,7 @@ LitP _ -> return p ConP c mt ps -> ConP c <$> normalise' mt <*> normalise' ps DotP v -> DotP <$> normalise' v+ AbsurdP x -> AbsurdP <$> normalise' x ProjP{} -> return p instance Normalise DisplayForm where@@ -965,7 +985,7 @@ normalise' (EqualityType s eq l t a b) = EqualityType <$> normalise' s <*> return eq- <*> normalise' l+ <*> mapM normalise' l <*> normalise' t <*> normalise' a <*> normalise' b@@ -974,9 +994,6 @@ -- * Full instantiation --------------------------------------------------------------------------- --- STALE: Full instantiatiation = normalisation [ instantiate' / reduce' ]--- How can we express this? We need higher order classes!- -- | @instantiateFull'@ 'instantiate's metas everywhere (and recursively) -- but does not 'reduce'. class InstantiateFull t where@@ -1041,7 +1058,7 @@ instantiateFull' sigma = case sigma of IdS -> return IdS- EmptyS -> return EmptyS+ EmptyS err -> return $ EmptyS err Wk n sigma -> Wk n <$> instantiateFull' sigma Lift n sigma -> Lift n <$> instantiateFull' sigma Strengthen bot sigma -> Strengthen bot <$> instantiateFull' sigma@@ -1063,6 +1080,7 @@ instance InstantiateFull a => InstantiateFull (Pattern' a) where instantiateFull' (VarP x) = VarP <$> instantiateFull' x instantiateFull' (DotP t) = DotP <$> instantiateFull' t+ instantiateFull' (AbsurdP p) = AbsurdP <$> instantiateFull' p instantiateFull' (ConP n mt ps) = ConP n <$> instantiateFull' mt <*> instantiateFull' ps instantiateFull' l@LitP{} = return l instantiateFull' p@ProjP{} = return p@@ -1146,12 +1164,12 @@ instantiateFull' = return instance InstantiateFull Definition where- instantiateFull' (Defn rel x t pol occ df i c inst copy ma d) = do+ instantiateFull' (Defn rel x t pol occ df i c inst copy ma inj d) = do (t, df, d) <- instantiateFull' (t, df, d)- return $ Defn rel x t pol occ df i c inst copy ma d+ return $ Defn rel x t pol occ df i c inst copy ma inj d instance InstantiateFull NLPat where- instantiateFull' (PVar x y z) = return $ PVar x y z+ instantiateFull' (PVar x y) = return $ PVar x y instantiateFull' (PWild) = return PWild instantiateFull' (PDef x y) = PDef <$> instantiateFull' x <*> instantiateFull' y instantiateFull' (PLam x y) = PLam x <$> instantiateFull' y@@ -1192,7 +1210,7 @@ instance InstantiateFull Defn where instantiateFull' d = case d of Axiom{} -> return d- AbstractDefn -> return d+ AbstractDefn d -> AbstractDefn <$> instantiateFull' d Function{ funClauses = cs, funCompiled = cc, funInv = inv } -> do (cs, cc, inv) <- instantiateFull' (cs, cc, inv) return $ d { funClauses = cs, funCompiled = cc, funInv = inv }@@ -1229,26 +1247,27 @@ instantiateFull' (Case n bs) = Case n <$> instantiateFull' bs instance InstantiateFull Clause where- instantiateFull' (Clause r tel ps b t catchall) =- Clause r <$> instantiateFull' tel+ instantiateFull' (Clause rl rf tel ps b t catchall unreachable) =+ Clause rl rf <$> instantiateFull' tel <*> instantiateFull' ps <*> instantiateFull' b <*> instantiateFull' t <*> return catchall+ <*> return unreachable instance InstantiateFull Interface where instantiateFull' (Interface h ms mod scope inside- sig display b hsImports hsImportsUHC hsCode highlighting pragmas patsyns) =+ sig display b foreignCode+ highlighting pragmas patsyns warnings) = Interface h ms mod scope inside <$> instantiateFull' sig <*> instantiateFull' display <*> instantiateFull' b- <*> return hsImports- <*> return hsImportsUHC- <*> return hsCode+ <*> return foreignCode <*> return highlighting <*> return pragmas <*> return patsyns+ <*> return warnings instance InstantiateFull a => InstantiateFull (Builtin a) where instantiateFull' (Builtin t) = Builtin <$> instantiateFull' t@@ -1270,7 +1289,7 @@ instantiateFull' (EqualityType s eq l t a b) = EqualityType <$> instantiateFull' s <*> return eq- <*> instantiateFull' l+ <*> mapM instantiateFull' l <*> instantiateFull' t <*> instantiateFull' a <*> instantiateFull' b
src/full/Agda/TypeChecking/Reduce/Fast.hs view
@@ -1,8 +1,8 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE PatternGuards #-}-{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE PatternGuards #-} + {-| This module contains an optimised implementation of the reduction algorithm@@ -67,7 +67,6 @@ import Control.Applicative import Control.Monad.Reader -import Data.List import Data.Map (Map) import qualified Data.Map as Map import Data.Traversable (traverse)@@ -261,7 +260,7 @@ rwr <- optRewriting <$> pragmaOptions constInfo <- unKleisli $ \f -> do info <- getConstInfo f- rewr <- getRewriteRulesFor f+ rewr <- instantiateRewriteRules =<< getRewriteRulesFor f compactDef z s pf info rewr ReduceM $ \ env -> reduceTm env (memoQName constInfo) allowNonTerminating rwr z s v @@ -527,8 +526,11 @@ -- If we reach the empty stack, then pattern matching was incomplete- match' _ f [] = {- new line here since __IMPOSSIBLE__ does not like the ' in match' -}- runReduce $+ match' _ f [] = runReduce $ do+ pds <- getPartialDefs+ if f `elem` pds+ then return (NoReduction $ NotBlocked MissingClauses es)+ else do traceSLn "impossible" 10 ("Incomplete pattern matching when applying " ++ show f) __IMPOSSIBLE__
src/full/Agda/TypeChecking/Reduce/Monad.hs view
@@ -9,7 +9,6 @@ , getConstInfo , isInstantiatedMeta , lookupMeta- , traceSLn, traceSDoc , askR, applyWhenVerboseS ) where @@ -31,7 +30,7 @@ import Agda.Syntax.Internal import Agda.TypeChecking.Monad hiding ( enterClosure, underAbstraction_, underAbstraction, addCtx, mkContextEntry,- isInstantiatedMeta, verboseS, reportSDoc, reportSLn, typeOfConst, lookupMeta )+ isInstantiatedMeta, verboseS, typeOfConst, lookupMeta ) import Agda.TypeChecking.Monad.Builtin hiding ( constructorForm ) import Agda.TypeChecking.Substitute import Agda.Interaction.Options@@ -127,12 +126,6 @@ InstV{} -> True _ -> False --- | Run a computation if a certain verbosity level is activated.------ Precondition: The level must be non-negative.-verboseS :: VerboseKey -> Int -> ReduceM () -> ReduceM ()-verboseS k n action = whenM (hasVerbosity k n) action- -- | Apply a function if a certain verbosity level is activated. -- -- Precondition: The level must be non-negative.@@ -140,43 +133,22 @@ applyWhenVerboseS :: HasOptions m => VerboseKey -> Int -> (m a -> m a) -> m a -> m a applyWhenVerboseS k n f a = ifM (hasVerbosity k n) (f a) a -traceSDoc :: VerboseKey -> Int -> TCM Doc -> ReduceM a -> ReduceM a-traceSDoc k n doc = applyWhenVerboseS k n $ \ cont -> do- ReduceEnv env st <- askR- -- return $! unsafePerformIO $ do print . fst =<< runTCM env st doc- trace (show $ fst $ unsafePerformIO $ runTCM env st doc) cont+instance MonadDebug ReduceM where --- traceSDoc :: VerboseKey -> Int -> TCM Doc -> ReduceM a -> ReduceM a--- traceSDoc k n doc = verboseS k n $ ReduceM $ do--- ReduceEnv env st <- ask--- -- return $! unsafePerformIO $ do print . fst =<< runTCM env st doc--- trace (show $ fst $ unsafePerformIO $ runTCM env st doc) $ return ()+ traceDebugMessage n s cont = do+ ReduceEnv env st <- askR+ unsafePerformIO $ do+ _ <- runTCM env st $ displayDebugMessage n s+ return $ cont -{-# SPECIALIZE traceSLn :: VerboseKey -> Int -> String -> ReduceM a -> ReduceM a #-}-traceSLn :: HasOptions m => VerboseKey -> Int -> String -> m a -> m a-traceSLn k n s = applyWhenVerboseS k n (trace s)+ formatDebugMessage k n d = do+ ReduceEnv env st <- askR+ unsafePerformIO $ do+ (s , _) <- runTCM env st $ formatDebugMessage k n d+ return $ return s instance HasConstInfo ReduceM where getRewriteRulesFor = defaultGetRewriteRulesFor (gets id)- getConstInfo q = ReduceM $ \(ReduceEnv env st) ->- let defs = st^.(stSignature . sigDefinitions)- idefs = st^.(stImports . sigDefinitions)- in case catMaybes [HMap.lookup q defs, HMap.lookup q idefs] of- [] -> trace ("Unbound name: " ++ show q ++ " " ++ showQNameId q) __IMPOSSIBLE__- [d] -> mkAbs env d- ds -> trace ("Ambiguous name: " ++ show q) __IMPOSSIBLE__- where- mkAbs env d- | treatAbstractly' q' env = fromMaybe err $ makeAbstract d- | otherwise = d- where- err = trace ("Not in scope: " ++ show q) __IMPOSSIBLE__- q' = case theDef d of- -- Hack to make abstract constructors work properly. The constructors- -- live in a module with the same name as the datatype, but for 'abstract'- -- purposes they're considered to be in the same module as the datatype.- Constructor{} -> dropLastModule q- _ -> q-- dropLastModule q@QName{ qnameModule = m } =- q{ qnameModule = mnameFromList $ ifNull (mnameToList m) __IMPOSSIBLE__ init }+ getConstInfo' q = do+ ReduceEnv env st <- askR+ defaultGetConstInfo st env q
src/full/Agda/TypeChecking/Rewriting.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE NondecreasingIndentation #-} {-# OPTIONS_GHC -fno-warn-orphans #-} @@ -62,12 +63,15 @@ import Agda.TypeChecking.Monad import Agda.TypeChecking.Monad.Builtin+import Agda.TypeChecking.Monad.Env import Agda.TypeChecking.EtaContract import Agda.TypeChecking.Free import Agda.TypeChecking.Free.Lazy import Agda.TypeChecking.MetaVars import Agda.TypeChecking.Conversion+import qualified Agda.TypeChecking.Positivity.Occurrence as Pos import Agda.TypeChecking.Pretty+import Agda.TypeChecking.Primitive ( getBuiltinName ) import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope@@ -148,7 +152,9 @@ addRewriteRule :: QName -> TCM () addRewriteRule q = do requireOptionRewriting- Def rel _ <- primRewrite+ let failNoBuiltin = typeError $ GenericError $+ "Cannot add rewrite rule without prior BUILTIN REWRITE"+ rel <- fromMaybeM failNoBuiltin $ getBuiltinName builtinRewrite def <- instantiateDef =<< getConstInfo q -- Issue 1651: Check that we are not adding a rewrite rule -- for a type signature whose body has not been type-checked yet.@@ -202,6 +208,11 @@ reportSDoc "rewriting" 30 $ text "metas in gamma1: " <+> text (show $ allMetas $ telToList gamma1) failureMetas + -- 2017-06-18, Jesper: Unfold inlined definitions on the LHS.+ -- This is necessary to replace copies created by imports by their+ -- original definition.+ lhs <- modifyAllowedReductions (const [InlineReductions]) $ normalise lhs+ -- Find head symbol f of the lhs and its arguments. (f , hd , es) <- case ignoreSharing lhs of Def f es -> return (f , Def f , es)@@ -227,7 +238,7 @@ text "Pattern generated from lhs: " <+> prettyTCM (PDef f ps) -- check that FV(rhs) ⊆ nlPatVars(lhs)- let freeVars = usedArgs gamma1 `IntSet.union` allFreeVars (ps,rhs)+ let freeVars = usedArgs (defArgOccurrences def) `IntSet.union` allFreeVars (ps,rhs) boundVars = nlPatVars ps reportSDoc "rewriting" 40 $ text "variables bound by the pattern: " <+> text (show boundVars)@@ -277,14 +288,13 @@ typeError . GenericDocError =<< do text "Rewrite rule " <+> prettyTCM q <+> text " has already been added" - usedArgs :: Telescope -> IntSet- usedArgs tel = IntSet.fromList $ map unDom $ usedIxs+ usedArgs :: [Pos.Occurrence] -> IntSet+ usedArgs occs = IntSet.fromList $ map snd $ usedIxs where- n = size tel- allIxs = zipWith ($>) (flattenTel tel) (downFrom n)- usedIxs = filter (not . unused . getRelevance) allIxs- unused UnusedArg{} = True- unused _ = False+ allIxs = zip occs $ downFrom $ size occs+ usedIxs = filter (used . fst) allIxs+ used Pos.Unused = False+ used _ = True -- | Append rewrite rules to a definition. addRewriteRules :: QName -> RewriteRules -> TCM ()@@ -299,19 +309,6 @@ -- , vcat (map prettyTCM rules) -- ] --- | Sledgehammer approach to local rewrite rules. Rebind them after each--- left-hand side (which scrambles the context).-rebindLocalRewriteRules :: TCM ()-rebindLocalRewriteRules = do- current <- currentModule- ruleMap <- use $ stSignature . sigRewriteRules- let isLocal r = m == current || m `isSubModuleOf` current- where m = qnameModule $ rewName r- ruleMap' = HMap.map (filter (not . isLocal)) ruleMap- locals = map rewName $ filter isLocal $ concat $ map reverse $ HMap.elems ruleMap- stSignature . sigRewriteRules .= ruleMap'- mapM_ addRewriteRule locals- -- | @rewriteWith t f es rew@ -- tries to rewrite @f es : t@ with @rew@, returning the reduct if successful. rewriteWith :: Maybe Type@@ -320,19 +317,20 @@ -> Elims -> ReduceM (Either (Blocked Term) Term) rewriteWith mt v rew@(RewriteRule q gamma _ ps rhs b) es = do- Red.traceSDoc "rewriting" 75 (sep+ traceSDoc "rewriting" 75 (sep [ text "attempting to rewrite term " <+> prettyTCM (v `applyE` es) , text " with rule " <+> prettyTCM rew ]) $ do- result <- nonLinMatch gamma ps es- case result of- Left block -> return $ Left $ block $> v `applyE` es -- TODO: remember reductions- Right sub -> do- let v' = applySubst sub rhs- Red.traceSDoc "rewriting" 70 (sep- [ text "rewrote " <+> prettyTCM (v `applyE` es)- , text " to " <+> prettyTCM v'- ]) $ return $ Right v'+ result <- nonLinMatch gamma ps es+ case result of+ Left block -> return $ Left $ block $> v `applyE` es -- TODO: remember reductions+ Right sub -> do+ let v' = applySubst sub rhs+ traceSDoc "rewriting" 70 (sep+ [ text "rewrote " <+> prettyTCM (v `applyE` es)+ , text " to " <+> prettyTCM v'+ ]) $ do+ return $ Right v' {- OLD CODE: -- Freeze all metas, remember which one where not frozen before.@@ -388,51 +386,31 @@ ------------------------------------------------------------------------ class NLPatVars a where+ nlPatVarsUnder :: Int -> a -> IntSet+ nlPatVars :: a -> IntSet+ nlPatVars = nlPatVarsUnder 0 instance (Foldable f, NLPatVars a) => NLPatVars (f a) where- nlPatVars = foldMap nlPatVars+ nlPatVarsUnder k = foldMap $ nlPatVarsUnder k instance NLPatVars NLPType where- nlPatVars (NLPType l a) = nlPatVars l `IntSet.union` nlPatVars a+ nlPatVarsUnder k (NLPType l a) = nlPatVarsUnder k l `IntSet.union` nlPatVarsUnder k a instance NLPatVars NLPat where- nlPatVars p =+ nlPatVarsUnder k p = case p of- PVar _ i _ -> singleton i- PDef _ es -> nlPatVars es+ PVar i _ -> singleton $ i - k+ PDef _ es -> nlPatVarsUnder k es PWild -> empty- PLam _ p' -> nlPatVars $ unAbs p'- PPi a b -> nlPatVars a `IntSet.union` nlPatVars (unAbs b)- PBoundVar _ es -> nlPatVars es+ PLam _ p' -> nlPatVarsUnder (k+1) $ unAbs p'+ PPi a b -> nlPatVarsUnder k a `IntSet.union` nlPatVarsUnder (k+1) (unAbs b)+ PBoundVar _ es -> nlPatVarsUnder k es PTerm{} -> empty rewArity :: RewriteRule -> Int rewArity = length . rewPats --- | Erase the CtxId's of rewrite rules-class KillCtxId a where- killCtxId :: a -> a--instance (Functor f, KillCtxId a) => KillCtxId (f a) where- killCtxId = fmap killCtxId--instance KillCtxId RewriteRule where- killCtxId rule@RewriteRule{ rewPats = ps } = rule{ rewPats = killCtxId ps }--instance KillCtxId NLPType where- killCtxId (NLPType l a) = NLPType (killCtxId l) (killCtxId a)--instance KillCtxId NLPat where- killCtxId p = case p of- PVar _ i bvs -> PVar Nothing i bvs- PWild -> p- PDef f es -> PDef f $ killCtxId es- PLam i x -> PLam i $ killCtxId x- PPi a b -> PPi (killCtxId a) (killCtxId b)- PBoundVar i es -> PBoundVar i $ killCtxId es- PTerm _ -> p- -- | Get all symbols that a rewrite rule matches against class GetMatchables a where getMatchables :: a -> [QName]@@ -443,7 +421,7 @@ instance GetMatchables NLPat where getMatchables p = case p of- PVar _ _ _ -> empty+ PVar _ _ -> empty PWild -> empty PDef f _ -> singleton f PLam _ x -> empty@@ -455,9 +433,9 @@ getMatchables = getMatchables . rewPats -- Only computes free variables that are not bound (i.e. those in a PTerm)-instance Free' NLPat c where+instance Free NLPat where freeVars' p = case p of- PVar _ _ _ -> mempty+ PVar _ _ -> mempty PWild -> mempty PDef _ es -> freeVars' es PLam _ u -> freeVars' u@@ -465,7 +443,7 @@ PBoundVar _ es -> freeVars' es PTerm t -> freeVars' t -instance Free' NLPType c where+instance Free NLPType where freeVars' (NLPType l a) = ifM ((IgnoreNot ==) <$> asks feIgnoreSorts) {- then -} (freeVars' (l, a))
src/full/Agda/TypeChecking/Rewriting/NonLinMatch.hs view
@@ -137,11 +137,7 @@ allBoundVars = IntSet.fromList (downFrom k) ok = not (isIrrelevant r) || IntSet.fromList (map unArg bvs) == allBoundVars- -- Pattern variables are labeled with their context id, because they- -- can only be instantiated once they're no longer bound by the- -- context (see Issue 1652).- id <- (!! i') <$> getContextId- if ok then return (PVar (Just id) i' bvs) else done+ if ok then return (PVar i bvs) else done Nothing -> done Lam i t -> PLam i <$> patternFrom r k t Lit{} -> done@@ -193,10 +189,6 @@ liftRed :: ReduceM a -> NLM a liftRed = lift . lift -instance HasOptions NLM where- pragmaOptions = liftRed pragmaOptions- commandLineOptions = liftRed commandLineOptions- runNLM :: NLM () -> ReduceM (Either Blocked_ NLMState) runNLM nlm = do (ok,out) <- runStateT (runExceptT nlm) empty@@ -204,11 +196,6 @@ Left block -> return $ Left block Right _ -> return $ Right out -traceSDocNLM :: VerboseKey -> Int -> TCM Doc -> NLM a -> NLM a-traceSDocNLM k n doc = applyWhenVerboseS k n $ \ cont -> do- ReduceEnv env st <- liftRed askR- trace (show $ fst $ unsafePerformIO $ runTCM env st doc) cont- matchingBlocked :: Blocked_ -> NLM () matchingBlocked = throwError @@ -224,8 +211,8 @@ | otherwise -> whenJustM (liftRed $ equal v v') matchingBlocked tellEq :: Telescope -> Telescope -> Term -> Term -> NLM ()-tellEq gamma k u v =- traceSDocNLM "rewriting" 60 (sep+tellEq gamma k u v = do+ traceSDoc "rewriting" 60 (sep [ text "adding equality between" <+> addContext (gamma `abstract` k) (prettyTCM u) , text " and " <+> addContext k (prettyTCM v) ]) $ do nlmEqs %= (PostponedEquation k u v:)@@ -268,7 +255,7 @@ (Apply p, Apply v) -> let r' = r `composeRelevance` getRelevance p in match r' gamma k p v (Proj _ x, Proj _ y) -> if x == y then return () else- traceSDocNLM "rewriting" 80 (sep+ traceSDoc "rewriting" 80 (sep [ text "mismatch between projections " <+> prettyTCM x , text " and " <+> prettyTCM y ]) mzero (Apply{}, Proj{} ) -> __IMPOSSIBLE__@@ -286,10 +273,10 @@ (p , Type l) -> match Irrelevant gamma k p l _ -> matchingBlocked $ NotBlocked ReallyNotBlocked () -instance (Match a b, RaiseNLP a, Subst t2 b) => Match (Abs a) (Abs b) where+instance (Match a b, Subst t1 a, Subst t2 b) => Match (Abs a) (Abs b) where match r gamma k (Abs n p) (Abs _ v) = match r gamma (ExtendTel dummyDom (Abs n k)) p v match r gamma k (Abs n p) (NoAbs _ v) = match r gamma (ExtendTel dummyDom (Abs n k)) p (raise 1 v)- match r gamma k (NoAbs n p) (Abs _ v) = match r gamma (ExtendTel dummyDom (Abs n k)) (raiseNLP 1 p) v+ match r gamma k (NoAbs n p) (Abs _ v) = match r gamma (ExtendTel dummyDom (Abs n k)) (raise 1 p) v match r gamma k (NoAbs _ p) (NoAbs _ v) = match r gamma k p v instance Match NLPat Level where@@ -301,47 +288,39 @@ let n = size k b = void vb v = ignoreBlocking vb- prettyPat = addContext (gamma `abstract` k) (prettyTCM (raisePatVars n p))+ prettyPat = addContext (gamma `abstract` k) (prettyTCM p) prettyTerm = addContext k (prettyTCM v)- traceSDocNLM "rewriting" 100 (sep+ traceSDoc "rewriting" 100 (sep [ text "matching" <+> prettyPat , text "with" <+> prettyTerm]) $ do let yes = return ()- no msg =- traceSDocNLM "rewriting" 80 (sep+ no msg = do+ traceSDoc "rewriting" 80 (sep [ text "mismatch between" <+> prettyPat , text " and " <+> prettyTerm- , msg ]) $ matchingBlocked b- block b' =- traceSDocNLM "rewriting" 80 (sep+ , msg ]) $ do+ matchingBlocked b+ block b' = do+ traceSDoc "rewriting" 80 (sep [ text "matching blocked on meta"- , text (show b) ]) $ matchingBlocked (b `mappend` b')+ , text (show b) ]) $ do+ matchingBlocked (b `mappend` b') case p of PWild -> yes- PVar id i bvs -> do- -- If the variable is still bound by the current context, we cannot- -- instantiate it so it has to match on the nose (see Issue 1652).- ctx <- zip <$> getContextNames <*> getContextId- traceSDocNLM "rewriting" 90 (text "Current context:" <+> (prettyTCM ctx)) $ do- cid <- getContextId- case (maybe Nothing (\i -> elemIndex i cid) id) of- Just j -> if v == var (j+n)- then tellSub r i (var j)- else no (text $ "(CtxId = " ++ show id ++ ")")- Nothing -> do- let allowedVars :: IntSet- allowedVars = IntSet.fromList (map unArg bvs)- isBadVar :: Int -> Bool- isBadVar i = i < n && not (i `IntSet.member` allowedVars)- perm :: Permutation- perm = Perm n $ reverse $ map unArg $ bvs- tel :: Telescope- tel = permuteTel perm k- ok <- liftRed $ reallyFree isBadVar v- case ok of- Left b -> block b- Right Nothing -> no (text "")- Right (Just v) -> tellSub r i $ teleLam tel $ renameP __IMPOSSIBLE__ perm v+ PVar i bvs -> do+ let allowedVars :: IntSet+ allowedVars = IntSet.fromList (map unArg bvs)+ isBadVar :: Int -> Bool+ isBadVar i = i < n && not (i `IntSet.member` allowedVars)+ perm :: Permutation+ perm = Perm n $ reverse $ map unArg $ bvs+ tel :: Telescope+ tel = permuteTel perm k+ ok <- liftRed $ reallyFree isBadVar v+ case ok of+ Left b -> block b+ Right Nothing -> no (text "")+ Right (Just v) -> tellSub r (i-n) $ teleLam tel $ renameP __IMPOSSIBLE__ perm v PDef f ps -> do v <- liftRed $ constructorForm =<< unLevel v case ignoreSharing v of@@ -358,7 +337,7 @@ match r gamma k qs vs _ -> no (text "") Lam i u -> do- let pbody = PDef f (raiseNLP 1 ps ++ [Apply $ Arg i $ PTerm (var 0)])+ let pbody = PDef f (raise 1 ps ++ [Apply $ Arg i $ PTerm (var 0)]) body = absBody u match r gamma (ExtendTel dummyDom (Abs (absName u) k)) pbody body MetaV m es -> do@@ -390,7 +369,7 @@ match r gamma k qs vs _ -> no (text "") Lam info u -> do- let pbody = PBoundVar i (raiseNLP 1 ps ++ [Apply $ Arg info $ PTerm (var 0)])+ let pbody = PBoundVar i (raise 1 ps ++ [Apply $ Arg info $ PTerm (var 0)]) body = absBody u match r gamma (ExtendTel dummyDom (Abs (absName u) k)) pbody body MetaV m es -> matchingBlocked $ Blocked m ()@@ -402,7 +381,7 @@ -- Returns `Right Nothing` if there are such variables, `Right (Just v')` -- if there are none (where v' is the possibly normalized version of the given -- term) or `Left b` if the problem is blocked on a meta.-reallyFree :: (Reduce a, Normalise a, Free' a FreeVars)+reallyFree :: (Reduce a, Normalise a, Free a) => (Int -> Bool) -> a -> ReduceM (Either Blocked_ (Maybe a)) reallyFree f v = do let xs = getVars v@@ -425,11 +404,11 @@ else return $ Right Nothing else return $ Right Nothing where- getVars v = runFree (\var@(i,_) -> if f i then singleton var else empty) IgnoreNot v+ getVars v = runFree (\ i -> if f i then singleton i else empty) IgnoreNot v makeSubstitution :: Telescope -> Sub -> Substitution makeSubstitution gamma sub =- prependS __IMPOSSIBLE__ (map val [0 .. size gamma-1]) EmptyS+ prependS __IMPOSSIBLE__ (map val [0 .. size gamma-1]) IdS where val i = case IntMap.lookup i sub of Just (Irrelevant, v) -> Just $ dontCare v@@ -438,7 +417,12 @@ checkPostponedEquations :: Substitution -> PostponedEquations -> ReduceM (Maybe Blocked_) checkPostponedEquations sub eqs = forM' eqs $- \ (PostponedEquation k lhs rhs) -> equal (applySubst (liftS (size k) sub) lhs) rhs+ \ (PostponedEquation k lhs rhs) -> do+ let lhs' = applySubst (liftS (size k) sub) lhs+ traceSDoc "rewriting" 60 (sep+ [ text "checking postponed equality between" , addContext k (prettyTCM lhs')+ , text " and " , addContext k (prettyTCM rhs) ]) $ do+ equal lhs' rhs -- main function nonLinMatch :: (Match a b) => Telescope -> a -> b -> ReduceM (Either Blocked_ Substitution)@@ -450,10 +434,10 @@ let sub = makeSubstitution gamma $ s^.nlmSub eqs = s^.nlmEqs traceSDoc "rewriting" 90 (text $ "sub = " ++ show sub) $ do- ok <- checkPostponedEquations sub eqs- case ok of- Nothing -> return $ Right sub- Just b -> no "checking of postponed equations" b+ ok <- checkPostponedEquations sub eqs+ case ok of+ Nothing -> return $ Right sub+ Just b -> no "checking of postponed equations" b -- | Untyped βη-equality, does not handle things like empty record types. -- Returns `Nothing` if the terms are equal, or `Just b` if the terms are not@@ -468,56 +452,14 @@ block = caseMaybe (headMaybe metas) (NotBlocked ReallyNotBlocked ()) (\m -> Blocked m ())- if ok then return Nothing else+ if ok then return Nothing else do traceSDoc "rewriting" 80 (sep [ text "mismatch between " <+> prettyTCM u , text " and " <+> prettyTCM v- ]) $ return $ Just block+ ]) $ do+ return $ Just block -- | Normalise the given term but also preserve blocking tags -- TODO: implement a more efficient version of this. normaliseB' :: (Reduce t, Normalise t) => t -> ReduceM (Blocked t) normaliseB' = normalise' >=> reduceB'---- | Raise (bound) variables in a NLPat--class RaiseNLP a where- raiseNLPFrom :: Int -> Int -> a -> a-- raiseNLP :: Int -> a -> a- raiseNLP = raiseNLPFrom 0--instance RaiseNLP a => RaiseNLP [a] where- raiseNLPFrom c k = fmap $ raiseNLPFrom c k--instance RaiseNLP a => RaiseNLP (Maybe a) where- raiseNLPFrom c k = fmap $ raiseNLPFrom c k--instance RaiseNLP a => RaiseNLP (Arg a) where- raiseNLPFrom c k = fmap $ raiseNLPFrom c k--instance RaiseNLP a => RaiseNLP (Elim' a) where- raiseNLPFrom c k = fmap $ raiseNLPFrom c k--instance RaiseNLP a => RaiseNLP (Dom a) where- raiseNLPFrom c k = fmap $ raiseNLPFrom c k--instance RaiseNLP NLPType where- raiseNLPFrom c k (NLPType l a) =- NLPType (raiseNLPFrom c k l) (raiseNLPFrom c k a)--instance RaiseNLP a => RaiseNLP (Abs a) where- raiseNLPFrom c k (Abs i p) = Abs i $ raiseNLPFrom (c+1) k p- raiseNLPFrom c k (NoAbs i p) = NoAbs i $ raiseNLPFrom c k p--instance RaiseNLP NLPat where- raiseNLPFrom c k p = case p of- PVar id i bvs -> let raise j = if j < c then j else j + k- in PVar id i $ map (fmap raise) bvs- PWild -> p- PDef f ps -> PDef f $ raiseNLPFrom c k ps- PLam i q -> PLam i $ raiseNLPFrom c k q- PPi a b -> PPi (raiseNLPFrom c k a) (raiseNLPFrom c k b)- PBoundVar i ps -> let j = if i < c then i else i + k- in PBoundVar j $ raiseNLPFrom c k ps- PTerm u -> PTerm $ raiseFrom c k u
src/full/Agda/TypeChecking/Rules/Builtin.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} module Agda.TypeChecking.Rules.Builtin ( bindBuiltin@@ -29,16 +28,20 @@ import Agda.TypeChecking.Conversion import Agda.TypeChecking.Constraints import Agda.TypeChecking.EtaContract+import Agda.TypeChecking.Functions import Agda.TypeChecking.Irrelevance import Agda.TypeChecking.Primitive import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Telescope import Agda.TypeChecking.Rules.Term ( checkExpr , inferExpr )+import Agda.TypeChecking.Warnings import {-# SOURCE #-} Agda.TypeChecking.Rules.Builtin.Coinduction import {-# SOURCE #-} Agda.TypeChecking.Rewriting import Agda.Utils.Except ( MonadError(catchError) )+import Agda.Utils.List import Agda.Utils.Maybe import Agda.Utils.Monad import Agda.Utils.Null@@ -55,7 +58,7 @@ builtinPostulate = BuiltinPostulate Relevant coreBuiltins :: [BuiltinInfo]-coreBuiltins = map (\ (x, z) -> BuiltinInfo x z)+coreBuiltins = [ (builtinList |-> BuiltinData (tset --> tset) [builtinNil, builtinCons]) , (builtinArg |-> BuiltinData (tset --> tset) [builtinArgArg]) , (builtinAbs |-> BuiltinData (tset --> tset) [builtinAbsAbs])@@ -95,12 +98,13 @@ , builtinAgdaErrorPartString |-> BuiltinDataCons (tstring --> terrorpart) , builtinAgdaErrorPartTerm |-> BuiltinDataCons (tterm --> terrorpart) , builtinAgdaErrorPartName |-> BuiltinDataCons (tqname --> terrorpart)- , (builtinEquality |-> BuiltinData (hPi "a" (el primLevel) $- hPi "A" (return $ sort $ varSort 0) $- (El (varSort 1) <$> varM 0) -->- (El (varSort 1) <$> varM 0) -->- return (sort $ varSort 1))- [builtinRefl])+ -- Andreas, 2017-01-12, issue #2386: special handling of builtinEquality+ -- , (builtinEquality |-> BuiltinData (hPi "a" (el primLevel) $+ -- hPi "A" (return $ sort $ varSort 0) $+ -- (El (varSort 1) <$> varM 0) -->+ -- (El (varSort 1) <$> varM 0) -->+ -- return (sort $ varSort 1))+ -- [builtinRefl]) , (builtinHiding |-> BuiltinData tset [builtinHidden, builtinInstance, builtinVisible]) -- Relevance , (builtinRelevance |-> BuiltinData tset [builtinRelevant, builtinIrrelevant])@@ -118,10 +122,11 @@ -- Fixity , builtinFixity |-> BuiltinData tset [builtinFixityFixity] , builtinFixityFixity |-> BuiltinDataCons (tassoc --> tprec --> tfixity)- , (builtinRefl |-> BuiltinDataCons (hPi "a" (el primLevel) $- hPi "A" (return $ sort $ varSort 0) $- hPi "x" (El (varSort 1) <$> varM 0) $- El (varSort 2) <$> primEquality <#> varM 2 <#> varM 1 <@> varM 0 <@> varM 0))+ -- Andreas, 2017-01-12, issue #2386: special handling of builtinEquality+ -- , (builtinRefl |-> BuiltinDataCons (hPi "a" (el primLevel) $+ -- hPi "A" (return $ sort $ varSort 0) $+ -- hPi "x" (El (varSort 1) <$> varM 0) $+ -- El (varSort 2) <$> primEquality <#> varM 2 <#> varM 1 <@> varM 0 <@> varM 0)) , (builtinRewrite |-> BuiltinUnknown Nothing verifyBuiltinRewrite) , (builtinNil |-> BuiltinDataCons (hPi "A" tset (el (list v0)))) , (builtinCons |-> BuiltinDataCons (hPi "A" tset (tv0 --> el (list v0) --> el (list v0))))@@ -186,7 +191,7 @@ , (builtinAgdaDefinitionFunDef |-> BuiltinDataCons (tlist tclause --> tdefn)) , (builtinAgdaDefinitionDataDef |-> BuiltinDataCons (tnat --> tlist tqname --> tdefn)) , (builtinAgdaDefinitionDataConstructor |-> BuiltinDataCons (tqname --> tdefn))- , (builtinAgdaDefinitionRecordDef |-> BuiltinDataCons (tqname --> tdefn))+ , (builtinAgdaDefinitionRecordDef |-> BuiltinDataCons (tqname --> tlist (targ tqname) --> tdefn)) , (builtinAgdaDefinitionPostulate |-> BuiltinDataCons tdefn) , (builtinAgdaDefinitionPrimitive |-> BuiltinDataCons tdefn) , builtinAgdaTCM |-> builtinPostulate (hPi "a" tlevel $ tsetL 0 --> tsetL 0)@@ -217,9 +222,10 @@ , builtinAgdaTCMCommit |-> builtinPostulate (tTCM_ primUnit) , builtinAgdaTCMIsMacro |-> builtinPostulate (tqname --> tTCM_ primBool) , builtinAgdaTCMWithNormalisation |-> builtinPostulate (hPi "a" tlevel $ hPi "A" (tsetL 0) $ tbool --> tTCM 1 (varM 0) --> tTCM 1 (varM 0))+ , builtinAgdaTCMDebugPrint |-> builtinPostulate (tstring --> tnat --> tlist terrorpart --> tTCM_ primUnit) ] where- (|->) = (,)+ (|->) = BuiltinInfo v0 = varM 0 v1 = varM 1@@ -387,27 +393,35 @@ xs <- mapM freshName_ xs addContext (xs, domFromArg $ defaultArg nat) $ f apply1 zero suc (==) (===) choice --inductiveCheck :: String -> Int -> Term -> TCM ()+-- | Checks that builtin with name @b : String@ of type @t : Term@+-- is a data type or inductive record with @n : Int@ constructors.+-- Returns the name of the data/record type.+inductiveCheck :: String -> Int -> Term -> TCM (QName, Definition) inductiveCheck b n t = do- t <- etaContract =<< normalise t- let err = typeError (NotInductive t)- case ignoreSharing t of- Def t _ -> do- t <- theDef <$> getConstInfo t- case t of- Datatype { dataInduction = Inductive- , dataCons = cs- }- | length cs == n -> return ()- | otherwise ->- typeError $ GenericError $ unwords- [ "The builtin", b- , "must be a datatype with", show n- , "constructors" ]- Record { recInduction = ind } | n == 1 && ind /= Just CoInductive -> return ()- _ -> err- _ -> err+ t <- etaContract =<< normalise t+ case ignoreSharing t of+ Def q _ -> do+ def <- getConstInfo q+ let yes = return (q, def)+ case theDef def of+ Datatype { dataInduction = Inductive, dataCons = cs }+ | length cs == n -> yes+ | otherwise -> no+ Record { recInduction = ind } | n == 1 && ind /= Just CoInductive -> yes+ _ -> no+ _ -> no+ where+ no+ | n == 1 = typeError $ GenericError $ unwords+ [ "The builtin", b+ , "must be a datatype with a single constructor"+ , "or an (inductive) record type"+ ]+ | otherwise = typeError $ GenericError $ unwords+ [ "The builtin", b+ , "must be a datatype with", show n+ , "constructors"+ ] -- | @bindPostulatedName builtin e m@ checks that @e@ is a postulated -- name @q@, and binds the builtin @builtin@ to the term @m q def@,@@ -430,28 +444,32 @@ getName (A.ScopedExpr _ e) = getName e getName _ = err -getDef :: Term -> TCM QName-getDef t = do- t <- etaContract =<< normalise t- case ignoreSharing t of- Def d _ -> return d- _ -> __IMPOSSIBLE__+-- REPLACED by TC.Functions.getDef+-- getDef :: Term -> TCM QName+-- getDef t = do+-- t <- etaContract =<< normalise t+-- case ignoreSharing t of+-- Def d _ -> return d+-- _ -> __IMPOSSIBLE__ -bindAndSetHaskellType :: String -> String -> Term -> TCM ()-bindAndSetHaskellType b hs t = do- d <- getDef t- addHaskellType d hs+addHaskellPragma :: QName -> String -> TCM ()+addHaskellPragma = addPragma ghcBackendName++bindAndSetHaskellCode :: String -> String -> Term -> TCM ()+bindAndSetHaskellCode b hs t = do+ d <- fromMaybe __IMPOSSIBLE__ <$> getDef t+ addHaskellPragma d hs bindBuiltinName b t bindBuiltinBool :: Term -> TCM ()-bindBuiltinBool = bindAndSetHaskellType builtinBool "Bool"+bindBuiltinBool = bindAndSetHaskellCode builtinBool "= type Bool" bindBuiltinInt :: Term -> TCM ()-bindBuiltinInt = bindAndSetHaskellType builtinInteger "Integer"+bindBuiltinInt = bindAndSetHaskellCode builtinInteger "= type Integer" bindBuiltinNat :: Term -> TCM () bindBuiltinNat t = do- nat <- getDef t+ nat <- fromMaybe __IMPOSSIBLE__ <$> getDef t def <- theDef <$> getConstInfo nat case def of Datatype { dataCons = [c1, c2] } -> do@@ -462,7 +480,7 @@ | otherwise = (c2, c1) tnat = el primNat rerange = setRange (getRange nat)- addHaskellType nat "Integer"+ addHaskellPragma nat "= type Integer" bindBuiltinInfo (BuiltinInfo builtinZero $ BuiltinDataCons tnat) (A.Con $ AmbQ [rerange zero]) bindBuiltinInfo (BuiltinInfo builtinSuc $ BuiltinDataCons (tnat --> tnat))@@ -471,7 +489,7 @@ bindBuiltinUnit :: Term -> TCM () bindBuiltinUnit t = do- unit <- getDef t+ unit <- fromMaybe __IMPOSSIBLE__ <$> getDef t def <- theDef <$> getConstInfo unit case def of Record { recFields = [], recConHead = con } -> do@@ -479,20 +497,75 @@ bindBuiltinName builtinUnitUnit (Con con ConOSystem []) _ -> genericError "Builtin UNIT must be a singleton record type" +-- | Bind BUILTIN EQUALITY and BUILTIN REFL.+bindBuiltinEquality :: A.Expr -> TCM ()+bindBuiltinEquality (A.ScopedExpr scope e) = do+ setScope scope+ bindBuiltinEquality e+bindBuiltinEquality e = do+ (v, _t) <- inferExpr e++ -- Equality needs to be a data type with 1 constructor+ (eq, def) <- inductiveCheck builtinEquality 1 v++ -- Check that the type is the type of a polymorphic relation, i.e.,+ -- Γ → (A : Set _) → A → A → Set _+ TelV eqTel eqCore <- telView $ defType def+ let no = genericError "The type of BUILTIN EQUALITY must be a polymorphic relation"++ -- The target is a sort since eq is a data type.+ unless (isJust $ isSort $ unEl eqCore) __IMPOSSIBLE__++ -- The types of the last two arguments must be the third-last argument+ unless (size eqTel >= 3) no+ let (a, b) = fromMaybe __IMPOSSIBLE__ $ last2 $ telToList eqTel+ [a,b] <- reduce $ map (unEl . snd . unDom) [a,b]+ unless (deBruijnView a == Just 0) no+ unless (deBruijnView b == Just 1) no++ -- Get the single constructor.+ case theDef def of+ Datatype { dataCons = [c] } -> do+ bindBuiltinName builtinEquality v++ -- Check type of REFL. It has to be of the form+ -- pars → (x : A) → Eq ... x x++ -- Check the arguments+ cdef <- getConstInfo c+ TelV conTel conCore <- telView $ defType cdef+ ts <- reduce $ map (unEl . snd . unDom) $ drop (conPars $ theDef cdef) $ telToList conTel+ -- After dropping the parameters, there should be maximally one argument.+ unless (length ts <= 1) wrongRefl+ unless (all ((Just 0 ==) . deBruijnView) ts) wrongRefl++ -- Check the target+ case ignoreSharing $ unEl conCore of+ Def _ es -> do+ let vs = map unArg $ fromMaybe __IMPOSSIBLE__ $ allApplyElims es+ (a,b) <- reduce $ fromMaybe __IMPOSSIBLE__ $ last2 vs+ unless (deBruijnView a == Just 0) wrongRefl+ unless (deBruijnView b == Just 0) wrongRefl+ bindBuiltinName builtinRefl (Con (ConHead c Inductive []) ConOSystem [])+ _ -> __IMPOSSIBLE__+ _ -> genericError "Builtin EQUALITY must be a data type with a single constructor"+ where+ wrongRefl = genericError "Wrong type of constructor of BUILTIN EQUALITY"+ bindBuiltinInfo :: BuiltinInfo -> A.Expr -> TCM () bindBuiltinInfo i (A.ScopedExpr scope e) = setScope scope >> bindBuiltinInfo i e bindBuiltinInfo (BuiltinInfo s d) e = do case d of BuiltinData t cs -> do- e' <- checkExpr e =<< t- let n = length cs- inductiveCheck s n e'- case () of- _ | s == builtinBool -> bindBuiltinBool e'- | s == builtinNat -> bindBuiltinNat e'- | s == builtinInteger -> bindBuiltinInt e'- | s == builtinUnit -> bindBuiltinUnit e'- | otherwise -> bindBuiltinName s e'+ v <- checkExpr e =<< t+ unless (s == builtinUnit) $ do+ void $ inductiveCheck s (length cs) v+ if | s == builtinEquality -> __IMPOSSIBLE__ -- bindBuiltinEquality v+ | s == builtinBool -> bindBuiltinBool v+ | s == builtinNat -> bindBuiltinNat v+ | s == builtinInteger -> bindBuiltinInt v+ | s == builtinUnit -> bindBuiltinUnit v+ | otherwise -> bindBuiltinName s v BuiltinDataCons t -> do @@ -501,16 +574,14 @@ name (Shared p) = name $ ignoreSharing (derefPtr p) name _ = __IMPOSSIBLE__ - e' <- checkExpr e =<< t+ v0 <- checkExpr e =<< t case e of A.Con{} -> return () _ -> typeError $ BuiltinMustBeConstructor s e - let v@(Con h _ []) = name e'+ let v@(Con h _ []) = name v0 c = conName h- when (s == builtinTrue) $ addHaskellCode c "Bool" "True"- when (s == builtinFalse) $ addHaskellCode c "Bool" "False" bindBuiltinName s v BuiltinPrim pfname axioms -> do@@ -536,7 +607,7 @@ BuiltinPostulate rel t -> do t' <- t- e' <- applyRelevanceToContext rel $ checkExpr e t'+ v <- applyRelevanceToContext rel $ checkExpr e t' let err = typeError $ GenericError $ "The argument to BUILTIN " ++ s ++ " must be a postulated name" case e of@@ -545,10 +616,10 @@ case theDef def of Axiom {} -> do builtinSizeHook s q t'- when (s == builtinChar) $ addHaskellType q "Char"- when (s == builtinString) $ addHaskellType q "Data.Text.Text"- when (s == builtinFloat) $ addHaskellType q "Double"- bindBuiltinName s e'+ when (s == builtinChar) $ addHaskellPragma q "= type Char"+ when (s == builtinString) $ addHaskellPragma q "= type Data.Text.Text"+ when (s == builtinFloat) $ addHaskellPragma q "= type Double"+ bindBuiltinName s v _ -> err _ -> err @@ -563,14 +634,15 @@ bindBuiltin :: String -> A.Expr -> TCM () bindBuiltin b e = do unlessM ((0 ==) <$> getContextSize) $ typeError $ BuiltinInParameterisedModule b- case b of- _ | b == builtinZero -> nowNat b- _ | b == builtinSuc -> nowNat b- _ | b == builtinInf -> bindBuiltinInf e- _ | b == builtinSharp -> bindBuiltinSharp e- _ | b == builtinFlat -> bindBuiltinFlat e- _ | Just i <- find ((b ==) . builtinName) coreBuiltins -> bindBuiltinInfo i e- _ -> typeError $ NoSuchBuiltinName b+ if | b == builtinRefl -> warning $ OldBuiltin b builtinEquality+ | b == builtinZero -> nowNat b+ | b == builtinSuc -> nowNat b+ | b == builtinInf -> bindBuiltinInf e+ | b == builtinSharp -> bindBuiltinSharp e+ | b == builtinFlat -> bindBuiltinFlat e+ | b == builtinEquality -> bindBuiltinEquality e+ | Just i <- find ((b ==) . builtinName) coreBuiltins -> bindBuiltinInfo i e+ | otherwise -> typeError $ NoSuchBuiltinName b where nowNat b = warning $ OldBuiltin b builtinNat
src/full/Agda/TypeChecking/Rules/Builtin/Coinduction.hs view
@@ -86,15 +86,15 @@ , recNamedCon = True , recFields = [] -- flat is added later , recTel = fieldTel- , recRecursive = False , recEtaEquality' = Inferred False- , recMutual = []+ , recMutual = Just [] , recAbstr = ConcreteDef } } addConstant sharp $ sharpDefn { theDef = Constructor { conPars = 2+ , conArity = 1 , conSrcCon = ConHead sharp CoInductive [] -- flat is added as field later , conData = defName infDefn , conAbstr = ConcreteDef@@ -128,13 +128,15 @@ infA = El (varSort 2) $ Def inf [ Apply $ defaultArg $ var 1 ] cpi = ConPatternInfo Nothing $ Just $ defaultArg infA let clause = Clause- { clauseRange = noRange+ { clauseLHSRange = noRange+ , clauseFullRange = noRange , clauseTel = tel , namedClausePats = [ argN $ Named Nothing $ ConP sharpCon cpi [ argN $ Named Nothing $ debruijnNamedVar "x" 0 ] ] , clauseBody = Just $ var 0 , clauseType = Just $ defaultArg $ El (varSort 2) $ var 1 , clauseCatchall = False+ , clauseUnreachable = Just False } cc = Case (defaultArg 0) $ Branches False (Map.singleton sharp@@ -142,7 +144,7 @@ Map.empty Nothing projection = Projection- { projProper = True+ { projProper = Just inf , projOrig = flat , projFromType = defaultArg inf , projIndex = 3
src/full/Agda/TypeChecking/Rules/Data.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE MultiWayIf #-} module Agda.TypeChecking.Rules.Data where @@ -10,6 +11,7 @@ import qualified Data.Set as Set import qualified Agda.Syntax.Abstract as A+import Agda.Syntax.Abstract.Views (deepUnscope) import Agda.Syntax.Internal import Agda.Syntax.Common import Agda.Syntax.Position@@ -35,6 +37,7 @@ import Agda.Utils.List import Agda.Utils.Monad import Agda.Utils.Permutation+import qualified Agda.Utils.Pretty as P import Agda.Utils.Size import Agda.Utils.Tuple import qualified Agda.Utils.VarSet as VarSet@@ -51,11 +54,6 @@ checkDataDef :: Info.DefInfo -> QName -> [A.LamBinding] -> [A.Constructor] -> TCM () checkDataDef i name ps cs = traceCall (CheckDataDef (getRange name) (qnameName name) ps cs) $ do -- TODO!! (qnameName)- let countPars A.DomainFree{} = 1- countPars (A.DomainFull (A.TypedBindings _ (Arg _ b))) = case b of- A.TLet{} -> 0- A.TBind _ xs _ -> size xs- npars = sum $ map countPars ps -- Add the datatype module addSection (qnameToMName name)@@ -68,7 +66,7 @@ t <- unTelV <$> telView t -- Top level free vars- freeVars <- getContextArgs+ freeVars <- getContextSize -- The parameters are in scope when checking the constructors. dataDef <- bindParameters ps t $ \tel t0 -> do@@ -111,10 +109,11 @@ , text "type (full): " <+> prettyTCM t , text "sort: " <+> prettyTCM s , text "indices:" <+> text (show nofIxs)- , text "params:" <+> text (show ps)+ , text "params:" <+> text (show $ deepUnscope ps) , text "small params:" <+> text (show smallPars) ] ]+ let npars = size tel -- Change the datatype from an axiom to a datatype with no constructors. let dataDef = Datatype@@ -127,10 +126,10 @@ , dataCons = [] -- Constructors are added later , dataSort = s , dataAbstr = Info.defAbstract i- , dataMutual = []+ , dataMutual = Nothing } - escapeContext (size tel) $ do+ escapeContext npars $ do addConstant name $ defaultDefn defaultArgInfo name t dataDef -- polarity and argOcc.s determined by the positivity checker@@ -145,7 +144,7 @@ -- so we apply to the free module variables. -- Unfortunately, we lose precision here, since 'abstract', which -- is then performed by addConstant, cannot restore the linearity info.- nonLinPars = Drop (size freeVars) $ Perm (npars + size freeVars) nonLinPars0+ nonLinPars = Drop freeVars $ Perm (npars + freeVars) nonLinPars0 -- Return the data definition return dataDef{ dataNonLinPars = nonLinPars }@@ -167,8 +166,6 @@ defaultDefn defaultArgInfo name t $ dataDef{ dataCons = cons } - -- Andreas 2012-02-13: postpone polarity computation until after positivity check- -- computePolarity name -- | Ensure that the type is a sort. -- If it is not directly a sort, compare it to a 'newSortMetaBelowInf'.@@ -230,7 +227,6 @@ t <- isType_ e -- check that the type of the constructor ends in the data type n <- getContextSize- -- OLD: n <- size <$> getContextTelescope debugEndsIn t d n nonLinPars <- constructs n t d debugNonLinPars nonLinPars@@ -240,15 +236,22 @@ -- is contained in the sort of the data type -- (to avoid impredicative existential types) debugFitsIn s- t' `fitsIn` s+ arity <- t' `fitsIn` s debugAdd c t' -- add parameters to constructor type and put into signature let con = ConHead c Inductive [] -- data constructors have no projectable fields and are always inductive escapeContext (size tel) $ addConstant c $- defaultDefn defaultArgInfo c (telePi tel t') $- Constructor (size tel) con d (Info.defAbstract i) Inductive []+ defaultDefn defaultArgInfo c (telePi tel t') $ Constructor+ { conPars = size tel+ , conArity = arity+ , conSrcCon = con+ , conData = d+ , conAbstr = Info.defAbstract i+ , conInd = Inductive+ , conErased = [] -- computed during compilation to treeless+ } -- Add the constructor to the instance table, if needed when (Info.defInstance i == InstanceDef) $ do@@ -268,8 +271,9 @@ ] , nest 2 $ text "nofPars =" <+> text (show n) ]- debugNonLinPars xs =- reportSDoc "tc.data.con" 15 $ text $ "these constructor parameters are non-linear: " ++ show xs+ debugNonLinPars ks =+ reportSDoc "tc.data.con" 15 $+ text "these constructor parameters are non-linear:" <+> text (show ks) debugFitsIn s = reportSDoc "tc.data.con" 15 $ sep [ text "checking that the type fits in"@@ -283,30 +287,71 @@ -- | Bind the parameters of a datatype.+--+-- We allow omission of hidden parameters at the definition site.+-- Example:+-- @+-- data D {a} (A : Set a) : Set a+-- data D A where+-- c : A -> D A+-- @+ bindParameters :: [A.LamBinding] -> Type -> (Telescope -> Type -> TCM a) -> TCM a-bindParameters [] a ret = ret EmptyTel a-bindParameters (A.DomainFull (A.TypedBindings _ (Arg info (A.TBind _ xs _))) : bs) a ret =- bindParameters (map (mergeHiding . fmap (A.DomainFree info)) xs ++ bs) a ret-bindParameters (A.DomainFull (A.TypedBindings _ (Arg info (A.TLet _ lbs))) : bs) a ret =+bindParameters = bindParameters' []++-- | Auxiliary function for 'bindParameters'.+bindParameters'+ :: [Type] -- ^ @n@ replicas of type if @LamBinding@s are @DomainFree@s+ -- that came from a @DomainFull@ of @n@ binders.+ -- Should be comsumed whenever a @DomainFree@s are consumed.+ -> [A.LamBinding] -- ^ Bindings from definition site.+ -> Type -- ^ Pi-type of bindings coming from signature site.+ -> (Telescope -> Type -> TCM a)+ -- ^ Continuation, accepting parameter telescope and rest of type.+ -- The parameters are part of the context when the continutation is invoked.+ -> TCM a++bindParameters' _ [] a ret = ret EmptyTel a++bindParameters' ts (A.DomainFull (A.TypedBindings _ (Arg info (A.TBind _ xs e))) : bs) a ret = do+ unless (null ts) __IMPOSSIBLE__+ t <- workOnTypes $ isType_ e+ bindParameters' (t <$ xs) (map (mergeHiding . fmap (A.DomainFree info)) xs ++ bs) a ret++bindParameters' _ (A.DomainFull (A.TypedBindings _ (Arg _ A.TLet{})) : _) _ _ = -- line break! __IMPOSSIBLE__-bindParameters ps0@(A.DomainFree info x : ps) (El _ (Pi arg@(Dom info' a) b)) ret- -- Andreas, 2011-04-07 ignore relevance information in binding?!- | argInfoHiding info /= argInfoHiding info' =- __IMPOSSIBLE__- | otherwise = addContext' (x, arg) $ bindParameters ps (absBody b) $ \tel s ->- ret (ExtendTel arg $ Abs (nameToArgName x) tel) s-bindParameters bs (El s (Shared p)) ret = bindParameters bs (El s $ derefPtr p) ret-bindParameters (b : bs) t _ = __IMPOSSIBLE__-{- Andreas, 2012-01-17 Concrete.Definitions ensures number and hiding of parameters to be correct--- Andreas, 2012-01-13 due to separation of data declaration/definition, the user--- could give more parameters than declared.-bindParameters (b : bs) t _ = typeError $ DataTooManyParameters--} +bindParameters' ts0 ps0@(A.DomainFree info x : ps) t ret = do+ case ignoreSharing $ unEl t of+ -- Andreas, 2011-04-07 ignore relevance information in binding?!+ Pi arg@(Dom info' a) b -> do+ if | info == info' -> do+ -- Andreas, 2016-12-30, issue #1886:+ -- If type for binding is present, check its correctness.+ ts <- caseList ts0 (return []) $ \ t0 ts -> do+ equalType t0 a+ return ts+ continue ts ps x + | visible info, notVisible info' ->+ continue ts0 ps0 =<< freshName_ (absName b)++ | otherwise -> __IMPOSSIBLE__+ -- Andreas, 2016-12-30 Concrete.Definition excludes this case+ where+ continue ts ps x = do+ addContext' (x, arg) $+ bindParameters' (raise 1 ts) ps (absBody b) $ \ tel s ->+ ret (ExtendTel arg $ Abs (nameToArgName x) tel) s+ _ -> __IMPOSSIBLE__++ -- | Check that the arguments to a constructor fits inside the sort of the datatype. -- The first argument is the type of the constructor.-fitsIn :: Type -> Sort -> TCM ()+--+-- As a side effect, return the arity of the constructor.++fitsIn :: Type -> Sort -> TCM Int fitsIn t s = do reportSDoc "tc.data.fits" 10 $ sep [ text "does" <+> prettyTCM t@@ -325,8 +370,9 @@ when (withoutK || notForced (getRelevance dom)) $ do sa <- reduce $ getSort dom unless (sa == SizeUniv) $ sa `leqSort` s- addContext (absName b, dom) $ fitsIn (absBody b) (raise 1 s)- _ -> return () -- getSort t `leqSort` s -- Andreas, 2013-04-13 not necessary since constructor type ends in data type+ addContext (absName b, dom) $ do+ succ <$> fitsIn (absBody b) (raise 1 s)+ _ -> return 0 -- getSort t `leqSort` s -- Andreas, 2013-04-13 not necessary since constructor type ends in data type where notForced Forced{} = False notForced _ = True@@ -346,23 +392,6 @@ constructs :: Int -> Type -> QName -> TCM [Int] constructs nofPars t q = constrT 0 t where-{- OLD- constrT :: Nat -> Type -> TCM ()- constrT n (El s v) = constr n s v-- constr :: Nat -> Sort -> Term -> TCM ()- constr n s v = do- v <- reduce v- case ignoreSharing v of- Pi _ (NoAbs _ b) -> constrT n b- Pi a b -> underAbstraction a b $ constrT (n + 1)- Def d vs- | d == q -> checkParams n =<< reduce (take nofPars vs)- -- we only check the parameters- _ -> bad $ El s v-- bad t = typeError $ ShouldEndInApplicationOfTheDatatype t--} constrT :: Nat -> Type -> TCM [Int] constrT n t = do t <- reduce t@@ -382,6 +411,12 @@ when (any (< 0) nl) __IMPOSSIBLE__ when (any (>= nofPars) nl) __IMPOSSIBLE__ return nl+ MetaV{} -> do+ def <- getConstInfo q+ xs <- newArgsMeta $ defType def+ let t' = El (dataSort $ theDef def) $ Def q $ map Apply xs+ equalType t t'+ constrT n t' _ -> typeError $ ShouldEndInApplicationOfTheDatatype t checkParams n vs = zipWithM_ sameVar vs ps
src/full/Agda/TypeChecking/Rules/Decl.hs view
@@ -12,15 +12,13 @@ import Data.Either (partitionEithers) import qualified Data.Foldable as Fold-import Data.List (genericLength)+import qualified Data.List as List import Data.Maybe import Data.Map (Map) import qualified Data.Sequence as Seq import qualified Data.Set as Set import Data.Set (Set) -import Agda.Compiler.HaskellTypes-import Agda.Compiler.UHC.Pragmas.Parse import Agda.Interaction.Options import Agda.Interaction.Highlighting.Generate @@ -60,6 +58,7 @@ import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope import Agda.TypeChecking.Unquote+import Agda.TypeChecking.Warnings import Agda.TypeChecking.Rules.Term import Agda.TypeChecking.Rules.Data ( checkDataDef )@@ -186,7 +185,7 @@ current <- asks envMutualBlock unless (Just blockId == current) $ do reportSLn "" 0 $ unlines- [ "mutual block id discrepancy for " ++ show x+ [ "mutual block id discrepancy for " ++ prettyShow x , " current mut. bl. = " ++ show current , " calculated mut. bl. = " ++ show blockId ]@@ -216,9 +215,12 @@ -- Post-typing checks. whenJust finalChecks $ \ theMutualChecks -> do+ reportSLn "tc.decl" 20 $ "Attempting to solve constraints before freezing."+ wakeupConstraints_ -- solve emptiness and instance constraints checkingWhere <- asks envCheckingWhere solveSizeConstraints $ if checkingWhere then DontDefaultToInfty else DefaultToInfty- wakeupConstraints_ -- solve emptiness constraints+ wakeupConstraints_ -- Size solver might have unblocked some constraints+ reportSLn "tc.decl" 20 $ "Freezing all metas." _ <- freezeMetas theMutualChecks @@ -229,7 +231,7 @@ A.Axiom A.NoFunSig i defaultArgInfo Nothing x (A.Pi (Info.ExprRange (fuseRange ps t)) ps t) - check x i m = do+ check x i m = Bench.billTo [Bench.Definition x] $ do reportSDoc "tc.decl" 5 $ text "Checking" <+> prettyTCM x <> text "." reportSLn "tc.decl.abstract" 25 $ show (Info.defAbstract i) r <- abstract (Info.defAbstract i) m@@ -250,10 +252,14 @@ -- Andreas, 2014-04-11: instantiate metas in definition types let nameList = Set.toList names mapM_ instantiateDefinitionType nameList+ -- Andreas, 2017-03-23: check positivity before termination.+ -- This allows us to reuse the information about SCCs+ -- to skip termination of non-recursive functions.+ modifyAllowedReductions (List.delete UnconfirmedReductions) $+ checkPositivity_ mi names -- Andreas, 2013-02-27: check termination before injectivity, -- to avoid making the injectivity checker loop. local (\ e -> e { envMutualBlock = Just mid }) $ checkTermination_ d- checkPositivity_ mi names revisitRecordPatternTranslation nameList -- Andreas, 2016-11-19 issue #2308 -- Andreas, 2015-03-26 Issue 1470: -- Restricting coinduction to recursive does not solve the@@ -292,7 +298,12 @@ classify q = inConcreteOrAbstractMode q $ \ def -> do case theDef def of Record{ recEtaEquality' = Inferred True } -> return $ Just $ Left q- Function{ funCompiled = Just cc } -> return $ Just $ Right (q, cc)+ Function+ { funProjection = Nothing+ -- Andreas, 2017-08-10, issue #2664:+ -- Do not record pattern translate record projection definitions!+ , funCompiled = Just cc+ } -> return $ Just $ Right (q, cc) _ -> return Nothing type FinalChecks = Maybe (TCM ())@@ -329,11 +340,14 @@ -- Precondition: name has been added to signature already. instantiateDefinitionType :: QName -> TCM () instantiateDefinitionType q = do- reportSLn "tc.decl.inst" 20 $ "instantiating type of " ++ show q- sig <- getSignature- let t = defType $ fromMaybe __IMPOSSIBLE__ $ lookupDefinition q sig- t <- instantiateFull t- modifySignature $ updateDefinition q $ \ def -> def { defType = t }+ reportSLn "tc.decl.inst" 20 $ "instantiating type of " ++ prettyShow q+ t <- defType . fromMaybe __IMPOSSIBLE__ . lookupDefinition q <$> getSignature+ t' <- instantiateFull t+ modifySignature $ updateDefinition q $ updateDefType $ const t'+ reportSDoc "tc.decl.inst" 30 $ vcat+ [ text " t = " <+> prettyTCM t+ , text " t' = " <+> prettyTCM t'+ ] -- Andreas, 2014-04-11 -- UNUSED, costs a couple of sec on the std-lib@@ -345,7 +359,7 @@ -- -- Precondition: name has been added to signature already. -- instantiateDefinition :: QName -> TCM () -- instantiateDefinition q = do--- reportSLn "tc.decl.inst" 20 $ "instantiating " ++ show q+-- reportSLn "tc.decl.inst" 20 $ "instantiating " ++ prettyShow q -- sig <- getSignature -- let def = fromMaybe __IMPOSSIBLE__ $ lookupDefinition q sig -- def <- instantiateFull def@@ -354,7 +368,7 @@ -- | Highlight a declaration. highlight_ :: A.Declaration -> TCM () highlight_ d = do- let highlight d = generateAndPrintSyntaxInfo d Full+ let highlight d = generateAndPrintSyntaxInfo d Full True Bench.billTo [Bench.Highlighting] $ case d of A.Axiom{} -> highlight d A.Field{} -> __IMPOSSIBLE__@@ -421,7 +435,7 @@ -- Andreas, 2012-02-13: Polarity computation uses info from -- positivity check, so it needs happen after positivity -- check.- mapM_ computePolarity $ Set.toList names+ computePolarity $ Set.toList names -- | Check that all coinductive records are actually recursive. -- (Otherwise, one can implement invalid recursion schemes just like@@ -457,15 +471,15 @@ case term of Just True -> do inv <- checkInjectivity q cs- modifySignature $ updateDefinition q $ const $- def { theDef = d { funInv = inv }}+ modifySignature $ updateDefinition q $ updateTheDef $ const $+ d { funInv = inv } _ -> reportSLn "tc.inj.check" 20 $- show q ++ " is not verified as terminating, thus, not considered for injectivity"+ prettyShow q ++ " is not verified as terminating, thus, not considered for injectivity" _ -> do abstr <- asks envAbstractMode reportSLn "tc.inj.check" 20 $ "we are in " ++ show abstr ++ " and " ++- show q ++ " is abstract or not a function, thus, not considered for injectivity"+ prettyShow q ++ " is abstract or not a function, thus, not considered for injectivity" -- | Check a set of mutual names for projection likeness. --@@ -479,7 +493,7 @@ -- Non-mutual definitions can be considered for -- projection likeness let ds = Set.toList names- reportSLn "tc.proj.like" 20 $ "checkDecl: checking projection-likeness of " ++ show ds+ reportSLn "tc.proj.like" 20 $ "checkDecl: checking projection-likeness of " ++ prettyShow ds case ds of [d] -> do def <- getConstInfo d@@ -488,7 +502,7 @@ case theDef def of Function{} -> makeProjection (defName def) _ -> reportSLn "tc.proj.like" 25 $- show d ++ " is abstract or not a function, thus, not considered for projection-likeness"+ prettyShow d ++ " is abstract or not a function, thus, not considered for projection-likeness" _ -> reportSLn "tc.proj.like" 25 $ "mutual definitions are not considered for projection-likeness" @@ -537,13 +551,13 @@ Nothing -> return ([], []) Just occs -> do TelV tel _ <- telView t- let n = genericLength (telToList tel)- when (n < genericLength occs) $+ let n = length (telToList tel)+ when (n < length occs) $ typeError $ TooManyPolarities x n let pols = map polFromOcc occs reportSLn "tc.polarity.pragma" 10 $- "Setting occurrences and polarity for " ++ show x ++ ":\n " ++- show occs ++ "\n " ++ show pols+ "Setting occurrences and polarity for " ++ prettyShow x ++ ":\n " +++ prettyShow occs ++ "\n " ++ prettyShow pols return (occs, pols) -- Not safe. See Issue 330@@ -595,7 +609,7 @@ do def <- getConstInfo x m <- currentModule let m' = qnameModule $ defName def- unless (m == m') $ typeError $ GenericError err+ unless (m == m' || isSubModuleOf m' m) $ typeError $ GenericError err -- | Check a pragma. checkPragma :: Range -> A.Pragma -> TCM ()@@ -604,17 +618,6 @@ A.BuiltinPragma x e -> bindBuiltin x e A.BuiltinNoDefPragma b x -> bindBuiltinNoDef b x A.RewritePragma q -> addRewriteRule q- A.CompiledDeclareDataPragma x hs -> do- def <- getConstInfo x- assertCurrentModule x $- "COMPILED_DECLARE_DATA directives must appear in the same module " ++- "as their corresponding datatype definition,"- case theDef def of- Datatype{} -> addHaskellType x hs- Axiom{} -> -- possible when the data type has only been declared yet- addHaskellType x hs- _ -> typeError $ GenericError- "COMPILED_DECLARE_DATA directive only works on data types" A.CompiledTypePragma x hs -> do def <- getConstInfo x case theDef def of@@ -628,83 +631,38 @@ assertCurrentModule x $ "COMPILED_DATA directives must appear in the same module " ++ "as their corresponding datatype definition,"- let addCompiledData cs = do- addHaskellType x hs- let computeHaskellType c = do- def <- getConstInfo c- let Constructor{ conPars = np } = theDef def- underPars 0 a = haskellType a- underPars n a = do- a <- reduce a- case unEl a of- Pi a (NoAbs _ b) -> underPars (n - 1) b- Pi a b -> underAbstraction a b $ \b -> hsForall <$> getHsVar 0 <*> underPars (n - 1) b- _ -> __IMPOSSIBLE__- ty <- underPars np $ defType def- reportSLn "tc.pragma.compile" 10 $ "Haskell type for " ++ show c ++ ": " ++ ty- return ty- hts <- mapM computeHaskellType cs- sequence_ $ zipWith3 addHaskellCode cs hts hcs case theDef def of- Datatype{dataCons = cs}- | length cs /= length hcs -> do- let n_forms_are = case length hcs of- 1 -> "1 compiled form is"- n -> show n ++ " compiled forms are"- only | null hcs = ""- | length hcs < length cs = "only "- | otherwise = ""-- err <- fsep $ [prettyTCM x] ++ pwords ("has " ++ show (length cs) ++- " constructors, but " ++ only ++ n_forms_are ++ " given [" ++ unwords hcs ++ "]")- typeError $ GenericError $ show err- | otherwise -> addCompiledData cs- Record{recConHead = ch}- | length hcs == 1 -> addCompiledData [conName ch]- | otherwise -> do- err <- fsep $ [prettyTCM x] ++ pwords ("has 1 constructor, but " ++- show (length hcs) ++ " Haskell constructors are given [" ++ unwords hcs ++ "]")- typeError $ GenericError $ show err+ Datatype{dataCons = cs} -> addHaskellData x hs hcs+ Record{recConHead = ch} -> addHaskellData x hs hcs _ -> typeError $ GenericError "COMPILED_DATA on non datatype"+ A.CompilePragma b x s -> do+ assertCurrentModule x $+ "COMPILE pragmas must appear in the same module " +++ "as their corresponding definitions,"+ addPragma b x s A.CompiledPragma x hs -> do def <- getConstInfo x+ let addCompiled = addHaskellCode x hs case theDef def of- Axiom{} -> do- ty <- haskellType $ defType def- reportSLn "tc.pragma.compile" 10 $ "Haskell type for " ++ show x ++ ": " ++ ty- addHaskellCode x ty hs- _ -> typeError $ GenericError "COMPILED directive only works on postulates"+ Axiom{} -> addCompiled+ Function{} -> addCompiled+ _ -> typeError $ GenericError "COMPILED directive only works on postulates and functions"+ A.CompiledExportPragma x hs -> do def <- getConstInfo x let correct = case theDef def of- -- Axiom{} -> do- -- ty <- haskellType $ defType def- -- reportSLn "tc.pragma.compile" 10 $ "Haskell type for " ++ show x ++ ": " ++ ty- -- addHaskellCode x ty hs Function{} -> True Constructor{} -> False _ -> False if not correct then typeError $ GenericError "COMPILED_EXPORT directive only works on functions"- else do- ty <- haskellType $ defType def- addHaskellExport x ty hs- A.CompiledEpicPragma x ep -> do- def <- getConstInfo x- case theDef def of- Axiom{} -> do- --ty <- haskellType $ defType def- --reportSLn "tc.pragma.compile" 10 $ "Haskell type for " ++ show x ++ ": " ++ ty- addEpicCode x ep- _ -> typeError $ GenericError "COMPILED_EPIC directive only works on postulates"+ else addHaskellExport x hs A.CompiledJSPragma x ep -> addJSCode x ep A.CompiledUHCPragma x cr -> do def <- getConstInfo x case theDef def of- Axiom{} -> case parseCoreExpr cr of- Left msg -> typeError $ GenericError $ "Could not parse COMPILED_UHC pragma: " ++ msg- Right cr -> addCoreCode x cr+ Axiom{} -> addCoreCode x cr _ -> typeError $ GenericError "COMPILED_UHC directive only works on postulates" -- only allow postulates for the time being A.CompiledDataUHCPragma x crd crcs -> do -- TODO mostly copy-paste from the CompiledDataPragma, should be refactored into a seperate function@@ -717,30 +675,14 @@ "COMPILED_DATA_UHC directives must appear in the same module " ++ "as their corresponding datatype definition," case theDef def of- Datatype{dataCons = cs}- | length cs /= length crcs -> do- let n_forms_are = case length crcs of- 1 -> "1 compiled form is"- n -> show n ++ " compiled forms are"- only | null crcs = ""- | length crcs < length cs = "only "- | otherwise = ""-- err <- fsep $ [prettyTCM x] ++ pwords ("has " ++ show (length cs) ++- " constructors, but " ++ only ++ n_forms_are ++ " given [" ++ unwords crcs ++ "]")- typeError $ GenericError $ show err- | otherwise -> do- -- Remark: core pragmas are not type-checked- dt' <- parseCoreData crd- cons' <- parseCoreConstrs dt' crcs- addCoreType x dt'- sequence_ $ zipWith addCoreConstr cs cons'+ Datatype{dataCons = cs} -> addCoreType x crd crcs _ -> typeError $ GenericError "COMPILED_DATA_UHC on non datatype" A.StaticPragma x -> do def <- getConstInfo x case theDef def of Function{} -> markStatic x _ -> typeError $ GenericError "STATIC directive only works on functions"+ A.InjectivePragma x -> markInjective x A.InlinePragma x -> do def <- getConstInfo x case theDef def of@@ -748,6 +690,18 @@ _ -> typeError $ GenericError "INLINE directive only works on functions" A.OptionsPragma{} -> typeError $ GenericError $ "OPTIONS pragma only allowed at beginning of file, before top module declaration" A.DisplayPragma f ps e -> checkDisplayPragma f ps e+ A.EtaPragma r -> do+ let noRecord = typeError $ GenericError $+ "ETA pragma is only applicable to coinductive records"+ caseMaybeM (isRecord r) noRecord $ \case+ Record{ recInduction = ind, recEtaEquality' = eta } -> do+ unless (ind == Just CoInductive) $ noRecord+ when (eta == Specified False) $ typeError $ GenericError $+ "ETA pragram conflicts with no-eta-equality declaration"+ _ -> __IMPOSSIBLE__+ modifySignature $ updateDefinition r $ updateTheDef $ \case+ def@Record{} -> def { recEtaEquality' = Specified True }+ _ -> __IMPOSSIBLE__ -- | Type check a bunch of mutual inductive recursive definitions. --@@ -773,6 +727,7 @@ setScope scope mapM_ checkTypeSignature ds checkTypeSignature (A.Axiom funSig i info mp x e) =+ Bench.billTo [Bench.Definition x] $ Bench.billTo [Bench.Typing, Bench.TypeSig] $ let abstr = case Info.defAccess i of PrivateAccess{}@@ -815,21 +770,21 @@ y = absName btel tel = absBody btel in case (argInfoHiding info, argInfoHiding info', name) of- (Instance, NotHidden, _) -> check tel args0- (Instance, Hidden, _) -> check tel args0- (Instance, Instance, Nothing) -> check tel args- (Instance, Instance, Just x)- | x == y -> check tel args- | otherwise -> check tel args0- (Hidden, NotHidden, _) -> check tel args0- (Hidden, Instance, _) -> check tel args0- (Hidden, Hidden, Nothing) -> check tel args+ (Instance{}, NotHidden, _) -> check tel args0+ (Instance{}, Hidden, _) -> check tel args0+ (Instance{}, Instance{}, Nothing) -> check tel args+ (Instance{}, Instance{}, Just x)+ | x == y -> check tel args+ | otherwise -> check tel args0+ (Hidden, NotHidden, _) -> check tel args0+ (Hidden, Instance{}, _) -> check tel args0+ (Hidden, Hidden, Nothing) -> check tel args (Hidden, Hidden, Just x)- | x == y -> check tel args- | otherwise -> check tel args0- (NotHidden, NotHidden, _) -> check tel args- (NotHidden, Hidden, _) -> bad- (NotHidden, Instance, _) -> bad+ | x == y -> check tel args+ | otherwise -> check tel args0+ (NotHidden, NotHidden, _) -> check tel args+ (NotHidden, Hidden, _) -> bad+ (NotHidden, Instance{}, _) -> bad -- | Check an application of a section (top-level function, includes @'traceCall'@). checkSectionApplication@@ -854,15 +809,25 @@ -- lambda-bound variables as additional parameters to the module. extraParams <- do mfv <- getCurrentModuleFreeVars- fv <- size <$> getContextTelescope+ fv <- getContextSize return (fv - mfv)- when (extraParams > 0) $ reportSLn "tc.mod.apply" 30 $ "Extra parameters to " ++ show m1 ++ ": " ++ show extraParams+ when (extraParams > 0) $ reportSLn "tc.mod.apply" 30 $ "Extra parameters to " ++ prettyShow m1 ++ ": " ++ show extraParams -- Type-check the LHS (ptel) of the module macro. checkTelescope ptel $ \ ptel -> do -- We are now in the context @ptel@.- -- Get the correct parameter telescope of @m2@.+ -- Get the correct parameter telescope of @m2@. This is the fully lifted+ -- telescope obtained by `lookupSection` instantiated with the module+ -- parameters of `m2` currently in scope. For instance+ -- ```+ -- module _ (A : Set) where+ -- module M (B : Set) where ...+ -- module M' = M B+ -- ```+ -- In the application `M' = M B`, `tel = (A B : Set)` and+ -- `moduleParamsToApply M = [A]`, so the resulting parameter telescope is+ -- `tel' = (B : Set)`. tel <- lookupSection m2- vs <- freeVarsToApply $ mnameToQName m2+ vs <- moduleParamsToApply m2 let tel' = apply tel vs -- Compute the remaining parameter telescope after stripping of -- the initial parameters that are determined by the @args@.@@ -891,7 +856,7 @@ ] -- Andreas, 2014-04-06, Issue 1094: -- Add the section with well-formed telescope.- addContext aTel $ do+ addContext (KeepNames aTel) $ do reportSDoc "tc.mod.apply" 80 $ text "addSection" <+> prettyTCM m1 <+> (getContextTelescope >>= \ tel -> inTopContext (prettyTCM tel)) addSection m1@@ -903,13 +868,13 @@ args <- instantiateFull $ vs ++ ts let n = size aTel etaArgs <- inTopContext $ addContext aTel getContextArgs- addContext' aTel $+ addContext' (KeepNames aTel) $ applySection m1 (ptel `abstract` aTel) m2 (raise n args ++ etaArgs) copyInfo checkSectionApplication' i m1 (A.RecordModuleIFS x) copyInfo = do let name = mnameToQName x tel' <- lookupSection x- vs <- freeVarsToApply name+ vs <- moduleParamsToApply x let tel = tel' `apply` vs args = teleArgs tel @@ -923,7 +888,7 @@ -- Found last parameter: switch it to @Instance@. instFinal (ExtendTel (Dom info t) (Abs n EmptyTel)) = ExtendTel (Dom ifo' t) (Abs n EmptyTel)- where ifo' = setHiding Instance info+ where ifo' = makeInstance info -- Otherwise, keep searching for last parameter: instFinal (ExtendTel arg (Abs n tel)) = ExtendTel arg (Abs n (instFinal tel))@@ -944,10 +909,10 @@ -- , nest 2 $ text "args =" <+> text (show args) ] when (tel == EmptyTel) $- typeError $ GenericError $ show (qnameToConcrete name) ++ " is not a parameterised section"+ typeError $ GenericError $ prettyShow (qnameToConcrete name) ++ " is not a parameterised section" addContext' telInst $ do- vs <- freeVarsToApply name+ vs <- moduleParamsToApply $ qnameModule name reportSDoc "tc.mod.apply" 20 $ vcat [ nest 2 $ text "vs =" <+> sep (map prettyTCM vs) , nest 2 $ text "args =" <+> sep (map (parens . prettyTCM) args)@@ -1000,7 +965,7 @@ case d of A.Section info mname tel ds -> do reportSLn "tc.decl" 45 $- "section " ++ show mname ++ " has "+ "section " ++ prettyShow mname ++ " has " ++ show (length tel) ++ " parameters and " ++ show (length ds) ++ " declarations" reportSDoc "tc.decl" 45 $ prettyA $ A.Section info mname tel []
src/full/Agda/TypeChecking/Rules/Def.hs view
@@ -10,7 +10,6 @@ import Control.Monad.Reader hiding (forM, mapM) import Data.Function-import Data.List hiding (sort) import Data.Maybe import Data.Traversable import qualified Data.Set as Set@@ -19,6 +18,7 @@ import qualified Agda.Syntax.Concrete as C import Agda.Syntax.Concrete (exprFieldA) import Agda.Syntax.Position+import Agda.Syntax.Abstract.Pattern ( containsAbsurdPattern ) import qualified Agda.Syntax.Abstract as A import qualified Agda.Syntax.Abstract.Views as A import Agda.Syntax.Internal as I@@ -40,14 +40,14 @@ import Agda.TypeChecking.Pretty import Agda.TypeChecking.Substitute import Agda.TypeChecking.Free-import Agda.TypeChecking.CheckInternal (checkType)+import Agda.TypeChecking.CheckInternal (checkType, inferSort) import Agda.TypeChecking.With import Agda.TypeChecking.Telescope import Agda.TypeChecking.Injectivity import Agda.TypeChecking.Irrelevance import Agda.TypeChecking.SizedTypes.Solve import Agda.TypeChecking.RecordPatterns-import Agda.TypeChecking.CompiledClause (CompiledClauses(..))+import Agda.TypeChecking.CompiledClause (CompiledClauses'(..)) import Agda.TypeChecking.CompiledClause.Compile import Agda.TypeChecking.Primitive hiding (Nat) @@ -57,12 +57,14 @@ import {-# SOURCE #-} Agda.TypeChecking.Rules.Decl ( checkDecls ) import Agda.Utils.Except ( MonadError(catchError, throwError) )+import Agda.Utils.Functor import Agda.Utils.Lens import Agda.Utils.Maybe ( whenNothing ) import Agda.Utils.Monad import Agda.Utils.Permutation+import Agda.Utils.Pretty ( prettyShow )+import qualified Agda.Utils.Pretty as P import Agda.Utils.Size-import Agda.Utils.Functor #include "undefined.h" import Agda.Utils.Impossible@@ -114,15 +116,15 @@ where isMeta (MetaV x _) = Just x isMeta _ = Nothing- trivialClause [A.Clause (A.LHS i (A.LHSHead f []) []) _ (A.RHS e mc) [] _] = Just (e, mc)+ trivialClause [A.Clause (A.LHS i (A.LHSHead f []) []) _ _ (A.RHS e mc) [] _] = Just (e, mc) trivialClause _ = Nothing -- | Check a trivial definition of the form @f = e@ checkAlias :: Type -> ArgInfo -> Delayed -> Info.DefInfo -> QName -> A.Expr -> Maybe C.Expr -> TCM () checkAlias t' ai delayed i name e mc = atClause name 0 (A.RHS e mc) $ do reportSDoc "tc.def.alias" 10 $ text "checkAlias" <+> vcat- [ text (show name) <+> colon <+> prettyTCM t'- , text (show name) <+> equals <+> prettyTCM e+ [ text (prettyShow name) <+> colon <+> prettyTCM t'+ , text (prettyShow name) <+> equals <+> prettyTCM e ] {-@@ -155,17 +157,25 @@ $ set funMacro (Info.defMacro i == MacroDef) $ emptyFunction { funClauses = [ Clause -- trivial clause @name = v@- { clauseRange = getRange i+ { clauseLHSRange = getRange i+ , clauseFullRange = getRange i , clauseTel = EmptyTel , namedClausePats = [] , clauseBody = Just $ bodyMod v , clauseType = Just $ Arg ai t , clauseCatchall = False+ , clauseUnreachable = Just False } ] , funCompiled = Just $ Done [] $ bodyMod v , funDelayed = delayed , funAbstr = Info.defAbstract i }++ -- Andreas, 2017-01-01, issue #2372:+ -- Add the definition to the instance table, if needed, to update its type.+ when (Info.defInstance i == InstanceDef) $ do+ addTypedInstance name t+ reportSDoc "tc.def.alias" 20 $ text "checkAlias: leaving" @@ -195,7 +205,7 @@ -> Maybe Substitution -- ^ substitution (from with abstraction) that needs to be applied to module parameters -> [A.Clause] -- ^ the clauses to check -> TCM ()-checkFunDefS t ai delayed extlam with i name withSub cs =+checkFunDefS t ai delayed extlam with i name withSub cs = do traceCall (CheckFunDef (getRange i) (qnameName name) cs) $ do -- TODO!! (qnameName) reportSDoc "tc.def.fun" 10 $@@ -236,18 +246,18 @@ inTopContext $ addClauses name [c] return c - reportSDoc "tc.def.fun" 70 $+ reportSDoc "tc.def.fun" 70 $ inTopContext $ do sep $ [ text "checked clauses:" ] ++ map (nest 2 . text . show) cs -- After checking, remove the clauses again. -- (Otherwise, @checkInjectivity@ loops for issue 801). modifyFunClauses name (const []) - reportSDoc "tc.cc" 25 $ do+ reportSDoc "tc.cc" 25 $ inTopContext $ do sep [ text "clauses before injectivity test" , nest 2 $ prettyTCM $ map (QNamed name) cs -- broken, reify (QNamed n cl) expect cl to live at top level ]- reportSDoc "tc.cc" 60 $ do+ reportSDoc "tc.cc" 60 $ inTopContext $ do sep [ text "raw clauses: " , nest 2 $ sep $ map (text . show . QNamed name) cs ]@@ -268,7 +278,7 @@ inv <- Bench.billTo [Bench.Injectivity] $ checkInjectivity name cs - reportSDoc "tc.cc" 15 $ do+ reportSDoc "tc.cc" 15 $ inTopContext $ do sep [ text "clauses before compilation" , nest 2 $ sep $ map (prettyTCM . QNamed name) cs ]@@ -282,7 +292,7 @@ cc <- Bench.billTo [Bench.Coverage] $ inTopContext $ compileClauses (Just (name, fullType)) cs - reportSDoc "tc.cc" 10 $ do+ reportSDoc "tc.cc" 60 $ inTopContext $ do sep [ text "compiled clauses of" <+> prettyTCM name , nest 2 $ text (show cc) ]@@ -307,9 +317,6 @@ , funCopatternLHS = isCopatternLHS cs } - -- Andreas 2012-02-13: postpone polarity computation until after positivity check- -- computePolarity name- reportSDoc "tc.def.fun" 10 $ do sep [ text "added " <+> prettyTCM name <+> text ":" , nest 2 $ prettyTCM . defType =<< getConstInfo name@@ -325,7 +332,7 @@ Terminating -> Just True _ -> Nothing reportSLn "tc.fundef" 30 $ unlines $- [ "funTerminates of " ++ show name ++ " set to " ++ show terminates+ [ "funTerminates of " ++ prettyShow name ++ " set to " ++ show terminates , " tc = " ++ show tc ] return $ def { theDef = fun { funTerminates = terminates }}@@ -335,8 +342,8 @@ -- | Insert some patterns in the in with-clauses LHS of the given RHS insertPatterns :: [A.Pattern] -> A.RHS -> A.RHS insertPatterns pats (A.WithRHS aux es cs) = A.WithRHS aux es (map insertToClause cs)- where insertToClause (A.Clause (A.LHS i lhscore ps) dots rhs ds catchall)- = A.Clause (A.LHS i lhscore (pats ++ ps)) dots (insertPatterns pats rhs) ds catchall+ where insertToClause (A.Clause (A.LHS i lhscore ps) dots sdots rhs ds catchall)+ = A.Clause (A.LHS i lhscore (pats ++ ps)) dots sdots (insertPatterns pats rhs) ds catchall insertPatterns pats (A.RewriteRHS qes rhs wh) = A.RewriteRHS qes (insertPatterns pats rhs) wh insertPatterns pats rhs = rhs @@ -347,6 +354,7 @@ { wfParentName :: QName -- ^ Parent function name. , wfName :: QName -- ^ With function name. , wfParentType :: Type -- ^ Type of the parent function.+ , wfParentTel :: Telescope -- ^ Context of the parent patterns. , wfBeforeTel :: Telescope -- ^ Types of arguments to the with function before the with expressions (needed vars). , wfAfterTel :: Telescope -- ^ Types of arguments to the with function after the with expressions (unneeded vars). , wfExprs :: [Term] -- ^ With and rewrite expressions.@@ -368,7 +376,7 @@ -> A.SpineClause -- ^ Clause. -> TCM Clause -- ^ Type-checked clause. -checkClause t withSub c@(A.Clause (A.SpineLHS i x aps withPats) namedDots rhs0 wh catchall) = do+checkClause t withSub c@(A.Clause (A.SpineLHS i x aps withPats) namedDots strippedDots rhs0 wh catchall) = do reportSDoc "tc.lhs.top" 30 $ text "Checking clause" $$ prettyA c unless (null withPats) $ typeError $ UnexpectedWithPatterns withPats@@ -379,7 +387,7 @@ text "namedDots:" <+> vcat [ prettyTCM x <+> text "=" <+> prettyTCM v <+> text ":" <+> prettyTCM a | A.NamedDot x v a <- namedDots ] -- Not really an as-pattern, but this does the right thing. bindAsPatterns [ AsB x v a | A.NamedDot x v a <- namedDots ] $- checkLeftHandSide (CheckPatternShadowing c) (Just x) aps t withSub $ \ lhsResult@(LHSResult npars delta ps trhs patSubst asb) -> do+ checkLeftHandSide (CheckPatternShadowing c) (Just x) aps t withSub strippedDots $ \ lhsResult@(LHSResult npars delta ps trhs patSubst asb) -> do -- Note that we might now be in irrelevant context, -- in case checkLeftHandSide walked over an irrelevant projection pattern. @@ -404,7 +412,8 @@ updateRHS (A.WithRHS q es cs) = A.WithRHS q es (map updateClause cs) updateRHS (A.RewriteRHS qes rhs wh) = A.RewriteRHS qes (updateRHS rhs) wh - updateClause (A.Clause f dots rhs wh ca) = A.Clause f (applySubst patSubst dots) (updateRHS rhs) wh ca+ updateClause (A.Clause f dots sdots rhs wh ca) =+ A.Clause f (applySubst patSubst dots) (applySubst patSubst sdots) (updateRHS rhs) wh ca (body, with) <- bindAsPatterns asb $ checkWhere wh $ checkRHS i x aps t' lhsResult rhs @@ -413,29 +422,42 @@ -- to child). inTopContext $ Bench.billTo [Bench.Typing, Bench.With] $ checkWithFunction cxtNames with - reportSDoc "tc.lhs.top" 10 $ escapeContext (size delta) $ vcat+ reportSDoc "tc.lhs.top" 10 $ vcat [ text "Clause before translation:" , nest 2 $ vcat- [ text "delta =" <+> prettyTCM delta- , text "ps =" <+> text (show ps)- , text "body =" <+> text (show body)+ [ text "delta =" <+> do escapeContext (size delta) $ prettyTCM delta+ , text "ps =" <+> do P.fsep <$> prettyTCMPatterns ps , text "body =" <+> maybe (text "_|_") prettyTCM body ] ] + reportSDoc "tc.lhs.top" 60 $ escapeContext (size delta) $ vcat+ [ text "Clause before translation (raw):"+ , nest 2 $ vcat+ [ text "ps =" <+> text (show ps)+ , text "body =" <+> text (show body)+ ]+ ]+ -- compute body modification for irrelevant definitions, see issue 610 rel <- asks envRelevance let bodyMod body = case rel of Irrelevant -> dontCare <$> body _ -> body + -- absurd clauses don't define computational behaviour, so it's fine to+ -- treat them as catchalls.+ let catchall' = catchall || isNothing body+ return $- Clause { clauseRange = getRange i+ Clause { clauseLHSRange = getRange i+ , clauseFullRange = getRange c , clauseTel = killRange delta , namedClausePats = ps , clauseBody = bodyMod body , clauseType = Just trhs- , clauseCatchall = catchall+ , clauseCatchall = catchall'+ , clauseUnreachable = Nothing -- we don't know yet } -- | Type check the @with@ and @rewrite@ lhss and/or the rhs.@@ -451,7 +473,7 @@ -- Note: the as-bindings are already bound (in checkClause) checkRHS i x aps t lhsResult@(LHSResult _ delta ps trhs _ _asb) rhs0 = handleRHS rhs0 where- absurdPat = any (containsAbsurdPattern . namedArg) aps+ absurdPat = containsAbsurdPattern aps handleRHS rhs = case rhs of @@ -504,31 +526,37 @@ t' <- reduce =<< instantiateFull eqt (eqt,rewriteType,rewriteFrom,rewriteTo) <- equalityView t' >>= \case- eqt@(EqualityType s _eq _level dom a b) -> return (eqt, El s (unArg dom), unArg a, unArg b)+ eqt@(EqualityType _s _eq _params (Arg _ dom) a b) -> do+ s <- inferSort dom+ return (eqt, El s dom, unArg a, unArg b)+ -- Note: the sort _s of the equality need not be the sort of the type @dom@! OtherType{} -> typeError . GenericDocError =<< do text "Cannot rewrite by equation of type" <+> prettyTCM t' -- Get the name of builtin REFL. Con reflCon _ [] <- ignoreSharing <$> primRefl-- -- Andreas, 2014-05-17 Issue 1110:- -- Rewriting with @refl@ has no effect, but gives an- -- incomprehensible error message about the generated- -- with clause. Thus, we rather do simply nothing if- -- rewriting with @refl@ is attempted.-- let isReflProof = do- v <- reduce proof- case ignoreSharing v of- Con c _ [] | c == reflCon -> return True- _ -> return False+ reflInfo <- fmap (setOrigin Inserted) <$> getReflArgInfo reflCon - ifM isReflProof recurse $ {- else -} do+ -- Andreas, 2017-01-11:+ -- The test for refl is obsolete after fixes of #520 and #1740.+ -- -- Andreas, 2014-05-17 Issue 1110:+ -- -- Rewriting with @refl@ has no effect, but gives an+ -- -- incomprehensible error message about the generated+ -- -- with clause. Thus, we rather do simply nothing if+ -- -- rewriting with @refl@ is attempted.+ -- let isReflProof = do+ -- v <- reduce proof+ -- case ignoreSharing v of+ -- Con c _ [] | c == reflCon -> return True+ -- _ -> return False+ -- ifM isReflProof recurse $ {- else -} do -- Process 'rewrite' clause like a suitable 'with' clause. - let reflPat = A.ConP (ConPatInfo ConOCon patNoRange) (AmbQ [conName reflCon]) []+ -- The REFL constructor might have an argument+ let reflPat = A.ConP (ConPatInfo ConOCon patNoRange) (AmbQ [conName reflCon]) $+ maybeToList $ fmap (\ ai -> Arg ai $ unnamed $ A.WildP patNoRange) reflInfo -- Andreas, 2015-12-25 Issue #1740: -- After the fix of #520, rewriting with a reflexive equation@@ -547,7 +575,7 @@ | otherwise = (A.RewriteRHS qes rhs' wh, []) -- Andreas, 2014-03-05 kill range of copied patterns -- since they really do not have a source location.- cs = [A.Clause (A.LHS i (A.LHSHead x (killRange aps)) pats) [] rhs'' outerWhere False]+ cs = [A.Clause (A.LHS i (A.LHSHead x (killRange aps)) pats) [] [] rhs'' outerWhere False] checkWithRHS x qname t lhsResult [withExpr] [withType] cs @@ -627,9 +655,9 @@ let n = size us m = size delta -- First the variables bound outside this definition- (us0, us1') = genericSplitAt (n - m) us+ (us0, us1') = splitAt (n - m) us -- Then permute the rest and grab those needed to for the with arguments- (us1, us2) = genericSplitAt (size delta1) $ permute perm' us1'+ (us1, us2) = splitAt (size delta1) $ permute perm' us1' -- Now stuff the with arguments in between and finish with the remaining variables v = Def aux $ map Apply $ us0 ++ us1 ++ map defaultArg withArgs ++ us2 -- Andreas, 2013-02-26 add with-name to signature for printing purposes@@ -654,11 +682,12 @@ reportSDoc "tc.with.top" 20 $ text " body" <+> prettyTCM v - return (Just v, WithFunction x aux t delta1 delta2 vs as t' ps npars perm' perm finalPerm cs)+ return (Just v, WithFunction x aux t delta delta1 delta2 vs as t' ps npars perm' perm finalPerm cs) +-- | Invoked in empty context. checkWithFunction :: [Name] -> WithFunctionProblem -> TCM () checkWithFunction _ NoWithFunction = return ()-checkWithFunction cxtNames (WithFunction f aux t delta1 delta2 vs as b qs npars perm' perm finalPerm cs) = do+checkWithFunction cxtNames (WithFunction f aux t delta delta1 delta2 vs as b qs npars perm' perm finalPerm cs) = do let -- Δ₁ ws Δ₂ ⊢ withSub : Δ′ (where Δ′ is the context of the parent lhs) withSub :: Substitution@@ -673,7 +702,7 @@ , text "as =" <+> addContext delta1 (prettyTCM as) , text "vs =" <+> do addContext delta1 $ prettyTCM vs , text "b =" <+> do addContext delta1 $ addContext delta2 $ prettyTCM b- , text "qs =" <+> prettyList (map pretty qs)+ , text "qs =" <+> do addContext delta $ prettyTCMPatternList qs , text "perm' =" <+> text (show perm') , text "perm =" <+> text (show perm) , text "fperm =" <+> text (show finalPerm)@@ -735,7 +764,7 @@ -- Construct the body for the with function cs <- return $ map (A.lhsToSpine) cs- cs <- buildWithFunction cxtNames f aux t qs npars withSub finalPerm (size delta1) n cs+ cs <- buildWithFunction cxtNames f aux t delta qs npars withSub finalPerm (size delta1) n cs cs <- return $ map (A.spineToLhs) cs -- Check the with function@@ -777,22 +806,6 @@ nest 4 $ text "actual tele:" <+> do prettyTCM =<< lookupSection m withCurrentModule m cont----- | Check if a pattern contains an absurd pattern. For instance, @suc ()@-containsAbsurdPattern :: A.Pattern -> Bool-containsAbsurdPattern p = case p of- A.AbsurdP _ -> True- A.VarP _ -> False- A.WildP _ -> False- A.DotP _ _ _ -> False- A.LitP _ -> False- A.AsP _ _ p -> containsAbsurdPattern p- A.ConP _ _ ps -> any (containsAbsurdPattern . namedArg) ps- A.RecP _ fs -> any (containsAbsurdPattern . (^. exprFieldA)) fs- A.ProjP{} -> False- A.DefP _ _ ps -> any (containsAbsurdPattern . namedArg) ps- A.PatternSynP _ _ _ -> __IMPOSSIBLE__ -- False -- | Set the current clause number. atClause :: QName -> Int -> A.RHS -> TCM a -> TCM a
src/full/Agda/TypeChecking/Rules/Display.hs view
@@ -3,7 +3,7 @@ import Control.Applicative import Data.Maybe-import Data.List+import qualified Data.List as List import qualified Agda.Syntax.Abstract as A import Agda.Syntax.Abstract.Views@@ -35,8 +35,8 @@ patternToTerm (namedArg p) $ \n v -> patternsToTerms EmptyTel ps $ \m vs -> ret (n + m) (inheritHiding p v : vs) patternsToTerms (ExtendTel a tel) (p : ps) ret = do- let isMatch = getHiding p == getHiding a &&- (notHidden p || isNothing (nameOf (unArg p)) ||+ let isMatch = sameHiding p a &&+ (visible p || isNothing (nameOf (unArg p)) || Just (absName tel) == (rangedThing <$> nameOf (unArg p))) case isMatch of True ->@@ -67,11 +67,11 @@ case p of A.VarP x -> bindVar x $ ret 1 (Var 0 []) A.ConP _ (AmbQ [c]) ps -> pappToTerm c (Con (ConHead c Inductive []) ConOCon) ps ret- A.ConP _ (AmbQ cs) _ -> genericError $ "Ambiguous constructor: " ++ intercalate ", " (map show cs)+ A.ConP _ (AmbQ cs) _ -> genericError $ "Ambiguous constructor: " ++ List.intercalate ", " (map show cs) A.ProjP _ _ (AmbQ [d]) -> ret 0 (Def d [])- A.ProjP _ _ (AmbQ ds) -> genericError $ "Ambiguous projection: " ++ intercalate ", " (map show ds)+ A.ProjP _ _ (AmbQ ds) -> genericError $ "Ambiguous projection: " ++ List.intercalate ", " (map show ds) A.DefP _ (AmbQ [f]) ps -> pappToTerm f (Def f . map Apply) ps ret- A.DefP _ (AmbQ ds) _ -> genericError $ "Ambiguous DefP: " ++ intercalate ", " (map show ds)+ A.DefP _ (AmbQ ds) _ -> genericError $ "Ambiguous DefP: " ++ List.intercalate ", " (map show ds) A.LitP l -> ret 0 (Lit l) A.WildP _ -> bindWild $ ret 1 (Var 0 []) _ -> do
src/full/Agda/TypeChecking/Rules/LHS.hs view
@@ -29,7 +29,7 @@ import Agda.Syntax.Internal.Pattern import Agda.Syntax.Abstract (IsProjP(..)) import qualified Agda.Syntax.Abstract as A-import Agda.Syntax.Abstract.Views (asView)+import Agda.Syntax.Abstract.Views (asView, deepUnscope) import Agda.Syntax.Common as Common import Agda.Syntax.Info as A import Agda.Syntax.Position@@ -69,6 +69,7 @@ import Agda.Utils.Maybe import Agda.Utils.Monad import Agda.Utils.Permutation+import Agda.Utils.Pretty (prettyShow) import Agda.Utils.Size #include "undefined.h"@@ -79,7 +80,7 @@ flexiblePatterns :: [NamedArg A.Pattern] -> TCM FlexibleVars flexiblePatterns nps = do forMaybeM (zip (downFrom $ length nps) nps) $ \ (i, Arg ai p) -> do- runMaybeT $ (\ f -> FlexibleVar (getHiding ai) f (Just i) i) <$> maybeFlexiblePattern p+ runMaybeT $ (\ f -> FlexibleVar (getHiding ai) (getOrigin ai) f (Just i) i) <$> maybeFlexiblePattern p -- | A pattern is flexible if it is dotted or implicit, or a record pattern -- with only flexible subpatterns.@@ -87,18 +88,28 @@ maybeFlexiblePattern :: a -> MaybeT TCM FlexibleVarKind isFlexiblePattern :: a -> TCM Bool- isFlexiblePattern p = isJust <$> runMaybeT (maybeFlexiblePattern p)+ isFlexiblePattern p =+ maybe False notOtherFlex <$> runMaybeT (maybeFlexiblePattern p)+ where+ notOtherFlex = \case+ RecordFlex fls -> all notOtherFlex fls+ ImplicitFlex -> True+ DotFlex -> True+ OtherFlex -> False instance IsFlexiblePattern A.Pattern where- maybeFlexiblePattern p =+ maybeFlexiblePattern p = do+ reportSDoc "tc.lhs.flex" 30 $ text "maybeFlexiblePattern" <+> prettyA p+ reportSDoc "tc.lhs.flex" 60 $ text "maybeFlexiblePattern (raw) " <+> (text . show . deepUnscope) p case p of A.DotP{} -> return DotFlex A.VarP{} -> return ImplicitFlex A.WildP{} -> return ImplicitFlex A.AsP _ _ p -> maybeFlexiblePattern p A.ConP _ (A.AmbQ [c]) qs- -> ifM (isNothing <$> isRecordConstructor c) mzero {-else-}+ -> ifM (isNothing <$> isRecordConstructor c) (return OtherFlex) {-else-} (maybeFlexiblePattern qs)+ A.LitP{} -> return OtherFlex _ -> mzero instance IsFlexiblePattern (I.Pattern' a) where@@ -110,6 +121,7 @@ | Just _ <- conPRecord i -> maybeFlexiblePattern ps | otherwise -> mzero I.VarP{} -> mzero+ I.AbsurdP{} -> mzero I.LitP{} -> mzero I.ProjP{} -> mzero @@ -137,7 +149,7 @@ reportSDoc "tc.lhs.top" 20 $ text "updateInPatterns" <+> nest 2 (vcat [ text "as =" <+> prettyList (map prettyTCM as) , text "ps =" <+> prettyList (map prettyA ps)- , text "qs =" <+> prettyList (map (text . show) qs)+ , text "qs =" <+> prettyList (map pretty qs) ]) first (map snd . IntMap.toDescList) <$> updates as ps qs where@@ -155,28 +167,34 @@ A.DotP _ _ e -> return (IntMap.empty, [DPI Nothing (Just e) u a]) A.WildP _ -> return (IntMap.empty, [DPI Nothing Nothing u a]) A.VarP x -> return (IntMap.empty, [DPI (Just x) Nothing u a])- A.ConP _ (A.AmbQ [c]) qs -> do- Def r es <- ignoreSharing <$> reduce (unEl $ unDom a)- let vs = fromMaybe __IMPOSSIBLE__ $ allApplyElims es- (ftel, us) <- etaExpandRecord r vs u- qs <- insertImplicitPatterns ExpandLast qs ftel- let instTel EmptyTel _ = []- instTel (ExtendTel arg tel) (u : us) = arg : instTel (absApp tel u) us- instTel ExtendTel{} [] = __IMPOSSIBLE__- bs0 = instTel ftel (map unArg us)- -- Andreas, 2012-09-19 propagate relevance info to dot patterns- bs = map (mapRelevance (composeRelevance (getRelevance a))) bs0- updates bs qs (map (DotP . unArg) us `withArgsFrom` teleArgNames ftel)+ p@(A.ConP _ (A.AmbQ [c]) qs) -> ifM (isNothing <$> isRecordConstructor c)+ (return (IntMap.empty, [DPI Nothing (Just $ A.patternToExpr p) u a]))+ (do+ Def r es <- ignoreSharing <$> reduce (unEl $ unDom a)+ let vs = fromMaybe __IMPOSSIBLE__ $ allApplyElims es+ (ftel, us) <- etaExpandRecord r vs u++ qs <- insertImplicitPatterns ExpandLast qs ftel+ reportSDoc "tc.lhs.imp" 20 $+ text "insertImplicitPatternsT returned" <+> fsep (map prettyA qs)++ let instTel EmptyTel _ = []+ instTel (ExtendTel arg tel) (u : us) = arg : instTel (absApp tel u) us+ instTel ExtendTel{} [] = __IMPOSSIBLE__+ bs0 = instTel ftel (map unArg us)+ -- Andreas, 2012-09-19 propagate relevance info to dot patterns+ bs = map (mapRelevance (composeRelevance (getRelevance a))) bs0+ updates bs qs (map (DotP . unArg) us `withArgsFrom` teleArgNames ftel))+ p@A.ConP{} -> return (IntMap.empty, [DPI Nothing (Just $ A.patternToExpr p) u a])+ p@A.LitP{} -> return (IntMap.empty, [DPI Nothing (Just $ A.patternToExpr p) u a]) A.AsP _ _ _ -> __IMPOSSIBLE__- A.ConP _ _ _ -> __IMPOSSIBLE__ A.RecP _ _ -> __IMPOSSIBLE__ A.ProjP _ _ _ -> __IMPOSSIBLE__ A.DefP _ _ _ -> __IMPOSSIBLE__ A.AbsurdP _ -> __IMPOSSIBLE__- A.LitP _ -> __IMPOSSIBLE__ A.PatternSynP _ _ _ -> __IMPOSSIBLE__ -- Case: the unifier eta-expanded the variable- ConP c cpi qs -> do+ ConP _c _cpi qs -> do Def r es <- ignoreSharing <$> reduce (unEl $ unDom a) def <- theDef <$> getConstInfo r let pars = fromMaybe __IMPOSSIBLE__ $ allApplyElims es@@ -194,15 +212,16 @@ _ -> [] second (dpi++) <$> updates as (projectInPat p fs) (map (fmap namedThing) qs)+ AbsurdP{} -> __IMPOSSIBLE__ LitP _ -> __IMPOSSIBLE__ ProjP{} -> __IMPOSSIBLE__ projectInPat :: NamedArg A.Pattern -> [Arg QName] -> [NamedArg A.Pattern] projectInPat p fs = case namedThing (unArg p) of- A.VarP x -> map (makeDotField (PatRange $ getRange x)) fs- A.ConP cpi _ nps -> nps+ A.VarP x -> map (makeWildField (PatRange $ getRange x)) fs+ A.ConP _ _ nps -> nps A.WildP pi -> map (makeWildField pi) fs- A.DotP pi _ e -> map (makeDotField pi) fs+ A.DotP pi o e -> map (makeDotField pi o) fs A.ProjP _ _ _ -> __IMPOSSIBLE__ A.DefP _ _ _ -> __IMPOSSIBLE__ A.AsP _ _ _ -> __IMPOSSIBLE__@@ -212,32 +231,41 @@ A.RecP _ _ -> __IMPOSSIBLE__ where makeWildField pi (Arg fi f) = Arg fi $ unnamed $ A.WildP pi- makeDotField pi (Arg fi f) = Arg fi $ unnamed $- A.DotP pi Inserted $ A.Underscore underscoreInfo+ makeDotField pi o (Arg fi f) = Arg fi $ unnamed $+ A.DotP pi o $ A.Underscore underscoreInfo where underscoreInfo = A.MetaInfo { A.metaRange = getRange pi , A.metaScope = emptyScopeInfo , A.metaNumber = Nothing- , A.metaNameSuggestion = show $ A.nameConcrete $ qnameName f+ , A.metaNameSuggestion = prettyShow $ qnameName f } --- | Check if a problem is solved. That is, if the patterns are all variables.+-- | Check if a problem is solved.+-- That is, if the patterns are all variables,+-- and there is no 'problemRest'. isSolvedProblem :: Problem -> Bool isSolvedProblem problem = null (restPats $ problemRest problem) &&- all (isSolved . snd . asView . namedArg) (problemInPat problem)+ problemAllVariables problem++-- | Check if a problem consists only of variable patterns.+-- (Includes the 'problemRest').+problemAllVariables :: Problem -> Bool+problemAllVariables problem =+ all (isSolved . snd . asView . namedArg) $+ restPats (problemRest problem) ++ problemInPat problem where -- need further splitting: isSolved A.ConP{} = False isSolved A.LitP{} = False isSolved A.ProjP{} = False isSolved A.RecP{} = False -- record pattern+ isSolved A.AbsurdP{} = False -- solved: isSolved A.VarP{} = True isSolved A.WildP{} = True isSolved A.DotP{} = True- isSolved A.AbsurdP{} = True -- impossible: isSolved A.DefP{} = __IMPOSSIBLE__ isSolved A.AsP{} = __IMPOSSIBLE__ -- removed by asView@@ -268,15 +296,15 @@ noShadowing (A.ProjP {}) t = return () -- projection pattern noShadowing (A.DefP {}) t = __IMPOSSIBLE__ noShadowing (A.DotP {}) t = return ()- noShadowing (A.AsP {}) t = __IMPOSSIBLE__+ noShadowing (A.AsP {}) t = __IMPOSSIBLE__ -- removed by asView noShadowing (A.LitP {}) t = __IMPOSSIBLE__ noShadowing (A.PatternSynP {}) t = __IMPOSSIBLE__ noShadowing (A.VarP x) t = do reportSDoc "tc.lhs.shadow" 30 $ vcat- [ text $ "checking whether pattern variable " ++ show x ++ " shadows a constructor"+ [ text $ "checking whether pattern variable " ++ prettyShow x ++ " shadows a constructor" , nest 2 $ text "type of variable =" <+> prettyTCM t ]- reportSLn "tc.lhs.shadow" 70 $ " t = " ++ show t+ reportSDoc "tc.lhs.shadow" 70 $ nest 2 $ text "t =" <+> pretty t t <- reduce t case t of Def t _ -> do@@ -327,11 +355,11 @@ ] applyRelevanceToContext (argInfoRelevance info) $ do u <- checkExpr e a- reportSDoc "tc.lhs.dot" 30 $+ reportSDoc "tc.lhs.dot" 50 $ sep [ text "equalTerm"- , nest 2 $ text $ show a- , nest 2 $ text $ show u- , nest 2 $ text $ show v+ , nest 2 $ pretty a+ , nest 2 $ pretty u+ , nest 2 $ pretty v ] -- Should be ok to do noConstraints here noConstraints $ equalTerm a u v@@ -397,12 +425,13 @@ A.VarP _ -> return idv A.WildP _ -> return idv A.AbsurdP _ -> return idv+ -- Andreas, 2017-01-18, issue #2413, AsP is not __IMPOSSIBLE__+ A.AsP _ _ p0 -> checkUserDot (setNamedArg p p0) v a idv A.ConP _ _ _ -> __IMPOSSIBLE__ A.LitP _ -> __IMPOSSIBLE__ A.ProjP _ _ _-> __IMPOSSIBLE__ A.DefP _ _ _ -> __IMPOSSIBLE__ A.RecP _ _ -> __IMPOSSIBLE__- A.AsP _ _ _ -> __IMPOSSIBLE__ A.PatternSynP _ _ _ -> __IMPOSSIBLE__ gatherImplicitDotVars :: DotPatternInst -> TCM [(Int,Projectns)]@@ -431,11 +460,11 @@ reportSDoc "tc.lhs.dot" 40 $ vcat [ text "undotImplicitVar" , nest 2 $ vcat- [ text $ "i = " ++ show i- , text "fs = " <+> sep (map (prettyTCM . snd) fs)- , text "a = " <+> prettyTCM a- , text $ "raw= " ++ show a- , text $ "idv= " ++ show idv+ [ text "i =" <+> pshow i+ , text "fs =" <+> sep (map (prettyTCM . snd) fs)+ , text "a =" <+> prettyTCM a+ , text "raw=" <+> pretty a+ , text "idv=" <+> pshow idv ] ] case lookupImplicitDotVar (i,fs) idv of@@ -473,9 +502,9 @@ __IMPOSSIBLE__ bindLHSVars (_ : _) EmptyTel _ = __IMPOSSIBLE__ bindLHSVars [] EmptyTel ret = ret-bindLHSVars (p : ps) (ExtendTel a tel) ret = do+bindLHSVars (p : ps) tel0@(ExtendTel a tel) ret = do -- see test/Fail/WronHidingInLHS:- unless (getHiding p == getHiding a) $ typeError WrongHidingInLHS+ unless (sameHiding p a) $ typeError WrongHidingInLHS case namedArg p of A.VarP x -> addContext (x, a) $ bindLHSVars ps (absBody tel) ret@@ -484,16 +513,14 @@ -- introduces unwanted underscores in error messages -- (Andreas, 2015-05-28) A.DotP _ _ _ -> bindDummy (absName tel)- A.AbsurdP pi -> do- -- Andreas, 2012-03-15: allow postponement of emptyness check- isEmptyType (getRange pi) $ unDom a- -- OLD CODE: isReallyEmptyType $ unArg a- bindDummy (absName tel)+ A.AbsurdP pi -> __IMPOSSIBLE__+ -- Andreas, 2017-01-18, issue #2413+ -- A.AsP is not __IMPOSSIBLE__+ A.AsP _ _ p0 -> bindLHSVars (setNamedArg p p0 : ps) tel0 ret A.ConP{} -> __IMPOSSIBLE__ A.RecP{} -> __IMPOSSIBLE__ A.ProjP{} -> __IMPOSSIBLE__ A.DefP{} -> __IMPOSSIBLE__- A.AsP{} -> __IMPOSSIBLE__ A.LitP{} -> __IMPOSSIBLE__ A.PatternSynP{} -> __IMPOSSIBLE__ where@@ -560,16 +587,18 @@ -- ^ The expected type @a = Γ → b@. -> Maybe Substitution -- ^ Module parameter substitution from with-abstraction.+ -> [A.StrippedDotPattern]+ -- ^ Dot patterns that have been stripped away by with-desugaring. -> (LHSResult -> TCM a) -- ^ Continuation. -> TCM a-checkLeftHandSide c f ps a withSub' = Bench.billToCPS [Bench.Typing, Bench.CheckLHS] $ \ ret -> do+checkLeftHandSide c f ps a withSub' strippedDots = Bench.billToCPS [Bench.Typing, Bench.CheckLHS] $ \ ret -> do -- To allow module parameters to be refined by matching, we're adding the -- context arguments as wildcard patterns and extending the type with the -- context telescope. cxt <- reverse <$> getContext- let tel = telFromList' show cxt+ let tel = telFromList' prettyShow cxt cps = [ unnamed . A.VarP . fst <$> setOrigin Inserted (argFromDom d) | d <- cxt ] problem0 <- problemFromPats (cps ++ ps) (telePi tel a)@@ -593,8 +622,8 @@ -- doing the splits: inTopContext $ do- LHSState problem@(Problem pxs qs delta rest) dpi- <- checkLHS f $ LHSState problem0 []+ LHSState problem@(Problem pxs qs delta rest) dpi sbe+ <- checkLHS f $ LHSState problem0 [] [] unless (null $ restPats rest) $ typeError $ TooManyArgumentsInLHS a @@ -627,9 +656,9 @@ reportSDoc "tc.lhs.top" 10 $ text "asb' = " <+> (brackets $ fsep $ punctuate comma $ map prettyTCM asb') reportSDoc "tc.lhs.top" 10 $ text "bound pattern variables"- reportSDoc "tc.lhs.top" 60 $ nest 2 $ text "context = " <+> ((text . show) =<< getContext)+ reportSDoc "tc.lhs.top" 60 $ nest 2 $ text "context = " <+> (pretty =<< getContextTelescope) reportSDoc "tc.lhs.top" 10 $ nest 2 $ text "type = " <+> prettyTCM b'- reportSDoc "tc.lhs.top" 60 $ nest 2 $ text "type = " <+> text (show b')+ reportSDoc "tc.lhs.top" 60 $ nest 2 $ text "type = " <+> pretty b' let notProj ProjP{} = False notProj _ = True@@ -643,12 +672,12 @@ withSub = fromMaybe (wkS (numPats - length cxt) idS) withSub' -- At this point we need to update the module parameters for all -- parent modules.- patSub = (map (patternToTerm . namedArg) $ reverse $ take numPats qs) ++# EmptyS+ patSub = (map (patternToTerm . namedArg) $ reverse $ take numPats qs) ++# (EmptyS __IMPOSSIBLE__) paramSub = composeS patSub withSub lhsResult = LHSResult (length cxt) delta qs b' patSub asb'- reportSDoc "tc.lhs.top" 20 $ nest 2 $ text "patSub = " <+> text (show patSub)- reportSDoc "tc.lhs.top" 20 $ nest 2 $ text "withSub = " <+> text (show withSub)- reportSDoc "tc.lhs.top" 20 $ nest 2 $ text "paramSub = " <+> text (show paramSub)+ reportSDoc "tc.lhs.top" 20 $ nest 2 $ text "patSub = " <+> pretty patSub+ reportSDoc "tc.lhs.top" 20 $ nest 2 $ text "withSub = " <+> pretty withSub+ reportSDoc "tc.lhs.top" 20 $ nest 2 $ text "paramSub = " <+> pretty paramSub let newLets = [ AsB x (applySubst paramSub v) (applySubst paramSub $ unDom a) | (x, (v, a)) <- oldLets ] reportSDoc "tc.lhs.top" 50 $ text "old let-bindings:" <+> text (show oldLets)@@ -658,12 +687,16 @@ applyRelevanceToContext (getRelevance b') $ updateModuleParameters paramSub $ do bindAsPatterns asb' $ do - rebindLocalRewriteRules- -- Check dot patterns mapM_ checkDotPattern dpi+ mapM_ (uncurry isEmptyType) sbe checkLeftoverDotPatterns pxs (downFrom $ size delta) (flattenTel delta) dpi + -- Type check dot patterns that have been thrown away by+ -- with-desugaring.+ mapM_ checkStrippedDotPattern $ applySubst paramSub strippedDots++ -- Issue2303: don't bind asb' for the continuation (return in lhsResult instead) ret lhsResult @@ -672,7 +705,7 @@ :: Maybe QName -- ^ The name of the definition we are checking. -> LHSState -- ^ The current state. -> TCM LHSState -- ^ The final state after all splitting is completed-checkLHS f st@(LHSState problem dpi) = do+checkLHS f st@(LHSState problem dpi sbe) = do problem <- insertImplicitProblem problem -- Note: inserting implicits no longer preserve solvedness,@@ -680,17 +713,18 @@ if isSolvedProblem problem then return $ st { lhsProblem = problem } else do unlessM (optPatternMatching <$> gets getPragmaOptions) $- typeError $ GenericError $ "Pattern matching is disabled"+ unless (problemAllVariables problem) $+ typeError $ GenericError $ "Pattern matching is disabled" foldListT trySplit nothingToSplit $ splitProblem f problem where-+ nothingToSplit :: TCM LHSState nothingToSplit = do reportSLn "tc.lhs.split" 50 $ "checkLHS: nothing to split in problem " ++ show problem nothingToSplitError problem -- Split problem rest (projection pattern, does not fail as there is no call to unifier)-+ trySplit :: SplitProblem -> TCM LHSState -> TCM LHSState trySplit (SplitRest projPat o projType) _ = do -- Compute the new problem@@ -701,7 +735,7 @@ ip' = ip ++ [fmap (Named Nothing . ProjP o) projPat] problem' = Problem ps' ip' delta rest -- Jump the trampolin- st' <- updateProblemRest (LHSState problem' dpi)+ st' <- updateProblemRest (LHSState problem' dpi sbe) -- If the field is irrelevant, we need to continue in irr. cxt. -- (see Issue 939). applyRelevanceToContext (getRelevance projPat) $ do@@ -721,6 +755,7 @@ -- ++ [ raise (size delta2) $ Lit lit ] -- ++ [ var i | i <- [size delta2 ..] ] dpi' = applyPatSubst rho dpi+ sbe' = map (second $ applyPatSubst rho) sbe ip' = applySubst rho ip rest' = applyPatSubst rho (problemRest problem) @@ -728,47 +763,42 @@ let ps' = problemInPat p0 ++ problemInPat (absBody p1) delta' = abstract delta1 delta2 problem' = Problem ps' ip' delta' rest'- st' <- updateProblemRest (LHSState problem' dpi')+ st' <- updateProblemRest (LHSState problem' dpi' sbe') checkLHS f st' - -- Split on constructor pattern (unifier might fail)-- trySplit (Split p0 focus@(Arg info Focus{}) p1) tryNextSplit = do- res <- trySplitConstructor p0 focus p1- case res of- -- Success. Continue checking LHS.- Unifies st' -> checkLHS f st'- -- Mismatch. Report and abort.- NoUnify tcerr -> throwError tcerr- -- Unclear situation. Try next split.- -- If no split works, give error from first split.- -- This is conservative, but might not be the best behavior.- -- It might be better to collect all the errors and print all of them.- DontKnow tcerr -> tryNextSplit `catchError` \ _ -> throwError tcerr-- whenUnifies- :: UnificationResult' a- -> (a -> TCM (UnificationResult' b))- -> TCM (UnificationResult' b)- whenUnifies res cont = do- case res of- Unifies a -> cont a- NoUnify tcerr -> return $ NoUnify tcerr- DontKnow tcerr -> return $ DontKnow tcerr+ -- Split on absurd pattern (adding type to list of types that should be empty)+ trySplit (Split p0 (Arg info (AbsurdFocus pi i a)) p1) _ = do+ let tel = problemTel problem+ reportSDoc "tc.lhs.split.absurd" 10 $ sep+ [ text "splitting on absurd pattern"+ , nest 2 $ text "tel =" <+> prettyTCM tel+ , nest 2 $ text "var =" <+> addContext tel (prettyTCM $ var i)+ , nest 2 $ text "type =" <+> addContext tel (prettyTCM a)+ ]+ let rho = liftS i $ consS (AbsurdP $ VarP $ DBPatVar "()" 0) $ raiseS 1+ checkLHS f $ st+ { lhsProblem = problem+ { problemInPat = (problemInPat p0) +++ [Arg info $ unnamed $ A.WildP pi] +++ problemInPat (absBody p1)+ , problemOutPat = applySubst rho $ problemOutPat problem+ }+ , lhsShouldBeEmptyTypes = (getRange pi , a) : lhsShouldBeEmptyTypes st+ } - trySplitConstructor p0 (Arg info LitFocus{}) p1 = __IMPOSSIBLE__- trySplitConstructor p0 (Arg info- (Focus { focusCon = c- , focusPatOrigin= porigin- , focusConArgs = qs- , focusRange = r- , focusOutPat = ip- , focusDatatype = d- , focusParams = vs- , focusIndices = ws- , focusType = a- }- )) p1 = do+ -- Split on constructor pattern (unifier might fail)+ trySplit (Split p0 (Arg info+ (Focus { focusCon = c+ , focusPatOrigin= porigin+ , focusConArgs = qs+ , focusRange = r+ , focusOutPat = ip+ , focusDatatype = d+ , focusParams = vs+ , focusIndices = ws+ , focusType = a+ }+ )) p1) tryNextSplit = do traceCall (CheckPattern (A.ConP (ConPatInfo porigin $ PatRange r) (A.AmbQ [c]) qs) (problemTel p0) (El Prop $ Def d $ map Apply $ vs ++ ws)) $ do@@ -788,12 +818,15 @@ , nest 2 $ vcat [ text "delta1 = " <+> prettyTCM delta1 , text "typeOfSplitVar =" <+> addContext delta1 (prettyTCM typeOfSplitVar)- , text "focusOutPat =" <+> (text . show) ip+ , text "focusOutPat =" <+> pretty ip , text "delta2 = " <+> addContext delta1 (addContext ("x",domFromArg typeOfSplitVar) (prettyTCM delta2)) ] ] - c <- (`withRangeOf` c) <$> getConForm c+ c <- either+ (sigError __IMPOSSIBLE_VERBOSE__ (typeError $ AbstractConstructorNotInScope c))+ (return . (`withRangeOf` c))+ =<< getConForm c ca <- defType <$> getConInfo c reportSDoc "tc.lhs.split" 20 $ nest 2 $ vcat@@ -824,6 +857,8 @@ -- Insert implicit patterns qs' <- insertImplicitPatterns ExpandLast qs gamma'+ reportSDoc "tc.lhs.imp" 20 $+ text "insertImplicitPatternsT returned" <+> fsep (map prettyA qs') unless ((size qs' :: Int) == size gamma') $ typeError $ WrongNumberOfConstructorArguments (conName c) (size gamma') (size qs')@@ -832,13 +867,18 @@ -- Get the type of the datatype. da <- (`piApply` vs) . defType <$> getConstInfo d+ reportSDoc "tc.lhs.split" 30 $ text " da = " <+> prettyTCM da -- Compute the flexible variables flex <- flexiblePatterns (problemInPat p0 ++ qs')+ reportSDoc "tc.lhs.split" 30 $ text "computed flexible variables" -- Compute the constructor indices by dropping the parameters let us' = drop (size vs) us + -- Raise given indices over constructor telescope+ let ws' = raise (size gamma) ws+ reportSDoc "tc.lhs.top" 15 $ addContext delta1 $ sep [ text "preparing to unify" , nest 2 $ vcat@@ -884,9 +924,23 @@ flex (raise (size gamma) da) us'- (raise (size gamma) ws)- whenUnifies res $ \ (delta1',rho0,es) -> do+ ws'+ case res of + -- Mismatch. Report and abort.+ NoUnify neg -> typeError $ ImpossibleConstructor (conName c) neg++ -- Unclear situation. Try next split.+ -- If no split works, give error from first split.+ -- This is conservative, but might not be the best behavior.+ -- It might be better to collect all the errors and print all of them.+ DontKnow errs -> tryNextSplit+ `catchError` \ _ -> typeError $ SplitError $+ UnificationStuck (conName c) (delta1 `abstract` gamma) us' ws' errs++ -- Success.+ Unifies (delta1',rho0,es) -> do+ reportSDoc "tc.lhs.top" 15 $ text "unification successful" reportSDoc "tc.lhs.top" 20 $ nest 2 $ vcat [ text "delta1' =" <+> prettyTCM delta1'@@ -910,7 +964,7 @@ newPats reportSDoc "tc.lhs.top" 20 $ addContext delta1' $ nest 2 $ vcat- [ text "p0' =" <+> text (show p0')+ [ text "p0' =" <+> text (show $ deepUnscope p0') , text "newDpi =" <+> brackets (fsep $ punctuate comma $ map prettyTCM newDpi) ] @@ -944,9 +998,9 @@ ] reportSDoc "tc.lhs.top" 70 $ addContext delta1' $ nest 2 $ vcat- [ text "crho2 =" <+> text (show crho2)- , text "rho3 =" <+> text (show rho3)- , text "delta2' =" <+> text (show delta2')+ [ text "crho2 =" <+> pretty crho2+ , text "rho3 =" <+> pretty rho3+ , text "delta2' =" <+> pretty delta2' ] reportSDoc "tc.lhs.top" 15 $ nest 2 $ vcat@@ -964,10 +1018,12 @@ -- The final dpis are the new ones plus the old ones substituted by ρ let dpi' = applyPatSubst rho dpi ++ raise (size delta2') newDpi+ sbe' = map (second $ applyPatSubst rho) sbe reportSDoc "tc.lhs.top" 15 $ addContext delta' $ nest 2 $ vcat [ text "dpi' =" <+> brackets (fsep $ punctuate comma $ map prettyTCM dpi')+ , text "sbe' =" <+> brackets (fsep $ punctuate comma $ map prettyTCM sbe') ] -- Apply the substitution@@ -976,25 +1032,25 @@ reportSDoc "tc.lhs.top" 15 $ addContext delta' $ nest 2 $ vcat- [ text "ip' =" <+> text (show ip) ]+ [ text "ip' =" <+> pretty ip ] -- Construct the new problem let problem' = Problem ps' ip' delta' rest' -- if rest type reduces, -- extend the split problem by previously not considered patterns- st'@(LHSState problem'@(Problem ps' ip' delta' rest') dpi')- <- updateProblemRest $ LHSState problem' dpi'+ st'@(LHSState problem'@(Problem ps' ip' delta' rest') dpi' sbe')+ <- updateProblemRest $ LHSState problem' dpi' sbe' reportSDoc "tc.lhs.top" 12 $ sep [ text "new problem from rest" , nest 2 $ vcat [ text "ps' =" <+> fsep (map prettyA ps') , text "delta' =" <+> prettyTCM delta'- , text "ip' =" <+> text (show ip')+ , text "ip' =" <+> pretty ip' ] ]- return $ Unifies st'+ checkLHS f st' -- | Ensures that we are not performing pattern matching on codata.@@ -1004,6 +1060,7 @@ where check (VarP {}) = return () check (DotP {}) = return ()+ check (AbsurdP{}) = return () check (ProjP{}) = return () check (LitP {}) = return () -- Literals are assumed not to be coinductive. check (ConP con _ ps) = do@@ -1014,3 +1071,15 @@ Just False -> mapM_ (check . namedArg) ps Just True -> typeError $ GenericError "Pattern matching on coinductive types is not allowed"++-- | Type check dot pattern stripped from a with function.+checkStrippedDotPattern :: A.StrippedDotPattern -> TCM ()+checkStrippedDotPattern (A.StrippedDot e v a) = do+ reportSDoc "tc.with.dot" 30 $ vcat+ [ text "Checking stripped dot pattern"+ , nest 2 $ vcat [ text "e =" <+> prettyTCM e+ , text "v =" <+> prettyTCM v+ , text "a =" <+> prettyTCM a+ , text "Γ =" <+> (inTopContext . prettyTCM =<< getContextTelescope) ] ]+ u <- checkExpr e a+ equalTerm a u v
src/full/Agda/TypeChecking/Rules/LHS/AsPatterns.hs view
@@ -8,9 +8,10 @@ import qualified Data.Foldable as Fold import Agda.Syntax.Common+import Agda.Syntax.Concrete () import Agda.Syntax.Internal import Agda.Syntax.Internal.Pattern-import Agda.Syntax.Concrete ()+import Agda.Syntax.Abstract.Pattern ( containsAsPattern ) import qualified Agda.Syntax.Abstract as A import Agda.TypeChecking.Monad@@ -23,6 +24,7 @@ import Agda.TypeChecking.Pretty import Agda.TypeChecking.Reduce +import Agda.Utils.Functor import Agda.Utils.Maybe import Agda.Utils.Size import Agda.Utils.Impossible@@ -31,7 +33,7 @@ recoverAsPatterns :: Telescope -> Type -> Term -> [NamedArg A.Pattern] -> [NamedArg DeBruijnPattern] -> TCM [AsBinding] recoverAsPatterns delta a self ps qs = do let es = patternsToElims qs- as <- smashType (raise (size delta) a) self es+ as <- typeElims (raise (size delta) a) self es ps <- insertImplicitPatternsT DontExpandLast ps a reportSDoc "tc.lhs.as" 30 $ vcat [ text "recovering as patterns"@@ -41,43 +43,20 @@ ] execWriterT $ asPatterns as ps es --- ProjT stores the type of the projected field.-data ElimType = ProjT Type | ArgT Type--instance PrettyTCM ElimType where- prettyTCM (ProjT a) = text "." <> prettyTCM a- prettyTCM (ArgT a) = prettyTCM a--smashType :: Type -> Term -> Elims -> TCM [ElimType]-smashType a _ [] = return []-smashType a self (e : es) =- case e of- Apply v -> do- Pi a b <- ignoreSharing <$> reduce (unEl a)- (ArgT (unDom a) :) <$> smashType (absApp b $ unArg v) (self `applyE` [e]) es- Proj o f -> do- a <- reduce a- Just (_, self, a) <- projectTyped self a o f- (ProjT a :) <$> smashType a self es--smashTel :: Telescope -> [Term] -> [Type]-smashTel _ [] = []-smashTel (ExtendTel a tel) (v : vs) = unDom a : smashTel (absApp tel v) vs-smashTel EmptyTel{} (_:_) = __IMPOSSIBLE__- asPatterns :: [ElimType] -> [NamedArg A.Pattern] -> [Elim] -> WriterT [AsBinding] TCM () asPatterns _ [] _ = return ()-asPatterns (ProjT a : as) (p : ps) (Proj{} : vs) = do+asPatterns (ProjT _ a : as) (p : ps) (Proj{} : vs) = do unless (isJust $ A.maybePostfixProjP p) __IMPOSSIBLE__ -- sanity check ps <- lift $ insertImplicitPatternsT DontExpandLast ps a asPatterns as ps vs-asPatterns (ArgT a : as) (p : ps) (Apply v : vs)- | noAsPatterns (namedArg p) = asPatterns as ps vs- | otherwise =+asPatterns (ArgT dom : as) (p : ps) (Apply v : vs)+ | not $ containsAsPattern p = asPatterns as ps vs+ | otherwise = do+ let a = unDom dom case namedArg p of A.AsP _ x p' -> do tell [AsB x (unArg v) a]- asPatterns (ArgT a : as) (fmap (p' <$) p : ps) (Apply v : vs)+ asPatterns (ArgT dom : as) (fmap (p' <$) p : ps) (Apply v : vs) A.ConP _ _ ps' -> do (_, _, tel, as', args) <- lift $ conPattern a (unArg v) ps' <- lift $ insertImplicitPatterns ExpandLast ps' tel@@ -91,27 +70,21 @@ _ -> __IMPOSSIBLE__ asPatterns _ _ _ = __IMPOSSIBLE__ -conPattern :: Type -> Term -> TCM (QName, ConHead, Telescope, [Type], Args)+-- | Given a fully applied constructor term and its type,+-- deconstruct it and return, amongst others, the types of its arguments.+conPattern+ :: Type -- ^ Type need not be reduced.+ -> Term -- ^ Fully applied constructor.+ -> TCM (QName, ConHead, Telescope, [Dom Type], Args)+ -- ^ Data/record type name,+ -- constructor name,+ -- argument telescope,+ -- types of arguments.+ -- arguments. conPattern a (Con c ci args) = do- Just ca <- getConType c =<< reduce a- TelV tel (El _ (Def d _)) <- telView ca- let as = smashTel tel (map unArg args)+ -- @getFullyAppliedConType@ works since @c@ is fully applied.+ ((d, _, _), ca) <- fromMaybe __IMPOSSIBLE__ <.> getFullyAppliedConType c =<< reduce a+ TelV tel _ <- telView ca+ let as = fromMaybe __IMPOSSIBLE__ $ typeArgsWithTel tel $ map unArg args return (d, c, tel, as, args) conPattern _ _ = __IMPOSSIBLE__--noAsPatterns :: A.Pattern -> Bool-noAsPatterns p =- case p of- A.AsP{} -> False- A.ConP _ _ ps -> noArgAsPats ps- A.DefP _ _ ps -> noArgAsPats ps- A.RecP _ fs -> all (Fold.all noAsPatterns) fs- A.VarP{} -> True- A.ProjP{} -> True- A.WildP{} -> True- A.DotP{} -> True- A.AbsurdP{} -> True- A.LitP{} -> True- A.PatternSynP{} -> __IMPOSSIBLE__- where- noArgAsPats = all (noAsPatterns . namedArg)
src/full/Agda/TypeChecking/Rules/LHS/Implicit.hs view
@@ -58,7 +58,7 @@ -- (record constructor applied to as many implicit patterns as there are fields). expandImplicitPattern' :: Type -> NamedArg A.Pattern -> TCM (Maybe (NamedArg A.Pattern)) expandImplicitPattern' a p- | A.WildP{} <- namedArg p, getHiding p /= Instance = do+ | A.WildP{} <- namedArg p, not (isInstance p) = do -- Eta expand implicit patterns of record type (issue 473), -- but not instance arguments since then they won't be found -- by the instance search
src/full/Agda/TypeChecking/Rules/LHS/Instantiate.hs view
@@ -32,8 +32,7 @@ reportSDoc "tc.lhs.inst" 10 $ vcat [ text "instantiateTel " , nest 2 $ text "s =" <+> do- addContext tel $- fsep $ punctuate comma $ map (maybe (text "_") prettyTCM) s+ addContext tel $ fsep $ punctuate comma $ map (maybe (text "_") prettyTCM) s , nest 2 $ text "tel =" <+> prettyTCM tel -- , nest 2 $ text "tel =" <+> text (show tel) ]
src/full/Agda/TypeChecking/Rules/LHS/Problem.hs view
@@ -11,6 +11,7 @@ import Data.Traversable import Agda.Syntax.Common+import Agda.Syntax.Info import Agda.Syntax.Literal import Agda.Syntax.Position import Agda.Syntax.Internal@@ -40,12 +41,14 @@ -- Saves the 'FlexibleVarKind' of its subpatterns. | ImplicitFlex -- ^ From a hidden formal argument or underscore ('WildP'). | DotFlex -- ^ From a dot pattern ('DotP').+ | OtherFlex -- ^ From a non-record constructor or literal ('ConP' or 'LitP'). deriving (Eq, Show) -- | Flexible variables are equipped with information where they come from, -- in order to make a choice which one to assign when two flexibles are unified. data FlexibleVar a = FlexibleVar { flexHiding :: Hiding+ , flexOrigin :: Origin , flexKind :: FlexibleVarKind , flexPos :: Maybe Int , flexVar :: a@@ -55,16 +58,22 @@ getHiding = flexHiding mapHiding f x = x { flexHiding = f (flexHiding x) } -defaultFlexibleVar :: a -> FlexibleVar a-defaultFlexibleVar a = FlexibleVar Hidden ImplicitFlex Nothing a+instance LensOrigin (FlexibleVar a) where+ getOrigin = flexOrigin+ mapOrigin f x = x { flexOrigin = f (flexOrigin x) } -flexibleVarFromHiding :: Hiding -> a -> FlexibleVar a-flexibleVarFromHiding h a = FlexibleVar h ImplicitFlex Nothing a+-- UNUSED+-- defaultFlexibleVar :: a -> FlexibleVar a+-- defaultFlexibleVar a = FlexibleVar Hidden Inserted ImplicitFlex Nothing a +-- UNUSED+-- flexibleVarFromHiding :: Hiding -> a -> FlexibleVar a+-- flexibleVarFromHiding h a = FlexibleVar h ImplicitFlex Nothing a+ allFlexVars :: Telescope -> FlexibleVars allFlexVars tel = zipWith makeFlex (downFrom $ size tel) $ telToList tel where- makeFlex i d = FlexibleVar (getHiding d) ImplicitFlex (Just i) i+ makeFlex i d = FlexibleVar (getHiding d) (getOrigin d) ImplicitFlex (Just i) i data FlexChoice = ChooseLeft | ChooseRight | ChooseEither | ExpandBoth deriving (Eq, Show)@@ -80,7 +89,7 @@ ChooseRight <> ChooseRight = ChooseRight instance Monoid FlexChoice where- mempty = ChooseEither+ mempty = ChooseEither mappend = (<>) class ChooseFlex a where@@ -94,6 +103,9 @@ chooseFlex (RecordFlex xs) y = chooseFlex xs (repeat y) chooseFlex x (RecordFlex ys) = chooseFlex (repeat x) ys chooseFlex ImplicitFlex ImplicitFlex = ChooseEither+ chooseFlex ImplicitFlex _ = ChooseLeft+ chooseFlex _ ImplicitFlex = ChooseRight+ chooseFlex OtherFlex OtherFlex = ChooseEither instance ChooseFlex a => ChooseFlex [a] where chooseFlex xs ys = mconcat $ zipWith chooseFlex xs ys@@ -105,14 +117,23 @@ chooseFlex (Just x) (Just y) = chooseFlex x y instance ChooseFlex Hiding where- chooseFlex Hidden Hidden = ChooseEither- chooseFlex Hidden _ = ChooseLeft- chooseFlex _ Hidden = ChooseRight- chooseFlex Instance Instance = ChooseEither- chooseFlex Instance _ = ChooseLeft- chooseFlex _ Instance = ChooseRight- chooseFlex _ _ = ChooseEither+ chooseFlex Hidden Hidden = ChooseEither+ chooseFlex Hidden _ = ChooseLeft+ chooseFlex _ Hidden = ChooseRight+ chooseFlex Instance{} Instance{} = ChooseEither+ chooseFlex Instance{} _ = ChooseLeft+ chooseFlex _ Instance{} = ChooseRight+ chooseFlex _ _ = ChooseEither +instance ChooseFlex Origin where+ chooseFlex Inserted Inserted = ChooseEither+ chooseFlex Inserted _ = ChooseLeft+ chooseFlex _ Inserted = ChooseRight+ chooseFlex Reflected Reflected = ChooseEither+ chooseFlex Reflected _ = ChooseLeft+ chooseFlex _ Reflected = ChooseRight+ chooseFlex _ _ = ChooseEither+ instance ChooseFlex Int where chooseFlex x y = case compare x y of LT -> ChooseLeft@@ -120,8 +141,8 @@ GT -> ChooseRight instance (ChooseFlex a) => ChooseFlex (FlexibleVar a) where- chooseFlex (FlexibleVar h1 f1 p1 i1) (FlexibleVar h2 f2 p2 i2) =- firstChoice [ chooseFlex f1 f2, chooseFlex h1 h2+ chooseFlex (FlexibleVar h1 o1 f1 p1 i1) (FlexibleVar h2 o2 f2 p2 i2) =+ firstChoice [ chooseFlex f1 f2, chooseFlex o1 o2, chooseFlex h1 h2 , chooseFlex p1 p2, chooseFlex i1 i2] where firstChoice :: [FlexChoice] -> FlexChoice@@ -193,6 +214,11 @@ , focusType :: Type -- ^ Type of variable we are splitting, kept for record patterns. } | LitFocus Literal [NamedArg DeBruijnPattern] Type+ | AbsurdFocus+ { absurdFocusRange :: PatInfo+ , absurdFocusVar :: Int+ , absurdFocusType :: Type+ } -- | Result of 'splitProblem': Determines position for the next split. data SplitProblem@@ -244,6 +270,7 @@ data LHSState = LHSState { lhsProblem :: Problem , lhsDPI :: [DotPatternInst]+ , lhsShouldBeEmptyTypes :: [(Range,Type)] } instance Subst Term ProblemRest where@@ -276,8 +303,8 @@ instance PP.Pretty AsBinding where pretty (AsB x v a) =- PP.text (show x ++ " =") PP.<+> PP.hang (PP.pretty v PP.<+> PP.text ":") 2- (PP.pretty a)+ PP.pretty x PP.<+> PP.text "=" PP.<+>+ PP.hang (PP.pretty v PP.<+> PP.text ":") 2 (PP.pretty a) instance InstantiateFull AsBinding where instantiateFull' (AsB x v a) = AsB x <$> instantiateFull' v <*> instantiateFull' a
src/full/Agda/TypeChecking/Rules/LHS/ProblemRest.hs view
@@ -2,10 +2,13 @@ module Agda.TypeChecking.Rules.LHS.ProblemRest where +import Control.Arrow (first, second)+ import Data.Functor ((<$)) import Agda.Syntax.Common import Agda.Syntax.Internal+import Agda.Syntax.Abstract.Pattern import qualified Agda.Syntax.Abstract as A import Agda.TypeChecking.Monad@@ -29,16 +32,15 @@ useNamesFromPattern ps = telFromList . zipWith ren (map namedArg ps ++ repeat dummy) . telToList where dummy = A.WildP __IMPOSSIBLE__- ren (A.VarP x) (Dom info (_, a)) | notHidden info && not (isNoName x) =+ ren (A.VarP x) (Dom info (_, a)) | visible info && not (isNoName x) = Dom info (nameToArgName x, a)- ren A.AbsurdP{} (Dom info (_, a)) | notHidden info = Dom info ("()", a) -- Andreas, 2013-03-13: inserted the following line in the hope to fix issue 819 -- but it does not do the job, instead, it puts a lot of "_"s -- instead of more sensible names into error messages.- -- ren A.WildP{} (Dom info (_, a)) | notHidden info = Dom info ("_", a)+ -- ren A.WildP{} (Dom info (_, a)) | visible info = Dom info ("_", a) ren A.PatternSynP{} _ = __IMPOSSIBLE__ -- ensure there are no syns left -- Andreas, 2016-05-10, issue 1848: if context variable has no name, call it "x"- ren _ (Dom info (x, a)) | notHidden info && isNoName x =+ ren _ (Dom info (x, a)) | visible info && isNoName x = Dom info (stringToArgName "x", a) ren _ a = a @@ -76,14 +78,20 @@ problemFromPats :: [NamedArg A.Pattern] -- ^ The user patterns. -> Type -- ^ The type the user patterns eliminate. -> TCM Problem -- ^ The initial problem constructed from the user patterns.-problemFromPats ps a = do+problemFromPats ps0 a = do+ -- Andreas, 2017-01-18, issue #819: We set all A.WildP origins to Inserted+ -- in order to guide the pattern printer to discard variable names it made up.+ let ps = (`mapNamedArgPattern` ps0) $ \case+ p | A.WildP{} <- namedArg p -> setOrigin Inserted p+ p -> p -- For the initial problem, do not insert trailing implicits. -- This has the effect of not including trailing hidden domains in the problem telescope. -- In all later call to insertImplicitPatterns, we can then use ExpandLast. -- Ulf, 2016-04-25: Actually we do need to ExpandLast because where blocks -- need the implicits. ps <- insertImplicitPatternsT ExpandLast ps a- -- unless (size tel0' >= size ps) $ typeError $ TooManyArgumentsInLHS a+ reportSDoc "tc.lhs.imp" 20 $+ text "insertImplicitPatternsT returned" <+> fsep (map prettyA ps) -- Redo the telView, in order to *not* normalize the clause type further than necessary. -- (See issue 734.)@@ -119,6 +127,8 @@ updateProblemRest_ :: Problem -> TCM (Nat, Problem) updateProblemRest_ p@(Problem ps0 qs0 tel0 (ProblemRest ps a)) = do ps <- insertImplicitPatternsT ExpandLast ps $ unArg a+ reportSDoc "tc.lhs.imp" 20 $+ text "insertImplicitPatternsT returned" <+> fsep (map prettyA ps) -- (Issue 734: Do only the necessary telView to preserve clause types as much as possible.) TelV tel b <- telViewUpTo (length ps) $ unArg a let gamma = useNamesFromPattern ps tel@@ -150,4 +160,5 @@ return $ LHSState { lhsProblem = p' , lhsDPI = applyPatSubst tau (lhsDPI st)+ , lhsShouldBeEmptyTypes = map (second $ applyPatSubst tau) (lhsShouldBeEmptyTypes st) }
src/full/Agda/TypeChecking/Rules/LHS/Split.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} module Agda.TypeChecking.Rules.LHS.Split ( splitProblem@@ -11,8 +10,9 @@ import Control.Monad.Trans ( lift ) import Control.Monad.Trans.Maybe +import Data.Either import Data.Maybe (fromMaybe)-import Data.List hiding (null)+import qualified Data.List as List import Data.Traversable hiding (mapM, sequence) import Data.Foldable (msum) @@ -36,6 +36,7 @@ import Agda.TypeChecking.Constraints import Agda.TypeChecking.Conversion import Agda.TypeChecking.Datatypes+import Agda.TypeChecking.Errors (dropTopLevelModule) import Agda.TypeChecking.Free import Agda.TypeChecking.Irrelevance import Agda.TypeChecking.MetaVars@@ -48,6 +49,7 @@ import Agda.TypeChecking.Rules.LHS.Problem +import Agda.Utils.Either import Agda.Utils.Except (catchError) import Agda.Utils.Functor ((<.>)) import Agda.Utils.Lens@@ -57,8 +59,10 @@ import Agda.Utils.Monad import Agda.Utils.Null import Agda.Utils.Permutation-import Agda.Utils.Tuple+import Agda.Utils.Pretty (prettyShow) import qualified Agda.Utils.Pretty as P+import Agda.Utils.Size+import Agda.Utils.Tuple #include "undefined.h" import Agda.Utils.Impossible@@ -79,12 +83,17 @@ splitProblem mf (Problem ps qs tel pr) = do lift $ do reportSLn "tc.lhs.split" 20 $ "initiating splitting"- ++ maybe "" ((" for definition " ++) . show) mf+ ++ maybe "" ((" for definition " ++) . prettyShow) mf reportSDoc "tc.lhs.split" 30 $ sep [ nest 2 $ text "ps =" <+> sep (map (P.parens <.> prettyA) ps) , nest 2 $ text "qs =" <+> sep (map (P.parens <.> prettyTCM . namedArg) qs) , nest 2 $ text "tel =" <+> prettyTCM tel ]+ reportSDoc "tc.lhs.split" 60 $ sep+ [ nest 2 $ text "ps (raw) =" <+> sep (map (P.parens <.> text . show) ps)+ , nest 2 $ text "qs (raw) =" <+> sep (map (P.parens <.> text . show . namedArg) qs)+ , nest 2 $ text "tel (raw) =" <+> (text . show) tel+ ] splitP ps tel where -- Result splitting@@ -109,17 +118,20 @@ caseMaybeM (lift $ isRecordType $ unArg b) notRecord $ \(r, vs, def) -> case def of Record{ recFields = fs } -> do lift $ reportSDoc "tc.lhs.split" 20 $ sep- [ text $ "we are of record type r = " ++ show r+ [ text $ "we are of record type r = " ++ prettyShow r , text "applied to parameters vs = " <+> prettyTCM vs- , text $ "and have fields fs = " ++ show fs+ , text $ "and have fields fs = " ++ prettyShow fs ] -- The record "self" is the definition f applied to the patterns let es = patternsToElims qs -- Note: the module parameters are already part of qs let self = defaultArg $ Def f [] `applyE` es ai = getArgInfo p- -- Try the projection candidates- msum $ map (tryProj o ai self fs vs (length projs >= 2)) projs+ -- Try the projection candidates.+ -- Fail hard for the last candidate.+ msum $ mapAwareLast (tryProj o ai self fs r vs $ length ds >= 2) projs+ -- -- This fails softly on all (if more than one) candidates.+ -- msum $ map (tryProj o ai self fs r vs (length projs >= 2)) projs _ -> __IMPOSSIBLE__ where@@ -129,16 +141,46 @@ wrongHiding :: MonadTCM tcm => QName -> tcm a wrongHiding d = typeError . GenericDocError =<< do liftTCM $ text "Wrong hiding used for projection " <+> prettyTCM d+ -- Issue #2423: error which reports the disambiguation+ wrongProj :: MonadTCM tcm => QName -> Bool -> tcm a+ wrongProj d amb = typeError . GenericDocError =<< do+ liftTCM $ sep+ [ text "Cannot eliminate type "+ , prettyTCM (unArg b)+ , text " with projection "+ , if amb then text . prettyShow =<< dropTopLevelModule d else prettyTCM d+ ] - tryProj :: ProjOrigin -> ArgInfo -> Arg Term -> [Arg QName] -> Args -> Bool -> (QName, Projection) -> ListT TCM SplitProblem- tryProj o ai self fs vs amb (d0, proj) = do+ -- | Pass 'True' unless last element of the list.+ mapAwareLast :: forall a b. (Bool -> a -> b) -> [a] -> [b]+ mapAwareLast f [] = []+ mapAwareLast f [a] = [f False a]+ mapAwareLast f (a:as) = f True a : mapAwareLast f as++ tryProj+ :: ProjOrigin -- ^ Origin of projection pattern.+ -> ArgInfo -- ^ ArgInfo of projection pattern.+ -> Arg Term -- ^ Self: value we are eliminating.+ -> [Arg QName] -- ^ Fields of record type under consideration.+ -> QName -- ^ Name of record type we are eliminating.+ -> Args -- ^ Parameters of record type we are eliminating.+ -> Bool -- ^ Did we start out with an ambiguous projection in the beginning?+ -> Bool -- ^ More than 1 candidates? If yes, fail softly.+ -> (QName, Projection) -- ^ Current candidate.+ -> ListT TCM SplitProblem+ tryProj o ai self fs r vs amb soft (d0, proj) = do -- Recoverable errors are those coming from the projection.- -- If we have several projections (amb) we just try the next one.- let ambErr err = if amb then mzero else err+ -- If we have several projections we fail @soft@ly and just try the next one.+ let ambErr err = if soft then mzero else err+ ambTry m+ | soft = unlessM (liftTCM $ tryConversion m) mzero -- succeed without constraints+ -- This would leave constraints:+ -- -- | amb = whenNothingM (liftTCM $ tryMaybe $ disableDestructiveUpdate m) mzero+ | otherwise = liftTCM $ noConstraints m case proj of -- Andreas, 2015-05-06 issue 1413 projProper=Nothing is not impossible- Projection{projProper = False} -> ambErr notProjP- Projection{projProper = True, projOrig = d, projLams = lams} -> do+ Projection{projProper = Nothing} -> ambErr notProjP+ Projection{projProper = Just qr, projOrig = d, projLams = lams} -> do let ai = projArgInfo proj -- If projIndex==0, then the projection is already applied -- to the record value (like in @open R r@), and then it@@ -148,19 +190,26 @@ -- If the target is not a record type, that's an error. -- It could be a meta, but since we cannot postpone lhs checking, we crash here. lift $ reportSDoc "tc.lhs.split" 20 $ sep- [ text $ "proj d0 = " ++ show d0- , text $ "original proj d = " ++ show d+ [ text $ "proj d0 = " ++ prettyShow d0+ , text $ "original proj d = " ++ prettyShow d ] -- Get the field decoration. -- If the projection pattern name @d@ is not a field name, -- we have to try the next projection name. -- If this was not an ambiguous projection, that's an error.- argd <- maybe (ambErr failure) return $ find ((d ==) . unArg) fs+ argd <- maybe (ambErr $ wrongProj d amb) return $ List.find ((d ==) . unArg) fs let ai' = setRelevance (getRelevance argd) ai + -- Andreas, 2016-12-31, issue #2374:+ -- We can also disambiguate by hiding info.+ unless (sameHiding p ai) $ ambErr $ wrongHiding d++ -- Andreas, 2016-12-31, issue #1976:+ -- Check parameters.+ ambTry $ checkParameters qr r vs+ -- From here, we have the correctly disambiguated projection. -- Thus, we no longer catch errors.- unless (getHiding p == getHiding ai) $ wrongHiding d -- For highlighting, we remember which name we disambiguated to. -- This is safe here (fingers crossed) as we won't decide on a@@ -205,7 +254,7 @@ ] -- Andreas, 2016-06-30, issue #2075: need test here!- unless (getHiding p == getHiding ai) $ typeError WrongHidingInLHS+ unless (sameHiding p ai) $ typeError WrongHidingInLHS -- Possible reinvokations: let -- 1. Redo this argument (after meta instantiation).@@ -256,7 +305,7 @@ -- Subcase: a record type (d vs) Right (d, vs, def) -> do let np = recPars def- let (pars, ixs) = genericSplitAt np vs+ let (pars, ixs) = splitAt np vs lift $ reportSDoc "tc.lhs.split" 10 $ vcat [ sep [ text "splitting on" , nest 2 $ fsep [ prettyA p, text ":", prettyTCM dom ]@@ -278,6 +327,16 @@ , splitRPats = Abs x $ Problem ps () tel __IMPOSSIBLE__ }) `mplus` keepGoing + -- Case: absurd pattern.+ p@(A.AbsurdP info) -> do+ lift $ reportSDoc "tc.lhs.split.absurd" 30 $ text "split AbsurdP: type is " <+> prettyTCM a+ let i = size tel+ (return Split+ { splitLPats = empty+ , splitFocus = Arg ai $ AbsurdFocus info i $ raise (i+1) a+ , splitRPats = Abs x $ Problem ps () tel __IMPOSSIBLE__+ }) `mplus` keepGoing+ -- Case: constructor pattern. p@(A.ConP ci (A.AmbQ cs) args) -> do let tryInstantiate a'@@ -303,12 +362,18 @@ case ignoreSharing $ unEl a' of -- Subcase: split type is a Def.- Def d es -> do+ Def d es -> (liftTCM $ theDef <$> getConstInfo d) >>= \case - def <- liftTCM $ theDef <$> getConstInfo d+ -- Issue #2253: the data type could be abstract.+ AbstractDefn{} -> liftTCM $ traceCall (CheckPattern p EmptyTel a) $ do+ typeError . GenericDocError =<< do+ text "Cannot split on abstract data type" <+> prettyTCM d + def -> do+ -- We cannot split on (shape-)irrelevant non-records. -- Andreas, 2011-10-04 unless allowed by option+ lift $ reportSLn "tc.lhs.split" 30 $ "split ConP: relevance is " ++ show ai unless (defIsRecord def) $ when (unusableRelevance $ getRelevance ai) $ unlessM (liftTCM $ optExperimentalIrrelevance <$> pragmaOptions) $@@ -327,24 +392,26 @@ traceCall (CheckPattern p EmptyTel a) $ do -- TODO: wrong telescope -- Check that we construct something in the right datatype c <- lift $ do- cs' <- mapM canonicalName cs+ -- Andreas, 2017-08-13, issue #2686: ignore abstract constructors+ (cs1, cs') <- unzip . snd . partitionEithers <$> do+ forM cs $ \ c -> mapRight ((c,) . conName) <$> getConHead c+ when (null cs1) $ typeError $ AbstractConstructorNotInScope $ head cs d' <- canonicalName d- let cons def = case theDef def of- Datatype{dataCons = cs} -> cs- Record{recConHead = c} -> [conName c]- _ -> __IMPOSSIBLE__- cs0 <- cons <$> getConstInfo d'- case [ c | (c, c') <- zip cs cs', elem c' cs0 ] of+ cs0 <- (theDef <$> getConstInfo d') <&> \case+ Datatype{dataCons = cs0} -> cs0+ Record{recConHead = c0} -> [conName c0]+ _ -> __IMPOSSIBLE__+ case [ c | (c, c') <- zip cs1 cs', elem c' cs0 ] of [c] -> do -- If constructor pattern was ambiguous, -- remember our choice for highlighting info. when (length cs >= 2) $ storeDisambiguatedName c return c- [] -> typeError $ ConstructorPatternInWrongDatatype (head cs) d- cs -> -- if there are more than one we give up (they might have different types)- typeError $ CantResolveOverloadedConstructorsTargetingSameDatatype d cs+ [] -> typeError $ ConstructorPatternInWrongDatatype (head cs1) d+ cs3 -> -- if there are more than one we give up (they might have different types)+ typeError $ CantResolveOverloadedConstructorsTargetingSameDatatype d cs3 - let (pars, ixs) = genericSplitAt np vs+ let (pars, ixs) = splitAt np vs lift $ reportSDoc "tc.lhs.split" 10 $ vcat [ sep [ text "splitting on" , nest 2 $ fsep [ prettyA p, text ":", prettyTCM dom ]@@ -363,7 +430,9 @@ -- so we add a check here. -- I guess this issue could be solved more systematically, -- but the extra check here is non-invasive to the existing code.- checkParsIfUnambiguous cs d pars+ -- Andreas, 2016-12-31 fixing issue #1975+ -- Do this also for constructors which were originally ambiguous.+ checkConstructorParameters c d pars (return Split { splitLPats = empty@@ -377,23 +446,34 @@ _ -> keepGoing --- | @checkParsIfUnambiguous [c] d pars@ checks that the data/record type+-- | @checkConstructorParameters c d pars@ checks that the data/record type -- behind @c@ is has initial parameters (coming e.g. from a module instantiation) -- that coincide with an prefix of @pars@.-checkParsIfUnambiguous :: MonadTCM tcm => [QName] -> QName -> Args -> tcm ()-checkParsIfUnambiguous [c] d pars = liftTCM $ do- dc <- getConstructorData c+checkConstructorParameters :: MonadTCM tcm => QName -> QName -> Args -> tcm ()+checkConstructorParameters c d pars = do+ dc <- liftTCM $ getConstructorData c+ checkParameters dc d pars++-- | Check that given parameters match the parameters of the inferred+-- constructor/projection.+checkParameters+ :: MonadTCM tcm+ => QName -- ^ The record/data type name of the chosen constructor/projection.+ -> QName -- ^ The record/data type name as supplied by the type signature.+ -> Args -- ^ The parameters.+ -> tcm ()+checkParameters dc d pars = liftTCM $ do a <- reduce (Def dc []) case ignoreSharing a of Def d0 es -> do -- compare parameters let vs = fromMaybe __IMPOSSIBLE__ $ allApplyElims es reportSDoc "tc.lhs.split" 40 $- vcat [ nest 2 $ text "d =" <+> prettyTCM d- , nest 2 $ text "d0 (should be == d) =" <+> prettyTCM d0- , nest 2 $ text "dc =" <+> prettyTCM dc+ vcat [ nest 2 $ text "d =" <+> (text . prettyShow) d+ , nest 2 $ text "d0 (should be == d) =" <+> (text . prettyShow) d0+ , nest 2 $ text "dc =" <+> (text . prettyShow) dc+ , nest 2 $ text "vs =" <+> prettyTCM vs ] -- when (d0 /= d) __IMPOSSIBLE__ -- d could have extra qualification t <- typeOfConst d compareArgs [] t (Def d []) vs (take (length vs) pars) _ -> __IMPOSSIBLE__-checkParsIfUnambiguous _ _ _ = return ()
src/full/Agda/TypeChecking/Rules/LHS/Unify.hs view
@@ -2,7 +2,6 @@ {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE NondecreasingIndentation #-}-{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE ViewPatterns #-} @@ -105,8 +104,7 @@ module Agda.TypeChecking.Rules.LHS.Unify ( UnificationResult , UnificationResult'(..)- , unifyIndices- , unifyIndices_ ) where+ , unifyIndices ) where import Prelude hiding (null) @@ -122,7 +120,7 @@ import Data.Map (Map) import qualified Data.Map as Map import Data.Semigroup hiding (Arg)-import Data.List hiding (null, sort)+import qualified Data.List as List import Data.Typeable (Typeable) import Data.Foldable (Foldable)@@ -139,7 +137,6 @@ import Agda.TypeChecking.Monad import qualified Agda.TypeChecking.Monad.Benchmark as Bench-import Agda.TypeChecking.Monad.Exception import Agda.TypeChecking.Monad.Builtin (constructorForm) import Agda.TypeChecking.Conversion -- equalTerm import Agda.TypeChecking.Constraints@@ -161,10 +158,7 @@ import Agda.TypeChecking.Rules.LHS.Problem hiding (Substitution) -- import Agda.TypeChecking.SyntacticEquality -import Agda.Utils.Except- ( Error(noMsg, strMsg)- , MonadError(catchError, throwError)- )+import Agda.Utils.Except ( MonadError(catchError, throwError) ) import Agda.Utils.Either import Agda.Utils.Functor import Agda.Utils.List@@ -186,38 +180,22 @@ ) data UnificationResult' a- = Unifies a -- ^ Unification succeeded.- | NoUnify TCErr -- ^ Terms are not unifiable.- | DontKnow TCErr -- ^ Some other error happened, unification got stuck.+ = Unifies a -- ^ Unification succeeded.+ | NoUnify NegativeUnification -- ^ Terms are not unifiable.+ | DontKnow [UnificationFailure] -- ^ Some other error happened, unification got stuck. deriving (Typeable, Show, Functor, Foldable, Traversable) -- | Unify indices. ----- In @unifyIndices_ flex a us vs@,------ @a@ is the type eliminated by @us@ and @vs@--- (usally the type of a constructor),--- need not be reduced,+-- In @unifyIndices gamma flex us vs@, -- -- @us@ and @vs@ are the argument lists to unify, --+-- @gamma@ is the telescope of free variables in @us@ and @vs@.+-- -- @flex@ is the set of flexible (instantiable) variabes in @us@ and @vs@. -- -- The result is the most general unifier of @us@ and @vs@.-unifyIndices_ :: MonadTCM tcm- => Telescope- -> FlexibleVars- -> Type- -> Args- -> Args- -> tcm (Telescope, PatternSubstitution, [NamedArg DeBruijnPattern])-unifyIndices_ tel flex a us vs = liftTCM $ do- r <- unifyIndices tel flex a us vs- case r of- Unifies sub -> return sub- DontKnow err -> throwError err- NoUnify err -> throwError err- unifyIndices :: MonadTCM tcm => Telescope -> FlexibleVars@@ -397,8 +375,8 @@ where permuteFlex :: Permutation -> FlexibleVars -> FlexibleVars permuteFlex perm =- mapMaybe $ \(FlexibleVar h k p x) ->- FlexibleVar h k p <$> findIndex (x==) (permPicks perm)+ mapMaybe $ \(FlexibleVar h o k p x) ->+ FlexibleVar h o k p <$> List.findIndex (x==) (permPicks perm) applyUnder :: Int -> Telescope -> Term -> Telescope applyUnder k tel u@@ -471,8 +449,8 @@ { conflictAt :: Int , conflictDatatype :: QName , conflictParameters :: Args- , conflictConLeft :: ConHead- , conflictConRight :: ConHead+ , conflictLeft :: Term+ , conflictRight :: Term } | Cycle { cycleAt :: Int@@ -516,67 +494,67 @@ prettyTCM step = case step of Deletion k a u v -> text "Deletion" $$ nest 2 (vcat $ [ text "position: " <+> text (show k)- , text "type: " <+> text (show a)- , text "lhs: " <+> text (show u)- , text "rhs: " <+> text (show v)+ , text "type: " <+> prettyTCM a+ , text "lhs: " <+> prettyTCM u+ , text "rhs: " <+> prettyTCM v ]) Solution k a i u -> text "Solution" $$ nest 2 (vcat $ [ text "position: " <+> text (show k)- , text "type: " <+> text (show a)+ , text "type: " <+> prettyTCM a , text "variable: " <+> text (show i)- , text "term: " <+> text (show u)+ , text "term: " <+> prettyTCM u ]) Injectivity k a d pars ixs c -> text "Injectivity" $$ nest 2 (vcat $ [ text "position: " <+> text (show k)- , text "type: " <+> text (show a)- , text "datatype: " <+> text (show d)- , text "parameters: " <+> text (show pars)- , text "indices: " <+> text (show ixs)- , text "constructor:" <+> text (show c)+ , text "type: " <+> prettyTCM a+ , text "datatype: " <+> prettyTCM d+ , text "parameters: " <+> prettyList_ (map prettyTCM pars)+ , text "indices: " <+> prettyList_ (map prettyTCM ixs)+ , text "constructor:" <+> prettyTCM c ])- Conflict k d pars c1 c2 -> text "Conflict" $$ nest 2 (vcat $+ Conflict k d pars u v -> text "Conflict" $$ nest 2 (vcat $ [ text "position: " <+> text (show k)- , text "datatype: " <+> text (show d)- , text "parameters: " <+> text (show pars)- , text "con1: " <+> text (show c1)- , text "con2: " <+> text (show c2)+ , text "datatype: " <+> prettyTCM d+ , text "parameters: " <+> prettyList_ (map prettyTCM pars)+ , text "lhs: " <+> prettyTCM u+ , text "rhs: " <+> prettyTCM v ]) Cycle k d pars i u -> text "Cycle" $$ nest 2 (vcat $ [ text "position: " <+> text (show k)- , text "datatype: " <+> text (show d)- , text "parameters: " <+> text (show pars)+ , text "datatype: " <+> prettyTCM d+ , text "parameters: " <+> prettyList_ (map prettyTCM pars) , text "variable: " <+> text (show i)- , text "term: " <+> text (show u)+ , text "term: " <+> prettyTCM u ]) EtaExpandVar fi r pars -> text "EtaExpandVar" $$ nest 2 (vcat $ [ text "variable: " <+> text (show fi)- , text "record type:" <+> text (show r)- , text "parameters: " <+> text (show pars)+ , text "record type:" <+> prettyTCM r+ , text "parameters: " <+> prettyTCM pars ]) EtaExpandEquation k r pars -> text "EtaExpandVar" $$ nest 2 (vcat $ [ text "position: " <+> text (show k)- , text "record type:" <+> text (show r)- , text "parameters: " <+> text (show pars)+ , text "record type:" <+> prettyTCM r+ , text "parameters: " <+> prettyTCM pars ]) LitConflict k a u v -> text "LitConflict" $$ nest 2 (vcat $ [ text "position: " <+> text (show k)- , text "type: " <+> text (show a)- , text "lhs: " <+> text (show u)- , text "rhs: " <+> text (show v)+ , text "type: " <+> prettyTCM a+ , text "lhs: " <+> prettyTCM u+ , text "rhs: " <+> prettyTCM v ]) StripSizeSuc k u v -> text "StripSizeSuc" $$ nest 2 (vcat $ [ text "position: " <+> text (show k)- , text "lhs: " <+> text (show u)- , text "rhs: " <+> text (show v)+ , text "lhs: " <+> prettyTCM u+ , text "rhs: " <+> prettyTCM v ]) SkipIrrelevantEquation k -> text "SkipIrrelevantEquation" $$ nest 2 (vcat $ [ text "position: " <+> text (show k) ]) TypeConInjectivity k d us vs -> text "TypeConInjectivity" $$ nest 2 (vcat $ [ text "position: " <+> text (show k)- , text "datatype: " <+> text (show d)- , text "lhs: " <+> text (show us)- , text "rhs: " <+> text (show vs)+ , text "datatype: " <+> prettyTCM d+ , text "lhs: " <+> prettyList_ (map prettyTCM us)+ , text "rhs: " <+> prettyList_ (map prettyTCM vs) ]) type UnifyStrategy = UnifyState -> ListT TCM UnifyStep@@ -600,14 +578,15 @@ , etaExpandVarStrategy , etaExpandEquationStrategy , injectiveTypeConStrategy+ , injectivePragmaStrategy , simplifySizesStrategy , checkEqualityStrategy ] -- | Returns true if the variables 0..k-1 don't occur in x-isHom :: (Free' a All, Subst Term a) => Int -> a -> Maybe a+isHom :: (Free a, Subst Term a) => Int -> a -> Maybe a isHom n x = do- guard $ getAll $ runFree (\ (i,_) -> All (i >= n)) IgnoreNot x+ guard $ getAll $ runFree (All . (>= n)) IgnoreNot x return $ raise (-n) x -- | Checks whether the given term (of the given type) is beta-eta-equivalent@@ -680,7 +659,7 @@ findFlexible i flex = let flex' = map flexVar flex flexible i = i `elem` flex'- in find ((i ==) . flexVar) flex+ in List.find ((i ==) . flexVar) flex basicUnifyStrategy :: Int -> UnifyStrategy basicUnifyStrategy k s = do@@ -690,19 +669,23 @@ liftTCM $ reportSDoc "tc.lhs.unify" 30 $ text "isEtaVar results: " <+> text (show [mi,mj]) case (mi, mj) of (Just i, Just j)- | i == j -> return $ Deletion k ha (var i) (var i)+ | i == j -> mzero -- Taken care of by checkEqualityStrategy (Just i, Just j) | Just fi <- findFlexible i flex , Just fj <- findFlexible j flex -> do let choice = chooseFlex fi fj+ firstTryLeft = msum [ return (Solution k ha i v)+ , return (Solution k ha j u)]+ firstTryRight = msum [ return (Solution k ha j u)+ , return (Solution k ha i v)] liftTCM $ reportSDoc "tc.lhs.unify" 40 $ text "fi = " <+> text (show fi) liftTCM $ reportSDoc "tc.lhs.unify" 40 $ text "fj = " <+> text (show fj) liftTCM $ reportSDoc "tc.lhs.unify" 40 $ text "chooseFlex: " <+> text (show choice) case choice of- ChooseLeft -> return $ Solution k ha i v- ChooseRight -> return $ Solution k ha j u+ ChooseLeft -> firstTryLeft+ ChooseRight -> firstTryRight ExpandBoth -> mzero -- This should be taken care of by etaExpandEquationStrategy- ChooseEither -> return $ Solution k ha j u+ ChooseEither -> firstTryRight (Just i, _) | Just _ <- findFlexible i flex -> return $ Solution k ha i v (_, Just j)@@ -720,18 +703,12 @@ npars <- mcatMaybes $ liftTCM $ getNumberOfParameters d let (pars,ixs) = splitAt npars $ fromMaybe __IMPOSSIBLE__ $ allApplyElims es hpars <- mfromMaybe $ isHom k pars- liftTCM $ reportSDoc "tc.lhs.unify" 40 $ addContext (varTel s `abstract` eqTel s) $+ liftTCM $ reportSDoc "tc.lhs.unify" 40 $ addContext (varTel s) $ text "Found equation at datatype " <+> prettyTCM d <+> text " with (homogeneous) parameters " <+> prettyTCM hpars case (ignoreSharing u, ignoreSharing v) of- (MetaV m es, Con c ci _ ) -> do- us <- mcatMaybes $ liftTCM $ addContext (varTel s) $ instMetaCon m es d hpars c ci- return $ Injectivity k a d hpars ixs c- (Con c ci _ , MetaV m es) -> do- vs <- mcatMaybes $ liftTCM $ addContext (varTel s) $ instMetaCon m es d hpars c ci- return $ Injectivity k a d hpars ixs c (Con c _ _ , Con c' _ _ ) | c == c' -> return $ Injectivity k a d hpars ixs c- (Con c _ _ , Con c' _ _ ) -> return $ Conflict k d hpars c c'+ (Con c _ _ , Con c' _ _ ) -> return $ Conflict k d hpars u v (Var i [] , v ) -> ifOccursStronglyRigid i v $ return $ Cycle k d hpars i v (u , Var j [] ) -> ifOccursStronglyRigid j u $ return $ Cycle k d hpars j u _ -> mzero@@ -746,47 +723,6 @@ StronglyRigid -> ret _ -> mzero - -- Instantiate the meta with a constructor applied to fresh metas- -- Returns the fresh metas if successful- instMetaCon :: MetaId -> Elims -> QName -> Args -> ConHead -> ConInfo -> TCM (Maybe Args)- instMetaCon m es d pars c ci = do- caseMaybe (allApplyElims es) (return Nothing) $ \ us -> do- ifNotM (asks envAssignMetas) (return Nothing) $ {-else-} tryMaybe $ do- reportSDoc "tc.lhs.unify" 60 $- text "Trying to instantiate the meta" <+> prettyTCM (MetaV m es) <+>- text "with the constructor" <+> prettyTCM c <+> text "applied to fresh metas"- margs <- do- -- The new metas should have the same dependencies as the original meta- mv <- lookupMeta m-- ctype <- (`piApply` pars) . defType <$> liftTCM (getConstInfo $ conName c)- reportSDoc "tc.lhs.unify" 80 $ text "Type of constructor: " <+> prettyTCM ctype- withMetaInfo' mv $ do- let perm = mvPermutation mv- reportSDoc "tc.lhs.unify" 100 $ vcat- [ text "Permutation of meta: " <+> prettyTCM perm- ]- cxt <- instantiateFull =<< getContextTelescope- reportSDoc "tc.lhs.unify" 100 $ do- let flat = flattenTel cxt- let badRen :: Substitution = renaming __IMPOSSIBLE__ perm- let goodRen :: Substitution = renaming __IMPOSSIBLE__ $ flipP perm- vcat- [ text "Context of meta: " <+> (inTopContext $ prettyTCM cxt)- , text "Flattened: " <+> prettyTCM flat- , text "Flattened (raw): " <+> text (show flat)- , text "Bad renaming: " <+> text (show badRen)- , text "Good renaming: " <+> text (show goodRen)- , text "Raw permutation: " <+> prettyTCM (permute perm flat)- ]- let tel = permuteTel perm cxt- reportSDoc "tc.lhs.unify" 100 $ text "Context tel (for new metas): " <+> prettyTCM tel- -- important: create the meta in the same environment as the original meta- newArgsMetaCtx ctype tel perm us- reportSDoc "tc.lhs.unify" 80 $ text "Generated meta args: " <+> prettyTCM margs- noConstraints $ assignV DirEq m us (Con c ci margs)- return margs- checkEqualityStrategy :: Int -> UnifyStrategy checkEqualityStrategy k s = do let Equal a u v = getEquality k s@@ -796,11 +732,13 @@ literalStrategy :: Int -> UnifyStrategy literalStrategy k s = do- eq <- liftTCM $ eqUnLevel $ getEquality k s- case eq of- Equal a u@(Lit l1) v@(Lit l2)- | l1 == l2 -> return $ Deletion k a u u -- TODO: wrong context of a, but does it matter?- | otherwise -> return $ LitConflict k a l1 l2 -- same problem here+ let n = eqCount s+ Equal a u v <- liftTCM $ eqUnLevel $ getEquality k s+ ha <- mfromMaybe $ isHom n a+ case (u , v) of+ (Lit l1 , Lit l2)+ | l1 == l2 -> return $ Deletion k ha u v+ | otherwise -> return $ LitConflict k ha l1 l2 _ -> mzero etaExpandVarStrategy :: Int -> UnifyStrategy@@ -881,7 +819,7 @@ Datatype{} -> True Record{} -> True Axiom{} -> True- AbstractDefn -> False -- True triggers issue #2250+ AbstractDefn{} -> False -- True triggers issue #2250 Function{} -> False Primitive{} -> False Constructor{}-> __IMPOSSIBLE__ -- Never a type!@@ -890,6 +828,19 @@ return $ TypeConInjectivity k d us vs _ -> mzero +injectivePragmaStrategy :: Int -> UnifyStrategy+injectivePragmaStrategy k s = do+ eq <- liftTCM $ eqUnLevel $ getEquality k s+ case eq of+ Equal a u@(ignoreSharing -> Def d es) v@(ignoreSharing -> Def d' es') | d == d' -> do+ -- d must have an injective pragma+ def <- liftTCM $ getConstInfo d+ guard $ defInjective def+ let us = fromMaybe __IMPOSSIBLE__ $ allApplyElims es+ vs = fromMaybe __IMPOSSIBLE__ $ allApplyElims es'+ return $ TypeConInjectivity k d us vs+ _ -> mzero+ skipIrrelevantStrategy :: Int -> UnifyStrategy skipIrrelevantStrategy k s = do let i = getEqInfo k s@@ -941,24 +892,43 @@ unifyStep :: UnifyState -> UnifyStep -> UnifyM (UnificationResult' UnifyState) unifyStep s Deletion{ deleteAt = k , deleteType = a , deleteLeft = u , deleteRight = v } = do- liftTCM $ addContext (varTel s) $ noConstraints $ dontAssignMetas $ equalTerm a u v- ifM (liftTCM $ optWithoutK <$> pragmaOptions)- {-then-} (DontKnow <$> liftTCM withoutKErr)- {-else-} (do- let (s', sigma) = solveEq k u s- tellUnifyProof sigma- Unifies <$> liftTCM (reduceEqTel s'))- `catchError` \err -> return $ DontKnow err- where- withoutKErr = addContext (varTel s) $ typeError_ $ WithoutKError a u u+ -- Check definitional equality of u and v+ isReflexive <- liftTCM $ addContext (varTel s) $ do+ dontAssignMetas $ disableDestructiveUpdate $ noConstraints $+ equalTerm a u v+ return Nothing+ `catchError` \err -> return $ Just err+ withoutK <- liftTCM $ optWithoutK <$> pragmaOptions+ case isReflexive of+ Just err -> return $ DontKnow []+ _ | withoutK -> return $ DontKnow [UnifyReflexiveEq (varTel s) a u]+ _ -> do+ let (s', sigma) = solveEq k u s+ tellUnifyProof sigma+ Unifies <$> liftTCM (reduceEqTel s') unifyStep s Solution{ solutionAt = k , solutionType = a , solutionVar = i , solutionTerm = u } = do let m = varCount s- caseMaybeM (trySolveVar (m-1-i) u s) (DontKnow <$> err) $ \(s',sub) -> do- tellUnifySubst sub- let (s'', sigma) = solveEq k (applyPatSubst sub u) s'- tellUnifyProof sigma- Unifies <$> liftTCM (reduce s'')++ -- Check that the type of the variable is equal to the type of the equation+ -- (not just a subtype), otherwise we cannot instantiate (see Issue 2407).+ let a' = getVarType (m-1-i) s+ equalTypes <- liftTCM $ addContext (varTel s) $ do+ reportSDoc "tc.lhs.unify" 45 $ text "Equation type: " <+> prettyTCM a+ reportSDoc "tc.lhs.unify" 45 $ text "Variable type: " <+> prettyTCM a'+ dontAssignMetas $ disableDestructiveUpdate $ noConstraints $+ equalType a a'+ return Nothing+ `catchError` \err -> return $ Just err+ case equalTypes of+ Just err -> return $ DontKnow []+ Nothing -> caseMaybeM (trySolveVar (m-1-i) u s)+ (return $ DontKnow [UnifyRecursiveEq (varTel s) a i u])+ (\(s',sub) -> do+ tellUnifySubst sub+ let (s'', sigma) = solveEq k (applyPatSubst sub u) s'+ tellUnifyProof sigma+ Unifies <$> liftTCM (reduce s'')) where trySolveVar i u s = case solveVar i u s of Just x -> return $ Just x@@ -966,7 +936,6 @@ u <- liftTCM $ normalise u s <- liftTCM $ normaliseVarTel s return $ solveVar i u s- err = addContext (varTel s) $ typeError_ $ UnificationRecursiveEq a i u unifyStep s (Injectivity k a d pars ixs c) = do withoutK <- liftTCM $ optWithoutK <$> pragmaOptions@@ -974,7 +943,8 @@ -- Get constructor telescope and target indices ctype <- (`piApply` pars) . defType <$> liftTCM (getConInfo c)- reportSDoc "tc.lhs.unify" 40 $ text "Constructor type: " <+> prettyTCM ctype+ addContext (varTel s) $ reportSDoc "tc.lhs.unify" 40 $+ text "Constructor type: " <+> prettyTCM ctype TelV ctel ctarget <- liftTCM $ telView ctype let cixs = case ignoreSharing $ unEl ctarget of Def d' es | d == d' ->@@ -984,10 +954,11 @@ -- Get index telescope of the datatype dtype <- (`piApply` pars) . defType <$> liftTCM (getConstInfo d)- reportSDoc "tc.lhs.unify" 40 $ text "Datatype type: " <+> prettyTCM dtype+ addContext (varTel s) $ reportSDoc "tc.lhs.unify" 40 $+ text "Datatype type: " <+> prettyTCM dtype -- Split equation telescope into parts before and after current equation- let (eqListTel1, _ : eqListTel2) = genericSplitAt k $ telToList $ eqTel s+ let (eqListTel1, _ : eqListTel2) = splitAt k $ telToList $ eqTel s (eqTel1, eqTel2) = (telFromList eqListTel1, telFromList eqListTel2) -- This is where the magic of higher-dimensional unification happens@@ -996,10 +967,11 @@ -- recursively (this doesn't get stuck in a loop because a type should -- never be indexed over itself). Note the similarity with the -- computeNeighbourhood function in Agda.TypeChecking.Coverage.+ let hduTel = eqTel1 `abstract` raise (size eqTel1) ctel res <- liftTCM $ addContext (varTel s) $ unifyIndices- (eqTel1 `abstract` ctel)- (allFlexVars $ eqTel1 `abstract` ctel)- dtype+ hduTel+ (allFlexVars hduTel)+ (raise (size hduTel) dtype) (raise (size ctel) ixs) (raiseFrom (size ctel) (size eqTel1) cixs) case res of@@ -1010,7 +982,11 @@ -- TODO: we could still make progress here if not --without-K, -- but I'm not sure if it's necessary.- DontKnow _ -> liftTCM $ DontKnow <$> err+ DontKnow _ -> let n = eqCount s+ Equal a u v = getEquality k s+ in return $ DontKnow [UnifyIndicesNotVars+ (varTel s `abstract` eqTel s) a+ (raise n u) (raise n v) (raise (n-k) ixs)] Unifies (eqTel1', rho0, _) -> do -- Split ps0 into parts for eqTel1 and ctel@@ -1040,31 +1016,22 @@ return $ Unifies $ s { eqTel = eqTel' , eqLHS = lhs' , eqRHS = rhs' } - where- err :: TCM TCErr- err = let n = eqCount s- Equal a u v = getEquality k s- in addContext (varTel s `abstract` eqTel s) $ typeError_- (UnifyIndicesNotVars a (raise n u) (raise n v) (raise (n-k) ixs))- unifyStep s Conflict- { conflictConLeft = c- , conflictConRight = c'- } = NoUnify <$> addContext (varTel s)- (typeError_ $ UnifyConflict c c')+ { conflictLeft = u+ , conflictRight = v+ } = return $ NoUnify $ UnifyConflict (varTel s) u v unifyStep s Cycle { cycleVar = i , cycleOccursIn = u- } = NoUnify <$> addContext (varTel s)- (typeError_ $ UnifyCycle i u)+ } = return $ NoUnify $ UnifyCycle (varTel s) i u unifyStep s EtaExpandVar{ expandVar = fi, expandVarRecordType = d , expandVarParameters = pars } = do delta <- liftTCM $ (`apply` pars) <$> getRecordFieldTypes d c <- liftTCM $ getRecordConstructor d let nfields = size delta (varTel', rho) = expandTelescopeVar (varTel s) (m-1-i) delta c- projectFlexible = [ FlexibleVar (flexHiding fi) (projFlexKind j) (flexPos fi) (i+j) | j <- [0..nfields-1] ]+ projectFlexible = [ FlexibleVar (flexHiding fi) (flexOrigin fi) (projFlexKind j) (flexPos fi) (i+j) | j <- [0..nfields-1] ] tellUnifySubst $ rho Unifies <$> liftTCM (reduce $ UState { varTel = varTel'@@ -1083,6 +1050,7 @@ RecordFlex ks -> fromMaybe ImplicitFlex $ ks !!! j ImplicitFlex -> ImplicitFlex DotFlex -> DotFlex+ OtherFlex -> OtherFlex liftFlexible :: Int -> Int -> Maybe Int liftFlexible n j = if j == i then Nothing else Just (if j > i then j + (n-1) else j)@@ -1113,8 +1081,7 @@ { litType = a , litConflictLeft = l , litConflictRight = l'- } = NoUnify <$> addContext (varTel s)- (typeError_ $ UnequalTerms CmpEq (Lit l) (Lit l') a)+ } = return $ NoUnify $ UnifyConflict (varTel s) (Lit l) (Lit l') unifyStep s (StripSizeSuc k u v) = do sizeTy <- liftTCM sizeType@@ -1169,7 +1136,8 @@ -> UnifyM (UnificationResult' UnifyState) -> UnifyM (UnificationResult' UnifyState) tryUnifyStep step fallback = do- reportSDoc "tc.lhs.unify" 20 $ text "trying unifyStep" <+> prettyTCM step+ addContext (varTel s) $+ reportSDoc "tc.lhs.unify" 20 $ text "trying unifyStep" <+> prettyTCM step x <- unifyStep s step case x of Unifies s' -> do@@ -1177,15 +1145,12 @@ reportSDoc "tc.lhs.unify" 20 $ text "new unifyState:" <+> prettyTCM s' writeUnifyLog $ UnificationStep s step return x- NoUnify{} -> return x- DontKnow err -> do+ NoUnify{} -> return x+ DontKnow err1 -> do y <- fallback case y of- DontKnow{} -> return x- _ -> return y+ DontKnow err2 -> return $ DontKnow $ err1 ++ err2+ _ -> return y failure :: UnifyM (UnificationResult' a)- failure = do- err <- addContext (varTel s) $ typeError_ $- UnificationStuck (eqTel s) (map unArg $ eqLHS s) (map unArg $ eqRHS s)- return $ DontKnow err+ failure = return $ DontKnow []
src/full/Agda/TypeChecking/Rules/Record.hs view
@@ -35,6 +35,7 @@ import Agda.Utils.Monad import Agda.Utils.Null import Agda.Utils.Permutation+import qualified Agda.Utils.Pretty as P import Agda.Utils.Size #include "undefined.h"@@ -93,11 +94,6 @@ -- compute the field telescope (does not include record parameters) let TelV ftel _ = telView' contype - -- A record is irrelevant if all of its fields are.- -- In this case, the associated module parameter will be irrelevant.- -- See issue 392.- recordRelevance = minimum $ Irrelevant : (map getRelevance $ telToList ftel)- -- Compute correct type of constructor -- t = tel -> t0 where t0 must be a sort s@@ -149,8 +145,25 @@ -- haveEta = maybe (Inferred $ conInduction == Inductive && etaenabled) Specified eta con = ConHead conName conInduction $ map unArg fs - reportSDoc "tc.rec" 30 $ text "record constructor is " <+> text (show con)+ -- A record is irrelevant if all of its fields are.+ -- In this case, the associated module parameter will be irrelevant.+ -- See issue 392.+ -- Unless it's been declared coinductive or no-eta-equality (#2607).+ recordRelevance+ | eta == Just False = Relevant+ | conInduction == CoInductive = Relevant+ | otherwise = minimum $ Irrelevant : (map getRelevance $ telToList ftel) + -- Andreas, 2017-01-26, issue #2436+ -- Disallow coinductive records with eta-equality+ when (conInduction == CoInductive && etaEqualityToBool haveEta == True) $ do+ typeError . GenericDocError =<< do+ sep [ text "Agda doesn't like coinductive records with eta-equality."+ , text "If you must, use pragma"+ , text "{-# ETA" <+> prettyTCM name <+> text "#-}"+ ]+ reportSDoc "tc.rec" 30 $ text "record constructor is " <+> prettyTCM con+ -- Add the record definition. -- Andreas, 2016-06-17, Issue #2018:@@ -176,8 +189,7 @@ -- We retain the original user declaration [(co)inductive] -- in case the record turns out to be recursive. -- Determined by positivity checker:- , recRecursive = False- , recMutual = []+ , recMutual = Nothing } -- Add record constructor to signature@@ -185,6 +197,7 @@ defaultDefn defaultArgInfo conName (telh `abstract` contype) $ Constructor { conPars = npars+ , conArity = size fs , conSrcCon = con , conData = name , conAbstr = Info.defAbstract conInfo@@ -197,7 +210,7 @@ addNamedInstance conName name -- Check that the fields fit inside the sort- contype `fitsIn` s+ _ <- contype `fitsIn` s {- Andreas, 2011-04-27 WRONG because field types are checked again and then non-stricts should not yet be irrelevant@@ -251,7 +264,7 @@ [ text "record section:" , nest 2 $ sep [ prettyTCM m <+> (inTopContext . prettyTCM =<< getContextTelescope)- , fsep $ punctuate comma $ map (text . show . getName) fields+ , fsep $ punctuate comma $ map (return . P.pretty . getName) fields ] ] reportSDoc "tc.rec.def" 15 $ nest 2 $ vcat@@ -276,9 +289,6 @@ setDefaultModuleParameters m checkRecordProjections m name hasNamedCon con tel' (raise 1 ftel) fields - -- Andreas 2012-02-13: postpone polarity computation until after positivity check- -- computePolarity name- return () {-| @checkRecordProjections m r q tel ftel fs@.@@ -316,13 +326,14 @@ -- because then meta variables are created again. -- Instead, we take the field type t from the field telescope. reportSDoc "tc.rec.proj" 5 $ sep- [ text "checking projection" <+> text (show x)+ [ text "checking projection" <+> prettyTCM x , nest 2 $ vcat [ text "top =" <+> (inTopContext . prettyTCM =<< getContextTelescope) , text "tel =" <+> (inTopContext . prettyTCM $ tel) , text "ftel1 =" <+> prettyTCM ftel1 , text "t =" <+> prettyTCM t , text "ftel2 =" <+> addContext ftel1 (underAbstraction_ ftel2 prettyTCM)+ , text "abstr =" <+> (text . show) (Info.defAbstract info) ] ] @@ -391,19 +402,21 @@ cpo = if hasNamedCon then ConOCon else ConORec cpi = ConPatternInfo (Just cpo) (Just $ argFromDom $ fmap snd rt) conp = defaultArg $ ConP con cpi $- [ Arg info $ unnamed $ varP "x" | Dom info _ <- telToList ftel ]+ [ Arg ai' $ unnamed $ varP "x" | Dom ai' _ <- telToList ftel ] body = Just $ bodyMod $ var (size ftel2) cltel = ftel- clause = Clause { clauseRange = getRange info+ clause = Clause { clauseLHSRange = getRange info+ , clauseFullRange = getRange info , clauseTel = killRange cltel , namedClausePats = [Named Nothing <$> numberPatVars __IMPOSSIBLE__ (idP $ size ftel) conp] , clauseBody = body , clauseType = Just $ Arg ai t , clauseCatchall = False+ , clauseUnreachable = Just False } let projection = Projection- { projProper = True+ { projProper = Just r , projOrig = projname -- name of the record type: , projFromType = defaultArg r@@ -433,7 +446,7 @@ -- functions. cc <- compileClauses Nothing [clause] - reportSDoc "tc.cc" 10 $ do+ reportSDoc "tc.cc" 60 $ do sep [ text "compiled clauses of " <+> prettyTCM projname , nest 2 $ text (show cc) ]@@ -449,7 +462,7 @@ , funCopatternLHS = isCopatternLHS [clause] }) { defArgOccurrences = [StrictPos] }- computePolarity projname+ computePolarity [projname] when (Info.defInstance info == InstanceDef) $ addTypedInstance projname finalt
src/full/Agda/TypeChecking/Rules/Term.hs view
@@ -1,6 +1,5 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE NondecreasingIndentation #-}-{-# LANGUAGE ScopedTypeVariables #-} module Agda.TypeChecking.Rules.Term where @@ -16,7 +15,7 @@ import Data.Maybe import Data.Either (partitionEithers) import Data.Monoid (mappend)-import Data.List hiding (sort, null)+import qualified Data.List as List import qualified Data.Map as Map import qualified Data.Set as Set import Data.Traversable (sequenceA)@@ -76,20 +75,21 @@ import {-# SOURCE #-} Agda.TypeChecking.Rules.Decl (checkSectionApplication) import {-# SOURCE #-} Agda.TypeChecking.Rules.Def (checkFunDef, checkFunDef', useTerPragma) +import Agda.Utils.Either import Agda.Utils.Except- ( Error(noMsg, strMsg)- , ExceptT+ ( ExceptT , MonadError(catchError, throwError) , runExceptT )- import Agda.Utils.Functor import Agda.Utils.Lens-import Agda.Utils.List (groupOn)+import Agda.Utils.List import Agda.Utils.Maybe import Agda.Utils.Monad import Agda.Utils.Null import Agda.Utils.Permutation+import Agda.Utils.Pretty ( prettyShow )+import qualified Agda.Utils.Pretty as P import Agda.Utils.Size import Agda.Utils.Tuple @@ -131,7 +131,7 @@ A.Set _ n -> do return $ sort (mkType n) A.App i s arg- | getHiding arg == NotHidden,+ | visible arg, A.Set _ 0 <- unScope s -> ifNotM hasUniversePolymorphism (typeError $ GenericError "Use --universe-polymorphism to enable level arguments to Set")@@ -207,30 +207,6 @@ leqType_ :: Type -> Type -> TCM () leqType_ t t' = workOnTypes $ leqType t t' -{- UNUSED--- | Force a type to be a Pi. Instantiates if necessary. The 'Hiding' is only--- used when instantiating a meta variable.--forcePi :: Hiding -> String -> Type -> TCM Type-forcePi h name (El s t) =- do t' <- reduce t- case t' of- Pi _ _ -> return $ El s t'- _ -> do- sa <- newSortMeta- sb <- newSortMeta- let s' = sLub sa sb-- a <- newTypeMeta sa- x <- freshName_ name- let arg = setHiding h $ defaultDom a- b <- addContext (x, arg) $ newTypeMeta sb- let ty = El s' $ Pi arg (Abs (show x) b)- equalType (El s t') ty- ty' <- reduce ty- return ty'--}- --------------------------------------------------------------------------- -- * Telescopes ---------------------------------------------------------------------------@@ -292,7 +268,7 @@ -- modify the new context entries modEnv LamNotPi = workOnTypes modEnv _ = id- modRel PiNotLam xp = if xp then irrToNonStrict else nonStrictToRel+ modRel PiNotLam xp = if xp then irrToNonStrict . nonStrictToRel else nonStrictToRel modRel _ _ = id checkTypedBinding lamOrPi info (A.TLet _ lbs) ret = do checkLetBindings lbs (ret [])@@ -306,7 +282,7 @@ checkLambda (Arg _ (A.TLet _ lbs)) body target = checkLetBindings lbs (checkExpr body target) checkLambda (Arg info (A.TBind _ xs typ)) body target = do- reportSLn "tc.term.lambda" 60 $ "checkLambda xs = " ++ show xs+ reportSLn "tc.term.lambda" 60 $ "checkLambda xs = " ++ prettyShow xs let numbinds = length xs TelV tel btyp <- telViewUpTo numbinds target@@ -349,36 +325,60 @@ -- Block on the type comparison coerce (teleLam tel v) (telePi tel t1) target - useTargetType tel@(ExtendTel arg (Abs y EmptyTel)) btyp = do+ useTargetType tel@(ExtendTel dom (Abs y EmptyTel)) btyp = do verboseS "tc.term.lambda" 5 $ tick "lambda-with-target-type"- reportSLn "tc.term.lambda" 60 $ "useTargetType y = " ++ show y+ reportSLn "tc.term.lambda" 60 $ "useTargetType y = " ++ y -- merge in the hiding info of the TBind+ let [WithHiding h x] = xs info <- return $ mapHiding (mappend h) info- unless (getHiding arg == getHiding info) $ typeError $ WrongHidingInLambda target+ unless (sameHiding dom info) $ typeError $ WrongHidingInLambda target -- Andreas, 2011-10-01 ignore relevance in lambda if not explicitly given- let r = getRelevance info- r' = getRelevance arg -- relevance of function type- when (r == Irrelevant && r' /= r) $ typeError $ WrongIrrelevanceInLambda target+ info <- lambdaIrrelevanceCheck info dom -- Andreas, 2015-05-28 Issue 1523 -- Ensure we are not stepping under a possibly non-existing size. -- TODO: do we need to block checkExpr?- let a = unDom arg+ let a = unDom dom checkSizeLtSat $ unEl a -- We only need to block the final term on the argument type -- comparison. The body will be blocked if necessary. We still want to -- compare the argument types first, so we spawn a new problem for that -- check. (pid, argT) <- newProblem $ isTypeEqualTo typ a- v <- add (notInScopeName y) (Dom (setRelevance r' info) argT) $ checkExpr body btyp- blockTermOnProblem target (Lam info $ Abs (nameToArgName x) v) pid- where- [WithHiding h x] = xs -- Andreas, Issue 630: take name from function type if lambda name is "_"- add y dom | isNoName x = addContext' (y, dom)- | otherwise = addContext' (x, dom)+ v <- lambdaAddContext x y (Dom info argT) $ checkExpr body btyp+ blockTermOnProblem target (Lam info $ Abs (nameToArgName x) v) pid+ useTargetType _ _ = __IMPOSSIBLE__ +-- | Check that irrelevance info in lambda is compatible with irrelevance+-- coming from the function type.+-- If lambda has no user-given relevance, copy that of function type.+lambdaIrrelevanceCheck :: LensRelevance dom => ArgInfo -> dom -> TCM ArgInfo+lambdaIrrelevanceCheck info dom+ -- Case: no specific user annotation: use relevance of function type+ | isRelevant info = return $ setRelevance (getRelevance dom) info+ -- Case: explicit user annotation is taken seriously+ | otherwise = do+ let rPi = getRelevance dom -- relevance of function type+ let rLam = getRelevance info -- relevance of lambda+ -- Andreas, 2017-01-24, issue #2429+ -- we should report an error if we try to check a relevant function+ -- against an irrelevant function type (subtyping violation)+ unless (moreRelevant rPi rLam) $ do+ -- @rLam == Relevant@ is impossible here+ -- @rLam == Irrelevant@ is impossible here (least relevant)+ -- this error can only happen if @rLam == NonStrict@ and @rPi == Irrelevant@+ unless (rLam == NonStrict) __IMPOSSIBLE__ -- separate tests for separate line nums+ unless (rPi == Irrelevant) __IMPOSSIBLE__+ typeError WrongIrrelevanceInLambda+ return info++lambdaAddContext :: Name -> ArgName -> Dom Type -> TCM a -> TCM a+lambdaAddContext x y dom+ | isNoName x = addContext' (notInScopeName y, dom) -- Note: String instance+ | otherwise = addContext' (x, dom) -- Name instance of addContext'+ -- | Checking a lambda whose domain type has already been checked. checkPostponedLambda :: Arg ([WithHiding Name], Maybe Type) -> A.Expr -> Type -> TCM Term checkPostponedLambda args@(Arg _ ([] , _ )) body target = do@@ -388,11 +388,7 @@ lamHiding = mappend h $ getHiding info insertHiddenLambdas lamHiding target postpone $ \ t@(El _ (Pi dom b)) -> do -- Andreas, 2011-10-01 ignore relevance in lambda if not explicitly given- let r = getRelevance info -- relevance of lambda- r' = getRelevance dom -- relevance of function type- info' = setHiding lamHiding $ setRelevance r' info- when (r == Irrelevant && r' /= r) $- typeError $ WrongIrrelevanceInLambda target+ info' <- setHiding lamHiding <$> lambdaIrrelevanceCheck info dom -- We only need to block the final term on the argument type -- comparison. The body will be blocked if necessary. We still want to -- compare the argument types first, so we spawn a new problem for that@@ -403,9 +399,9 @@ -- to get better error messages. -- Using the type dom from the usage context would be more precise, -- though.- let add dom | isNoName x = addContext (absName b, dom)- | otherwise = addContext (x, dom)- v <- add (maybe dom (dom $>) mt) $+ let dom' = setRelevance (getRelevance info') . setHiding lamHiding $+ maybe dom (dom $>) mt+ v <- lambdaAddContext x (absName b) dom' $ checkPostponedLambda (Arg info (xs, mt)) body $ absBody b let v' = Lam info' $ Abs (nameToArgName x) v maybe (return v') (blockTermOnProblem t v') mpid@@ -432,7 +428,7 @@ Pi dom b -> do let h' = getHiding dom -- Found expected hiding: return function type.- if h == h' then ret t else do+ if sameHiding h h' then ret t else do -- Found a visible argument but expected a hidden one: -- That's an error, as we cannot insert a visible lambda. if visible h' then typeError $ WrongHidingInLambda target else do@@ -446,13 +442,13 @@ -- | @checkAbsurdLambda i h e t@ checks absurd lambda against type @t@. -- Precondition: @e = AbsurdLam i h@-checkAbsurdLambda :: A.ExprInfo -> Hiding -> A.Expr -> Type -> TCM Term+checkAbsurdLambda :: A.LamInfo -> Hiding -> A.Expr -> Type -> TCM Term checkAbsurdLambda i h e t = do t <- instantiateFull t ifBlockedType t (\ m t' -> postponeTypeCheckingProblem_ $ CheckExpr e t') $ \ t' -> do case ignoreSharing $ unEl t' of Pi dom@(Dom info' a) b- | h /= getHiding info' -> typeError $ WrongHidingInLambda t'+ | not (sameHiding h info') -> typeError $ WrongHidingInLambda t' | not (null $ allMetas a) -> postponeTypeCheckingProblem (CheckExpr e t') $ null . allMetas <$> instantiateFull a@@ -474,13 +470,15 @@ , defArgOccurrences = [Unused] }) $ emptyFunction { funClauses =- [Clause- { clauseRange = getRange e+ [ Clause+ { clauseLHSRange = getRange e+ , clauseFullRange = getRange e , clauseTel = telFromList [fmap ("()",) dom]- , namedClausePats = [Arg info' $ Named (Just $ unranged $ absName b) $ debruijnNamedVar "()" 0]+ , namedClausePats = [Arg info' $ Named (Just $ unranged $ absName b) $ AbsurdP $ debruijnNamedVar absurdPatternName 0] , clauseBody = Nothing , clauseType = Just $ setRelevance rel $ defaultArg $ absBody b , clauseCatchall = False+ , clauseUnreachable = Just True -- absurd clauses are unreachable } ] , funCompiled = Just Fail@@ -494,7 +492,7 @@ -- | @checkExtendedLambda i di qname cs e t@ check pattern matching lambda. -- Precondition: @e = ExtendedLam i di qname cs@-checkExtendedLambda :: A.ExprInfo -> A.DefInfo -> QName -> [A.Clause] ->+checkExtendedLambda :: A.LamInfo -> A.DefInfo -> QName -> [A.Clause] -> A.Expr -> Type -> TCM Term checkExtendedLambda i di qname cs e t = do -- Andreas, 2016-06-16 issue #2045@@ -520,8 +518,8 @@ text "\" has type: " $$ prettyTCM t -- <+> text " where clauses: " <+> text (show cs) args <- getContextArgs freevars <- getCurrentModuleFreeVars- let argsNoParam = genericDrop freevars args -- don't count module parameters- let (hid, notHid) = partition notVisible argsNoParam+ let argsNoParam = drop freevars args -- don't count module parameters+ let (hid, notHid) = List.partition notVisible argsNoParam reportSDoc "tc.term.exlam" 30 $ vcat $ [ text "dropped args: " <+> prettyTCM (take freevars args) , text "hidden args: " <+> prettyTCM hid@@ -538,6 +536,8 @@ -- Case: we could not check the extended lambda because we are blocked on a meta. -- In this case, we want to postpone. Just (err, x) -> do+ reportSDoc "tc.term.exlam" 50 $ vcat $+ [ text "checking extended lambda got stuck on meta: " <+> text (show x) ] -- Note that we messed up the state a bit. We might want to unroll these state changes. -- However, they are mostly harmless: -- 1. We created a new mutual block id.@@ -550,19 +550,27 @@ -- The meta might not be known in the reset state, as it could have been created -- somewhere on the way to the type error. mm <- Map.lookup x <$> getMetaStore- case mvInstantiation <$> mm of+ x' <- case mvInstantiation <$> mm of -- Case: we do not know the meta+ -- We mine the type of the extended lambda for a (possibly) blocking meta. Nothing -> do- -- TODO: mine for a meta in t- -- For now, we fail.- throwError err+ reportSDoc "tc.term.exlam" 50 $ vcat $+ [ text "meta was not found in reset state"+ , text "trying to find meta in type of extlam..." ]+ case allMetas t of+ [] -> do+ reportSDoc "tc.term.exlam" 50 $ text "no meta found, giving up."+ throwError err+ (x:_) -> do+ reportSDoc "tc.term.exlam" 50 $ text $ "found meta: " ++ show x+ return x -- Case: we know the meta here. Just InstV{} -> __IMPOSSIBLE__ -- It cannot be instantiated yet.- Just{} -> do- -- It has to be blocked on some meta, so we can postpone,- -- being sure it will be retired when a meta is solved- -- (which might be the blocking meta in which case we actually make progress).- postponeTypeCheckingProblem (CheckExpr e t) $ isInstantiatedMeta x+ Just{} -> return x+ -- It has to be blocked on some meta, so we can postpone,+ -- being sure it will be retired when a meta is solved+ -- (which might be the blocking meta in which case we actually make progress).+ postponeTypeCheckingProblem (CheckExpr e t) $ isInstantiatedMeta x' where -- Concrete definitions cannot use information about abstract things. abstract ConcreteDef = inConcreteMode@@ -573,11 +581,16 @@ -- * If successful, return Nothing. -- -- * If @IlltypedPattern p a@ is thrown and type @a@ is blocked on some meta @x@--- return @Just x@. Note that the returned meta might only exists in the state--- where the error was thrown, thus, be an invalid 'MetaId' in the current state.+-- return @Just x@. --+-- * If @SplitError (UnificationStuck c tel us vs _)@ is thrown and the unification+-- problem @us =?= vs : tel@ is blocked on some meta @x@ return @Just x@.+-- -- * If another error was thrown or the type @a@ is not blocked, reraise the error. --+-- Note that the returned meta might only exists in the state where the error was+-- thrown, thus, be an invalid 'MetaId' in the current state.+-- catchIlltypedPatternBlockedOnMeta :: TCM () -> TCM (Maybe (TCErr, MetaId)) catchIlltypedPatternBlockedOnMeta m = (Nothing <$ do disableDestructiveUpdate m) `catchError` \ err -> do@@ -589,6 +602,14 @@ enterClosure cl $ \ _ -> do ifBlockedType a (\ x _ -> return $ Just x) $ {- else -} \ _ -> return Nothing caseMaybe mx reraise $ \ x -> return $ Just (err, x)+ TypeError s cl@Closure{ clValue = SplitError (UnificationStuck c tel us vs _) } -> do+ mx <- localState $ do+ put s+ enterClosure cl $ \ _ -> do+ problem <- reduce =<< instantiateFull (flattenTel tel, us, vs)+ -- over-approximating the set of metas actually blocking unification+ return $ listToMaybe $ allMetas problem+ caseMaybe mx reraise $ \ x -> return $ Just (err, x) _ -> reraise ---------------------------------------------------------------------------@@ -598,7 +619,7 @@ expandModuleAssigns :: [Either A.Assign A.ModuleName] -> [C.Name] -> TCM A.Assigns expandModuleAssigns mfs exs = do let (fs , ms) = partitionEithers mfs- exs' = exs \\ map (view nameFieldA) fs+ exs' = exs List.\\ map (view nameFieldA) fs fs' <- forM exs' $ \ f -> do pms <- forM ms $ \ m -> do modScope <- getNamedScope m@@ -612,7 +633,11 @@ case catMaybes pms of [] -> return Nothing [(_, fa)] -> return (Just fa)- mfas -> typeError $ GenericError $ "Ambiguity: the field " ++ show f ++ " appears in the following modules " ++ show (map fst mfas)+ mfas -> typeError . GenericDocError =<< do+ vcat $+ [ text "Ambiguity: the field" <+> prettyTCM f+ <+> text "appears in the following modules: " ]+ ++ map (prettyTCM . fst) mfas return (fs ++ catMaybes fs') -- | @checkRecordExpression fs e t@ checks record construction against type @t@.@@ -628,27 +653,27 @@ -- Case: We know the type of the record already. Def r es -> do let ~(Just vs) = allApplyElims es- reportSDoc "tc.term.rec" 20 $ text $ " r = " ++ show r+ reportSDoc "tc.term.rec" 20 $ text $ " r = " ++ prettyShow r reportSDoc "tc.term.rec" 30 $ text " xs = " <> do- text =<< show . map unArg <$> getRecordFieldNames r+ text =<< prettyShow . map unArg <$> getRecordFieldNames r reportSDoc "tc.term.rec" 30 $ text " ftel= " <> do prettyTCM =<< getRecordFieldTypes r reportSDoc "tc.term.rec" 30 $ text " con = " <> do- text =<< show <$> getRecordConstructor r+ text =<< prettyShow <$> getRecordConstructor r def <- getRecordDef r let -- Field names with ArgInfo. axs = recordFieldNames def- exs = filter notHidden axs+ exs = filter visible axs -- Just field names. xs = map unArg axs -- Record constructor. con = killRange $ recConHead def reportSDoc "tc.term.rec" 20 $ vcat- [ text $ " xs = " ++ show xs- , text " ftel= " <> prettyTCM (recTel def)- , text $ " con = " ++ show con+ [ text " xs = " <> return (P.pretty xs)+ , text " ftel= " <> prettyTCM (recTel def)+ , text " con = " <> return (P.pretty con) ] -- Compute the list of given fields, decorated with the ArgInfo from the record def.@@ -657,7 +682,7 @@ -- Compute a list of metas for the missing visible fields. scope <- getScope let re = getRange e- meta x = A.Underscore $ A.MetaInfo re scope Nothing (show x)+ meta x = A.Underscore $ A.MetaInfo re scope Nothing (prettyShow x) -- In @es@ omitted explicit fields are replaced by underscores. -- Omitted implicit or instance fields -- are still left out and inserted later by checkArguments_.@@ -679,8 +704,8 @@ -- If there are no records with the right fields we might as well fail right away. [] -> case fields of [] -> typeError $ GenericError "There are no records in scope"- [f] -> typeError $ GenericError $ "There is no known record with the field " ++ show f- _ -> typeError $ GenericError $ "There is no known record with the fields " ++ unwords (map show fields)+ [f] -> typeError $ GenericError $ "There is no known record with the field " ++ prettyShow f+ _ -> typeError $ GenericError $ "There is no known record with the fields " ++ unwords (map prettyShow fields) -- If there's only one record with the appropriate fields, go with that. [r] -> do def <- getConstInfo r@@ -740,7 +765,7 @@ _ -> typeError $ ShouldBeRecordType t where replaceFields :: Name -> A.ExprInfo -> Arg A.QName -> Maybe A.Expr -> Maybe A.Expr- replaceFields n ei a@(Arg _ p) Nothing | notHidden a =+ replaceFields n ei a@(Arg _ p) Nothing | visible a = Just $ A.App ei (A.Def p) $ defaultNamedArg $ A.Var n replaceFields _ _ (Arg _ _) Nothing = Nothing replaceFields _ _ _ (Just e) = Just $ e@@ -802,7 +827,7 @@ reportSDoc "tc.term.expr.top" 15 $ text "Checking" <+> sep [ fsep [ prettyTCM e, text ":", prettyTCM t0 ]- , nest 2 $ text "at " <+> (text . show =<< getCurrentRange)+ , nest 2 $ text "at " <+> (text . prettyShow =<< getCurrentRange) ] reportSDoc "tc.term.expr.top.detailed" 80 $ text "Checking" <+> fsep [ prettyTCM e, text ":", text (show t0) ]@@ -812,37 +837,12 @@ e <- scopedExpr e - case e of+ tryInsertHiddenLambda e t $ case e of A.ScopedExpr scope e -> __IMPOSSIBLE__ -- setScope scope >> checkExpr e t - -- Insert hidden lambda if all of the following conditions are met:- -- type is a hidden function type, {x : A} -> B or {{x : A} -> B- _ | Pi (Dom info _) b <- ignoreSharing $ unEl t- , let h = getHiding info- , notVisible h- -- expression is not a matching hidden lambda or question mark- , not (hiddenLambdaOrHole h e)- -> do- x <- unshadowName <=< freshName rx $ notInScopeName $ absName b- reportSLn "tc.term.expr.impl" 15 $ "Inserting implicit lambda"- checkExpr (A.Lam (A.ExprRange re) (domainFree info x) e) t- where- re = getRange e- rx = caseMaybe (rStart re) noRange $ \ pos -> posToRange pos pos-- hiddenLambdaOrHole h e = case e of- A.AbsurdLam _ h' -> h == h'- A.ExtendedLam _ _ _ cls -> any hiddenLHS cls- A.Lam _ bind _ -> h == getHiding bind- A.QuestionMark{} -> True- _ -> False-- hiddenLHS (A.Clause (A.LHS _ (A.LHSHead _ (a : _)) _) _ _ _ _) = notVisible a- hiddenLHS _ = False- -- a meta variable without arguments: type check directly for efficiency- A.QuestionMark i ii -> checkQuestionMark (newValueMeta' DontRunMetaOccursCheck) t0 i ii+ A.QuestionMark i ii -> checkQuestionMark (newValueMeta' RunMetaOccursCheck) t0 i ii A.Underscore i -> checkUnderscore t0 i A.WithApp _ e es -> typeError $ NotImplemented "type checking of with application"@@ -870,11 +870,14 @@ let quoted (A.Def x) = return x quoted (A.Macro x) = return x quoted (A.Proj o (AmbQ [x])) = return x- quoted (A.Proj o (AmbQ xs)) = typeError $ GenericError $ "quote: Ambigous name: " ++ show xs+ quoted (A.Proj o (AmbQ xs)) =+ typeError $ GenericError $ "quote: Ambigous name: " ++ prettyShow xs quoted (A.Con (AmbQ [x])) = return x- quoted (A.Con (AmbQ xs)) = typeError $ GenericError $ "quote: Ambigous name: " ++ show xs+ quoted (A.Con (AmbQ xs)) =+ typeError $ GenericError $ "quote: Ambigous name: " ++ prettyShow xs quoted (A.ScopedExpr _ e) = quoted e- quoted _ = typeError $ GenericError $ "quote: not a defined name"+ quoted _ =+ typeError $ GenericError $ "quote: not a defined name" x <- quoted (namedThing e) ty <- qNameType coerce (quoteName x) ty t@@ -977,6 +980,67 @@ -- Application _ | Application hd args <- appView e -> checkApplication hd args e t + where+ -- | Call checkExpr with an hidden lambda inserted if appropriate,+ -- else fallback.+ tryInsertHiddenLambda :: A.Expr -> Type -> TCM Term -> TCM Term+ tryInsertHiddenLambda e t fallback+ -- Insert hidden lambda if all of the following conditions are met:+ -- type is a hidden function type, {x : A} -> B or {{x : A}} -> B+ | Pi (Dom info a) b <- ignoreSharing $ unEl t+ , let h = getHiding info+ , notVisible h+ -- expression is not a matching hidden lambda or question mark+ , not (hiddenLambdaOrHole h e)+ = do+ let proceed = doInsert info $ absName b+ -- If we skip the lambda insertion for an introduction,+ -- we will hit a dead end, so proceed no matter what.+ if definitelyIntroduction then proceed else do+ -- Andreas, 2017-01-19, issue #2412:+ -- We do not want to insert a hidden lambda if A is+ -- possibly empty type of sizes, as this will produce an error.+ reduce a >>= isSizeType >>= \case+ Just (BoundedLt u) -> ifBlocked u (\ _ _ -> fallback) $ \ v -> do+ ifM (checkSizeNeverZero v) proceed fallback+ _ -> proceed++ | otherwise = fallback++ where+ re = getRange e+ rx = caseMaybe (rStart re) noRange $ \ pos -> posToRange pos pos++ doInsert info y = do+ x <- unshadowName <=< freshName rx $ notInScopeName y+ reportSLn "tc.term.expr.impl" 15 $ "Inserting implicit lambda"+ checkExpr (A.Lam (A.defaultLamInfo re) (domainFree info x) e) t++ hiddenLambdaOrHole h e = case e of+ A.AbsurdLam _ h' -> sameHiding h h'+ A.ExtendedLam _ _ _ cls -> any hiddenLHS cls+ A.Lam _ bind _ -> sameHiding h bind+ A.QuestionMark{} -> True+ _ -> False++ hiddenLHS (A.Clause (A.LHS _ (A.LHSHead _ (a : _)) _) _ _ _ _ _) = notVisible a+ hiddenLHS _ = False++ -- Things with are definitely introductions,+ -- thus, cannot be of hidden Pi-type, unless they are hidden lambdas.+ definitelyIntroduction = case e of+ A.Lam{} -> True+ A.AbsurdLam{} -> True+ A.Lit{} -> True+ A.Pi{} -> True+ A.Fun{} -> True+ A.Set{} -> True+ A.Prop{} -> True+ A.Rec{} -> True+ A.RecUpdate{} -> True+ A.ScopedExpr{} -> __IMPOSSIBLE__+ A.ETel{} -> __IMPOSSIBLE__+ _ -> False --------------------------------------------------------------------------- -- * Reflection ---------------------------------------------------------------------------@@ -1069,7 +1133,7 @@ inferOrCheckProjApp e o ds args mt = do reportSDoc "tc.proj.amb" 20 $ vcat [ text "checking ambiguous projection"- , text $ " ds = " ++ show ds+ , text $ " ds = " ++ prettyShow ds , text " args = " <+> sep (map prettyTCM args) , text " t = " <+> caseMaybe mt (text "Nothing") prettyTCM ]@@ -1077,7 +1141,7 @@ let refuse :: String -> TCM (Term, Type) refuse reason = typeError $ GenericError $ "Cannot resolve overloaded projection "- ++ show (A.nameConcrete $ A.qnameName $ head ds)+ ++ prettyShow (A.nameConcrete $ A.qnameName $ fromMaybe __IMPOSSIBLE__ $ headMaybe ds) ++ " because " ++ reason refuseNotApplied = refuse "it is not applied to a visible argument" refuseNoMatching = refuse "no matching candidate found"@@ -1099,7 +1163,7 @@ -- For now, we only allow ambiguous projections if the first visible -- argument is the record value. - case filter (visible . getHiding . snd) $ zip [0..] args of+ case filter (visible . snd) $ zip [0..] args of -- Case: we have no visible argument to the projection. -- In inference mode, we really need the visible argument, postponing does not help@@ -1113,7 +1177,7 @@ caseMaybeM (isRecordType ta) refuseNotRecordType $ \ (_q, _pars, defn) -> do case defn of Record { recFields = fs } -> do- case catMaybes $ for fs $ \ (Arg _ f) -> find (f ==) ds of+ case catMaybes $ for fs $ \ (Arg _ f) -> List.find (f ==) ds of [] -> refuseNoMatching [d] -> do storeDisambiguatedName d@@ -1137,12 +1201,31 @@ -- try to project it with all of the possible projections let try d = do reportSDoc "tc.proj.amb" 30 $ vcat- [ text $ "trying projection " ++ show d+ [ text $ "trying projection " ++ prettyShow d , text " td = " <+> caseMaybeM (getDefType d ta) (text "Nothing") prettyTCM ]+ -- get the original projection name- Projection{ projProper = proper, projOrig = orig } <- MaybeT $ isProjection d- guard proper+ isP <- isProjection d+ reportSDoc "tc.proj.amb" 40 $ vcat $+ [ text $ " isProjection = " ++ caseMaybe isP "no" (const "yes")+ ] ++ caseMaybe isP [] (\ Projection{ projProper = proper, projOrig = orig } ->+ [ text $ " proper = " ++ show proper+ , text $ " orig = " ++ prettyShow orig+ ])++ -- Andreas, 2017-01-21, issue #2422+ -- The scope checker considers inherited projections (from nested records)+ -- as projections and allows overloading. However, since they are defined+ -- as *composition* of projections, the type checker does *not* recognize them,+ -- and @isP@ will be @Nothing@.+ -- However, we can ignore this, as we only need the @orig@inal projection name+ -- for removing false ambiguity. Thus, we skip these checks:++ -- Projection{ projProper = proper, projOrig = orig } <- MaybeT $ return isP+ -- guard $ isJust proper+ let orig = caseMaybe isP d projOrig+ -- try to eliminate (dom, u, tb) <- MaybeT (projectTyped v ta o d `catchError` \ _ -> return Nothing) reportSDoc "tc.proj.amb" 30 $ vcat@@ -1174,7 +1257,7 @@ [] -> refuseNoMatching [[]] -> refuseNoMatching (_:_:_) -> refuse $ "several matching candidates found: "- ++ show (map (fst . snd) $ concat cands)+ ++ prettyShow (map (fst . snd) $ concat cands) -- case: just one matching projection d -- the term u = d v -- the type tb is the type of this application@@ -1235,49 +1318,62 @@ A.Proj o (AmbQ ds@(_:_:_)) -> checkProjApp e o ds args t -- Subcase: ambiguous constructor- A.Con (AmbQ cs@(_:_:_)) -> do+ A.Con (AmbQ cs0@(_:_:_)) -> do -- First we should figure out which constructor we want.- reportSLn "tc.check.term" 40 $ "Ambiguous constructor: " ++ show cs+ reportSLn "tc.check.term" 40 $ "Ambiguous constructor: " ++ prettyShow cs0 -- Get the datatypes of the various constructors let getData Constructor{conData = d} = d getData _ = __IMPOSSIBLE__- reportSLn "tc.check.term" 40 $ " ranges before: " ++ show (getRange cs)+ reportSLn "tc.check.term" 40 $ " ranges before: " ++ show (getRange cs0) -- We use the reduced constructor when disambiguating, but -- the original constructor for type checking. This is important -- since they may have different types (different parameters). -- See issue 279.- cons <- mapM getConForm cs- reportSLn "tc.check.term" 40 $ " reduced: " ++ show cons- dcs <- zipWithM (\ c con -> (, setConName c con) . getData . theDef <$> getConInfo con) cs cons- -- Type error- let badCon t = typeError $ DoesNotConstructAnElementOf (head cs) t- -- Lets look at the target type at this point- let getCon :: TCM (Maybe ConHead)- getCon = do- TelV tel t1 <- telView t- addContext tel $ do- reportSDoc "tc.check.term.con" 40 $ nest 2 $- text "target type: " <+> prettyTCM t1- ifBlockedType t1 (\ m t -> return Nothing) $ \ t' ->- caseMaybeM (isDataOrRecord $ unEl t') (badCon t') $ \ d ->- case [ c | (d', c) <- dcs, d == d' ] of- [c] -> do- reportSLn "tc.check.term" 40 $ " decided on: " ++ show c- storeDisambiguatedName $ conName c- return $ Just c- [] -> badCon $ t' $> Def d []- cs -> typeError $ CantResolveOverloadedConstructorsTargetingSameDatatype d $ map conName cs- let unblock = isJust <$> getCon -- to unblock, call getCon later again- mc <- getCon- case mc of- Just c -> checkConstructorApplication e t c args- Nothing -> postponeTypeCheckingProblem (CheckExpr e t) unblock+ -- Andreas, 2017-08-13, issue #2686: ignore abstract constructors+ (cs, cons) <- unzip . snd . partitionEithers <$> do+ forM cs0 $ \ c -> mapRight (c,) <$> getConForm c+ reportSLn "tc.check.term" 40 $ " reduced: " ++ prettyShow cons+ case cons of+ [] -> typeError $ AbstractConstructorNotInScope $+ fromMaybe __IMPOSSIBLE__ $ headMaybe cs0+ [con] -> do+ let c = setConName (fromMaybe __IMPOSSIBLE__ $ headMaybe cs) con+ reportSLn "tc.check.term" 40 $ " only one non-abstract constructor: " ++ prettyShow c+ storeDisambiguatedName $ conName c+ checkConstructorApplication e t c args+ _ -> do+ dcs <- zipWithM (\ c con -> (, setConName c con) . getData . theDef <$> getConInfo con) cs cons+ -- Type error+ let badCon t = typeError $ flip DoesNotConstructAnElementOf t $+ fromMaybe __IMPOSSIBLE__ $ headMaybe cs+ -- Lets look at the target type at this point+ let getCon :: TCM (Maybe ConHead)+ getCon = do+ TelV tel t1 <- telView t+ addContext tel $ do+ reportSDoc "tc.check.term.con" 40 $ nest 2 $+ text "target type: " <+> prettyTCM t1+ ifBlockedType t1 (\ m t -> return Nothing) $ \ t' ->+ caseMaybeM (isDataOrRecord $ unEl t') (badCon t') $ \ d ->+ case [ c | (d', c) <- dcs, d == d' ] of+ [c] -> do+ reportSLn "tc.check.term" 40 $ " decided on: " ++ prettyShow c+ storeDisambiguatedName $ conName c+ return $ Just c+ [] -> badCon $ t' $> Def d []+ cs -> typeError $ CantResolveOverloadedConstructorsTargetingSameDatatype d $ map conName cs+ let unblock = isJust <$> getCon -- to unblock, call getCon later again+ mc <- getCon+ case mc of+ Just c -> checkConstructorApplication e t c args+ Nothing -> postponeTypeCheckingProblem (CheckExpr e t) unblock -- Subcase: non-ambiguous constructor A.Con (AmbQ [c]) -> do -- augment c with record fields, but do not revert to original name- con <- getOrigConHead c+ con <- fromRightM (sigError __IMPOSSIBLE_VERBOSE__ (typeError $ AbstractConstructorNotInScope c)) =<<+ getOrigConHead c checkConstructorApplication e t con args -- Subcase: pattern synonym@@ -1344,7 +1440,7 @@ -- Unify Z a b == A -- Run the tactic on H tel <- metaTel args -- (x : X) (y : Y x)- target <- addContext tel newTypeMeta_ -- Z x y+ target <- addContext' tel newTypeMeta_ -- Z x y let holeType = telePi_ tel target -- (x : X) (y : Y x) → Z x y (vs, EmptyTel) <- checkArguments_ ExpandLast (getRange args) args tel -- a b : (x : X) (y : Y x)@@ -1358,10 +1454,16 @@ metaTel (arg : args) = do a <- newTypeMeta_ let dom = a <$ domFromArg arg- ExtendTel dom . Abs "x" <$> addContext ("x", dom) (metaTel args)+ ExtendTel dom . Abs "x" <$> addContext' ("x", dom) (metaTel args) -- Subcase: defined symbol or variable.- _ -> checkHeadApplication e t hd args+ _ -> do+ v <- checkHeadApplication e t hd args+ reportSDoc "tc.term.app" 30 $ vcat+ [ text "checkApplication: checkHeadApplication returned"+ , nest 2 $ text "v = " <+> prettyTCM v+ ]+ return v --------------------------------------------------------------------------- -- * Meta variables@@ -1411,7 +1513,11 @@ -- Rechecking an existing metavariable Just x -> do let v = MetaV x []+ reportSDoc "tc.meta.check" 20 $+ text "checking existing meta " <+> prettyTCM v t' <- jMetaType . mvJudgement <$> lookupMeta x+ reportSDoc "tc.meta.check" 20 $+ nest 2 $ text "of type " <+> prettyTCM t' case mt of Nothing -> return (v, t') Just t -> (,t) <$> coerce v t' t@@ -1427,7 +1533,7 @@ { A.metaRange = r , A.metaScope = emptyScopeInfo , A.metaNumber = Nothing- , A.metaNameSuggestion = show $ A.nameConcrete x+ , A.metaNameSuggestion = prettyShow $ A.nameConcrete x } ---------------------------------------------------------------------------@@ -1452,9 +1558,9 @@ (A.Var x) -> do -- traceCall (InferVar x) $ do (u, a) <- getVarInfo x reportSDoc "tc.term.var" 20 $ hsep- [ text "variable" , text (show x)+ [ text "variable" , prettyTCM x , text "(" , text (show u) , text ")"- , text "has type:" , text (show a)+ , text "has type:" , prettyTCM a ] when (unusableRelevance $ getRelevance a) $ typeError $ VariableIsIrrelevant x@@ -1470,16 +1576,17 @@ -- First, inferDef will try to apply the constructor -- to the free parameters of the current context. We ignore that.- con <- getOrigConHead c+ con <- fromRightM (sigError __IMPOSSIBLE_VERBOSE__ (typeError $ AbstractConstructorNotInScope c)) =<<+ getOrigConHead c (u, a) <- inferDef (\ _ -> Con con ConOCon []) c -- Next get the number of parameters in the current context. Constructor{conPars = n} <- theDef <$> (instantiateDef =<< getConstInfo c) - reportSLn "tc.term.con" 7 $ unwords [show c, "has", show n, "parameters."]+ reportSLn "tc.term.con" 7 $ unwords [prettyShow c, "has", show n, "parameters."] -- So when applying the constructor throw away the parameters.- return (apply u . genericDrop n, a)+ return (apply u . drop n, a) (A.Con _) -> __IMPOSSIBLE__ -- inferHead will only be called on unambiguous constructors (A.QuestionMark i ii) -> inferMeta (newQuestionMark ii) i (A.Underscore i) -> inferMeta (newValueMeta RunMetaOccursCheck) i@@ -1505,6 +1612,8 @@ -- since x is considered living in the top-level, we have to -- apply it to the current context vs <- freeVarsToApply x+ reportSDoc "tc.term.def" 60 $ do+ text "freeVarsToApply to def " <+> hsep (map (text . show) vs) reportSDoc "tc.term.def" 10 $ do text "inferred def " <+> prettyTCM x <+> hsep (map prettyTCM vs) let t = defType d@@ -1552,7 +1661,7 @@ reportSDoc "tc.term.con" 50 $ nest 2 $ text $ "n' = " ++ show n' when (n > n') -- preprocessor does not like ', so put on next line __IMPOSSIBLE__- let ps = genericTake n $ genericDrop (n' - n) vs+ let ps = take n $ drop (n' - n) vs ctype = defType cdef reportSDoc "tc.term.con" 20 $ vcat [ text "special checking of constructor application of" <+> prettyTCM c@@ -1603,7 +1712,7 @@ h = getHiding arg namedPar x = dropPar ((x ==) . unDom)- unnamedPar h = dropPar ((h ==) . getHiding)+ unnamedPar h = dropPar (sameHiding h) dropPar this (p : ps) | this p = Just ps | otherwise = dropPar this ps@@ -1676,17 +1785,17 @@ prettyTCM fType <+> text "?<=" <+> prettyTCM eType ] blockTerm t $ f vs <$ workOnTypes (do- addContext eTel $ leqType fType eType+ addContext' eTel $ leqType fType eType compareTel t t1 CmpLeq eTel fTel) (A.Def c) | Just c == (nameOfSharp <$> kit) -> do arg <- case args of- [a] | getHiding a == NotHidden -> return $ namedArg a- _ -> typeError $ GenericError $ show c ++ " must be applied to exactly one argument."+ [a] | visible a -> return $ namedArg a+ _ -> typeError $ GenericError $ prettyShow c ++ " must be applied to exactly one argument." -- The name of the fresh function. i <- fresh :: TCM Int- let name = filter (/= '_') (show $ A.nameConcrete $ A.qnameName c) ++ "-" ++ show i+ let name = filter (/= '_') (prettyShow $ A.nameConcrete $ A.qnameName c) ++ "-" ++ show i kit <- coinductionKit' let flat = nameOfFlat kit@@ -1717,7 +1826,7 @@ core = A.LHSProj { A.lhsDestructor = AmbQ [flat] , A.lhsFocus = defaultNamedArg $ A.LHSHead c' [] , A.lhsPatsRight = [] }- clause = A.Clause (A.LHS (A.LHSRange noRange) core []) []+ clause = A.Clause (A.LHS (A.LHSRange noRange) core []) [] [] (A.RHS arg Nothing) [] False @@ -1766,11 +1875,7 @@ checkArguments' expandLast (getRange hd) args t0 t $ \vs t1 -> do coerce (f vs) t1 t -traceCallE ::-#if !MIN_VERSION_transformers(0,4,1)- Error e =>-#endif- Call -> ExceptT e TCM r -> ExceptT e TCM r+traceCallE :: Call -> ExceptT e TCM r -> ExceptT e TCM r traceCallE call m = do z <- lift $ traceCall call $ runExceptT m case z of@@ -1806,8 +1911,8 @@ checkKnownArgument arg@(Arg info e) (Arg _infov v : vs) t = do (Dom info' a, b) <- mustBePi t -- Skip the arguments from vs that do not correspond to e- if not (getHiding info == getHiding info'- && (notHidden info || maybe True ((absName b ==) . rangedThing) (nameOf e)))+ if not (sameHiding info info'+ && (visible info || maybe True ((absName b ==) . rangedThing) (nameOf e))) -- Continue with the next one then checkKnownArgument arg vs (b `absApp` v) -- Found the right argument@@ -1828,8 +1933,10 @@ [ fsep [ prettyTCM arg, text ":", prettyTCM t0 ] ] reportSLn "tc.term.args.named" 75 $ " arg = " ++ show (deepUnscope arg)- let checkU = checkMeta (newMetaArg info x) t0- let checkQ = checkQuestionMark (newInteractionMetaArg info x) t0+ -- Ulf, 2017-03-24: (#2172) Always treat explicit _ and ? as implicit+ -- argument (i.e. solve with unification).+ let checkU = checkMeta (newMetaArg (setHiding Hidden info) x) t0+ let checkQ = checkQuestionMark (newInteractionMetaArg (setHiding Hidden info) x) t0 if not $ isHole e then checkExpr e t0 else localScope $ do -- Note: we need localScope here, -- as scopedExpr manipulates the scope in the state.@@ -1865,11 +1972,11 @@ t1' <- unEl <$> reduce t1 implicitArgs (-1) (expand t1') t0 where- expand (Pi (Dom info _) _) Hidden = getHiding info /= Hidden &&+ expand (Pi (Dom info _) _) Hidden = not (hidden info) && exh == ExpandLast expand _ Hidden = exh == ExpandLast- expand (Pi (Dom info _) _) Instance = getHiding info /= Instance- expand _ Instance = True+ expand (Pi (Dom info _) _) Instance{} = not $ isInstance info+ expand _ Instance{} = True expand _ NotHidden = False -- Case: argument given.@@ -1891,7 +1998,7 @@ expand NotHidden y = False -- insert a hidden argument if arg is not hidden or has different name -- insert an instance argument if arg is not instance or has different name- expand hy y = hy /= hx || maybe False (y /=) mx+ expand hy y = not (sameHiding hy hx) || maybe False (y /=) mx (nargs, t) <- lift $ implicitNamedArgs (-1) expand t0 -- Separate names from args. let (mxs, us) = unzip $ map (\ (Arg ai (Named mx u)) -> (mx, Arg ai u)) nargs@@ -1904,7 +2011,7 @@ -- 1. We ran out of function types. let shouldBePi -- a) It is an explicit argument, but we ran out of function types.- | notHidden info = lift $ typeError $ ShouldBePi t0'+ | visible info = lift $ typeError $ ShouldBePi t0' -- b) It is an implicit argument, and we did not insert any implicits. -- Thus, the type was not a function type to start with. | null xs = lift $ typeError $ ShouldBePi t0'@@ -1924,8 +2031,8 @@ -- t0' <- lift $ forcePi (getHiding info) (maybe "_" rangedThing $ nameOf e) t0' case ignoreSharing $ unEl t0' of Pi (Dom info' a) b- | getHiding info == getHiding info'- && (notHidden info || maybe True ((absName b ==) . rangedThing) (nameOf e)) -> do+ | sameHiding info info'+ && (visible info || maybe True ((absName b ==) . rangedThing) (nameOf e)) -> do u <- lift $ applyRelevanceToContext (getRelevance info') $ do -- Andreas, 2014-05-30 experiment to check non-dependent arguments -- after the spine has been processed. Allows to propagate type info@@ -1949,7 +2056,7 @@ reportSDoc "error" 10 $ nest 2 $ vcat [ text $ "info = " ++ show info , text $ "info' = " ++ show info'- , text $ "absName b = " ++ show (absName b)+ , text $ "absName b = " ++ absName b , text $ "nameOf e = " ++ show (nameOf e) ] wrongPi@@ -1987,9 +2094,18 @@ inferExpr = inferExpr' DontExpandLast inferExpr' :: ExpandHidden -> A.Expr -> TCM (Term, Type)-inferExpr' exh e = case e of- _ | Application hd args <- appView e, defOrVar hd -> traceCall (InferExpr e) $ do- case hd of+inferExpr' exh e = do+ let Application hd args = appView e+ reportSDoc "tc.infer" 30 $ vcat+ [ text "inferExpr': appView of " <+> prettyA e+ , text " hd = " <+> prettyA hd+ , text " args = " <+> prettyAs args+ ]+ reportSDoc "tc.infer" 60 $ vcat+ [ text $ " hd (raw) = " ++ show hd+ ]+ if not $ defOrVar hd then fallback else traceCall (InferExpr e) $ do+ case unScope $ hd of A.Proj o (AmbQ ds@(_:_:_)) -> inferProjApp e o ds args _ -> do (f, t0) <- inferHead hd@@ -1997,7 +2113,6 @@ case res of Right (vs, t1) -> return (f vs, t1) Left t1 -> fallback -- blocked on type t1- _ -> fallback where fallback = do t <- workOnTypes $ newTypeMeta_@@ -2027,7 +2142,7 @@ (f, t0) <- inferHead hd res <- runErrorT $ checkArguments DontExpandLast (getRange hd) args t0 $- maybe (sort Prop) id mt+ fromMaybe (sort Prop) mt case res of Right (vs, t1) -> maybe (return (f vs, t1)) (\ t -> (,t) <$> coerce (f vs) t1 t)@@ -2072,14 +2187,14 @@ typeError $ WithOnFreeVariable e v0 _ -> return () -- Possibly insert hidden arguments.- TelV tel t0 <- telViewUpTo' (-1) ((NotHidden /=) . getHiding) t+ TelV tel t0 <- telViewUpTo' (-1) (not . visible) t case ignoreSharing $ unEl t0 of Def d vs -> do res <- isDataOrRecordType d case res of Nothing -> return (v, t) Just{} -> do- (args, t1) <- implicitArgs (-1) (NotHidden /=) t+ (args, t1) <- implicitArgs (-1) notVisible t return (v `apply` args, t1) _ -> return (v, t) @@ -2113,7 +2228,7 @@ ] ] fvs <- getContextSize- checkLeftHandSide (CheckPattern p EmptyTel t) Nothing [p0] t0 Nothing $ \ (LHSResult _ delta0 ps _t _ asb) -> bindAsPatterns asb $ do+ checkLeftHandSide (CheckPattern p EmptyTel t) Nothing [p0] t0 Nothing [] $ \ (LHSResult _ delta0 ps _t _ asb) -> bindAsPatterns asb $ do -- After dropping the free variable patterns there should be a single pattern left. let p = case drop fvs ps of [p] -> namedArg p; _ -> __IMPOSSIBLE__ -- Also strip the context variables from the telescope@@ -2167,7 +2282,7 @@ -- We get list of names of the let-bound vars from the context. let xs = map (fst . unDom) (reverse binds) -- We add all the bindings to the context.- foldr (uncurry4 addLetBinding) ret $ zip4 infos xs sigma ts+ foldr (uncurry4 addLetBinding) ret $ List.zip4 infos xs sigma ts checkLetBinding (A.LetApply i x modapp copyInfo _adir) ret = do -- Any variables in the context that doesn't belong to the current
src/full/Agda/TypeChecking/Serialise.hs view
@@ -61,7 +61,7 @@ -- 32-bit machines). Word64 does not have these problems. currentInterfaceVersion :: Word64-currentInterfaceVersion = 20161119 * 10 + 0+currentInterfaceVersion = 20170907 * 10 + 0 -- | Encodes something. To ensure relocatability file paths in -- positions are replaced with module names.@@ -78,7 +78,7 @@ qnameC stats _ _) <- liftIO $ emptyDict collectStats root <- liftIO $ (`runReaderT` newD) $ do- icodeFileMod fileMod+ icodeFileMod fileMod -- Only fills absPathD from fileMod icode a nL <- benchSort $ l nD sL <- benchSort $ l sD
src/full/Agda/TypeChecking/Serialise/Base.hs view
@@ -1,6 +1,13 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-} +#if __GLASGOW_HASKELL__ <= 708+{-# OPTIONS_GHC -fcontext-stack=30 #-}+#endif+ module Agda.TypeChecking.Serialise.Base where import Control.Applicative@@ -8,6 +15,8 @@ import Control.Monad.Reader import Control.Monad.State.Strict (StateT, gets) +import Data.Proxy+ import Data.Array.IArray import qualified Data.ByteString.Lazy as L import Data.Hashable@@ -28,6 +37,7 @@ import Agda.Utils.Monad import Agda.Utils.Pointer import Agda.Utils.Except (ExceptT, throwError)+import Agda.Utils.TypeLevel -- | Constructor tag (maybe omitted) and argument indices. @@ -284,8 +294,8 @@ H.insert d key fresh return fresh -icodeN :: Node -> S Int32-icodeN key = do+icodeNode :: Node -> S Int32+icodeNode key = do d <- asks nodeD c <- asks nodeC liftIO $ do@@ -346,316 +356,87 @@ liftIO $ H.insert memo (ix, aTyp) (U v) return v --- Andreas, Makoto, AIM XX (2014-10-15):--- No performance gain for INLINE here (neutral / slighly negative).------ {-# INLINE icode0 #-}--- {-# INLINE icode1 #-}--- {-# INLINE icode2 #-}--- {-# INLINE icode3 #-}--- {-# INLINE icode4 #-}--- {-# INLINE icode5 #-}--- {-# INLINE icode6 #-}--- {-# INLINE icode7 #-}--- {-# INLINE icode8 #-}--- {-# INLINE icode9 #-}--- {-# INLINE icode10 #-}--- {-# INLINE icode11 #-}--- {-# INLINE icode12 #-}--- {-# INLINE icode13 #-}--- {-# INLINE icode14 #-} -icode0 :: Int32 -> S Int32--icode1 :: EmbPrj a => Int32 -> a -> S Int32--icode2 :: (EmbPrj a, EmbPrj b) =>- Int32 -> a -> b ->- S Int32--icode3 :: (EmbPrj a, EmbPrj b, EmbPrj c) =>- Int32 -> a -> b -> c ->- S Int32+-- | @icodeArgs proxy (a1, ..., an)@ maps @icode@ over @a1@, ..., @an@+-- and returns the corresponding list of @Int32@. -icode4 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d) =>- Int32 -> a -> b -> c -> d ->- S Int32+class ICODE t b where+ icodeArgs :: IsBase t ~ b => All EmbPrj (Domains t) =>+ Proxy t -> Products (Domains t) -> S [Int32] -icode5 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e) =>- Int32 -> a -> b -> c -> d -> e ->- S Int32+instance IsBase t ~ 'True => ICODE t 'True where+ icodeArgs _ _ = return [] -icode6 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f) =>- Int32 -> a -> b -> c -> d -> e -> f ->- S Int32+instance ICODE t (IsBase t) => ICODE (a -> t) 'False where+ icodeArgs _ (a , as) = icode a >>= \ hd -> (hd :) <$> icodeArgs (Proxy :: Proxy t) as -icode7 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g ) =>- Int32 -> a -> b -> c -> d -> e -> f -> g ->- S Int32+-- | @icodeN tag t a1 ... an@ serialises the arguments @a1@, ..., @an@ of the+-- constructor @t@ together with a tag @tag@ picked to disambiguate between+-- different constructors.+-- It corresponds to @icodeNode . (tag :) =<< mapM icode [a1, ..., an]@ -icode8 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h ) =>- Int32 -> a -> b -> c -> d -> e -> f -> g -> h ->- S Int32+{-# INLINE icodeN #-}+icodeN :: forall t. ICODE t (IsBase t) => Currying (Domains t) (S Int32) =>+ All EmbPrj (Domains t) =>+ Int32 -> t -> Arrows (Domains t) (S Int32)+icodeN tag _ =+ currys (Proxy :: Proxy (Domains t)) (Proxy :: Proxy (S Int32)) $ \ args ->+ icodeNode . (tag :) =<< icodeArgs (Proxy :: Proxy t) args -icode9 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i ) =>- Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i ->- S Int32+-- | @icodeN'@ is the same as @icodeN@ except that there is no tag+{-# INLINE icodeN' #-}+icodeN' :: forall t. ICODE t (IsBase t) => Currying (Domains t) (S Int32) =>+ All EmbPrj (Domains t) =>+ t -> Arrows (Domains t) (S Int32)+icodeN' _ =+ currys (Proxy :: Proxy (Domains t)) (Proxy :: Proxy (S Int32)) $ \ args ->+ icodeNode =<< icodeArgs (Proxy :: Proxy t) args -icode10 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j ) =>- Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j ->- S Int32+-- Instead of having up to 25 versions of @valu N@, we define+-- the class VALU which generates them by typeclass resolution.+-- All of these should get inlined at compile time. -icode11 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k ) =>- Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k ->- S Int32+class VALU t b where -icode12 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l ) =>- Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l ->- S Int32+ valuN' :: b ~ IsBase t =>+ All EmbPrj (Domains t) =>+ t -> Products (Constant Int32 (Domains t)) -> R (CoDomain t) -icode13 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l- , EmbPrj m ) =>- Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m ->- S Int32+ valueArgs :: b ~ IsBase t =>+ All EmbPrj (CoDomain t ': Domains t) =>+ Proxy t -> Node -> Maybe (Products (Constant Int32 (Domains t))) -icode14 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l- , EmbPrj m, EmbPrj n ) =>- Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n ->- S Int32+instance VALU t 'True where -icode15 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l- , EmbPrj m, EmbPrj n, EmbPrj o ) =>- Int32 -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n -> o ->- S Int32+ valuN' c () = return c -icode0 tag = icodeN [tag]-icode1 tag a = icodeN . (tag :) =<< sequence [icode a]-icode2 tag a b = icodeN . (tag :) =<< sequence [icode a, icode b]-icode3 tag a b c = icodeN . (tag :) =<< sequence [icode a, icode b, icode c]-icode4 tag a b c d = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d]-icode5 tag a b c d e = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e]-icode6 tag a b c d e f = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f]-icode7 tag a b c d e f g = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g]-icode8 tag a b c d e f g h = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h]-icode9 tag a b c d e f g h i = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i]-icode10 tag a b c d e f g h i j = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j]-icode11 tag a b c d e f g h i j k = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k]-icode12 tag a b c d e f g h i j k l = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l]-icode13 tag a b c d e f g h i j k l m = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l, icode m]-icode14 tag a b c d e f g h i j k l m n = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l, icode m, icode n]-icode15 tag a b c d e f g h i j k l m n o = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l, icode m, icode n, icode o]+ valueArgs _ xs = case xs of+ [] -> Just ()+ _ -> Nothing --- Andreas, Makoto, AIM XX (2014-10-15):--- No performance gain for INLINE here (neutral / slighly negative).------ {-# INLINE icode0' #-}--- {-# INLINE icode1' #-}--- {-# INLINE icode2' #-}--- {-# INLINE icode3' #-}--- {-# INLINE icode4' #-}--- {-# INLINE icode5' #-}--- {-# INLINE icode6' #-}--- {-# INLINE icode7' #-}--- {-# INLINE icode8' #-}--- {-# INLINE icode9' #-}--- {-# INLINE icode10' #-}--- {-# INLINE icode11' #-}--- {-# INLINE icode12' #-}--- {-# INLINE icode13' #-}--- {-# INLINE icode14' #-}--icode0' :: S Int32--icode1' :: EmbPrj a => a -> S Int32--icode2' :: (EmbPrj a, EmbPrj b) =>- a -> b ->- S Int32--icode3' :: (EmbPrj a, EmbPrj b, EmbPrj c) =>- a -> b -> c ->- S Int32--icode4' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d) =>- a -> b -> c -> d ->- S Int32--icode5' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e) =>- a -> b -> c -> d -> e ->- S Int32--icode6' :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f) =>- a -> b -> c -> d -> e -> f ->- S Int32--icode7' :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g ) =>- a -> b -> c -> d -> e -> f -> g ->- S Int32--icode8' :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h ) =>- a -> b -> c -> d -> e -> f -> g -> h ->- S Int32--icode9' :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i ) =>- a -> b -> c -> d -> e -> f -> g -> h -> i ->- S Int32--icode10' :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j ) =>- a -> b -> c -> d -> e -> f -> g -> h -> i -> j ->- S Int32--icode11' :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k ) =>- a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k ->- S Int32--icode12' :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l ) =>- a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l ->- S Int32--icode13' :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l- , EmbPrj m ) =>- a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m ->- S Int32--icode14' :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l- , EmbPrj m, EmbPrj n ) =>- a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n ->- S Int32--icode0' = icodeN []-icode1' a = icodeN =<< sequence [icode a]-icode2' a b = icodeN =<< sequence [icode a, icode b]-icode3' a b c = icodeN =<< sequence [icode a, icode b, icode c]-icode4' a b c d = icodeN =<< sequence [icode a, icode b, icode c, icode d]-icode5' a b c d e = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e]-icode6' a b c d e f = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f]-icode7' a b c d e f g = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g]-icode8' a b c d e f g h = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h]-icode9' a b c d e f g h i = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i]-icode10' a b c d e f g h i j = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j]-icode11' a b c d e f g h i j k = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k]-icode12' a b c d e f g h i j k l = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l]-icode13' a b c d e f g h i j k l m = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l, icode m]-icode14' a b c d e f g h i j k l m n = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l, icode m, icode n]--valu0 :: a -> R a--valu1 :: EmbPrj a => (a -> b) -> Int32 -> R b--valu2 :: (EmbPrj a, EmbPrj b) =>- (a -> b -> c) ->- Int32 -> Int32 ->- R c--valu3 :: (EmbPrj a, EmbPrj b, EmbPrj c) =>- (a -> b -> c -> d) ->- Int32 -> Int32 -> Int32 ->- R d--valu4 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d) =>- (a -> b -> c -> d -> e) ->- Int32 -> Int32 -> Int32 -> Int32 ->- R e--valu5 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e) =>- (a -> b -> c -> d -> e -> f) ->- Int32 -> Int32 -> Int32 -> Int32 -> Int32 ->- R f--valu6 :: (EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f) =>- (a -> b -> c -> d -> e -> f -> g) ->- Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 ->- R g--valu7 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g ) =>- (a -> b -> c -> d -> e -> f -> g -> h) ->- Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 ->- R h--valu8 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h ) =>- (a -> b -> c -> d -> e -> f -> g -> h -> i) ->- Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 ->- R i--valu9 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i ) =>- (a -> b -> c -> d -> e -> f -> g -> h -> i -> j) ->- Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 ->- R j--valu10 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j ) =>- (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k) ->- Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 ->- R k--valu11 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k ) =>- (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l) ->- Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 ->- R l--valu12 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l ) =>- (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m) ->- Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 ->- R m--valu13 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l- , EmbPrj m ) =>- (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n) ->- Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 ->- R n+instance VALU t (IsBase t) => VALU (a -> t) 'False where -valu14 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l- , EmbPrj m, EmbPrj n ) =>- (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n -> o) ->- Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 ->- R o+ valuN' c (a, as) = value a >>= \ v -> valuN' (c v) as + valueArgs _ xs = case xs of+ (x : xs') -> (x,) <$> valueArgs (Proxy :: Proxy t) xs'+ _ -> Nothing -valu15 :: ( EmbPrj a, EmbPrj b, EmbPrj c, EmbPrj d, EmbPrj e, EmbPrj f- , EmbPrj g, EmbPrj h, EmbPrj i, EmbPrj j, EmbPrj k, EmbPrj l- , EmbPrj m, EmbPrj n, EmbPrj o ) =>- (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n -> o -> p) ->- Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 ->- R p+{-# INLINE valuN #-}+valuN :: forall t. VALU t (IsBase t) =>+ Currying (Constant Int32 (Domains t)) (R (CoDomain t)) =>+ All EmbPrj (Domains t) =>+ t -> Arrows (Constant Int32 (Domains t)) (R (CoDomain t))+valuN f = currys (Proxy :: Proxy (Constant Int32 (Domains t)))+ (Proxy :: Proxy (R (CoDomain t)))+ (valuN' f) -valu0 z = return z-valu1 z a = valu0 z `ap` value a-valu2 z a b = valu1 z a `ap` value b-valu3 z a b c = valu2 z a b `ap` value c-valu4 z a b c d = valu3 z a b c `ap` value d-valu5 z a b c d e = valu4 z a b c d `ap` value e-valu6 z a b c d e f = valu5 z a b c d e `ap` value f-valu7 z a b c d e f g = valu6 z a b c d e f `ap` value g-valu8 z a b c d e f g h = valu7 z a b c d e f g `ap` value h-valu9 z a b c d e f g h i = valu8 z a b c d e f g h `ap` value i-valu10 z a b c d e f g h i j = valu9 z a b c d e f g h i `ap` value j-valu11 z a b c d e f g h i j k = valu10 z a b c d e f g h i j `ap` value k-valu12 z a b c d e f g h i j k l = valu11 z a b c d e f g h i j k `ap` value l-valu13 z a b c d e f g h i j k l m = valu12 z a b c d e f g h i j k l `ap` value m-valu14 z a b c d e f g h i j k l m n = valu13 z a b c d e f g h i j k l m `ap` value n-valu15 z a b c d e f g h i j k l m n o = valu14 z a b c d e f g h i j k l m n `ap` value o+{-# INLINE valueN #-}+valueN :: forall t. VALU t (IsBase t) =>+ All EmbPrj (CoDomain t ': Domains t) =>+ t -> Int32 -> R (CoDomain t)+valueN t = vcase valu where+ valu int32s = case valueArgs (Proxy :: Proxy t) int32s of+ Nothing -> malformed+ Just vs -> valuN' t vs
src/full/Agda/TypeChecking/Serialise/Instances.hs view
@@ -10,10 +10,11 @@ import Agda.TypeChecking.Serialise.Instances.Compilers () import Agda.TypeChecking.Serialise.Instances.Highlighting () import Agda.TypeChecking.Serialise.Instances.Internal ()+import Agda.TypeChecking.Serialise.Instances.Errors () instance EmbPrj Interface where- icod_ (Interface a b c d e f g h i j k l m n) = icode14' a b c d e f g h i j k l m n+ icod_ (Interface a b c d e f g h i j k l m) = icodeN' Interface a b c d e f g h i j k l m value = vcase valu where- valu [a, b, c, d, e, f, g, h, i, j, k, l, m, n] = valu14 Interface a b c d e f g h i j k l m n- valu _ = malformed+ valu [a, b, c, d, e, f, g, h, i, j, k, l, m] = valuN Interface a b c d e f g h i j k l m+ valu _ = malformed
src/full/Agda/TypeChecking/Serialise/Instances/Abstract.hs view
@@ -26,95 +26,83 @@ import Agda.Utils.Impossible instance EmbPrj Scope where- icod_ (Scope a b c d e) = icode5' a b c d e+ icod_ (Scope a b c d e) = icodeN' Scope a b c d e - value = vcase valu where- valu [a, b, c, d, e] = valu5 Scope a b c d e- valu _ = malformed+ value = valueN Scope instance EmbPrj NameSpaceId where- icod_ PublicNS = icode0'- icod_ PrivateNS = icode0 1- icod_ ImportedNS = icode0 2- icod_ OnlyQualifiedNS = icode0 3+ icod_ PublicNS = icodeN' PublicNS+ icod_ PrivateNS = icodeN 1 PrivateNS+ icod_ ImportedNS = icodeN 2 ImportedNS+ icod_ OnlyQualifiedNS = icodeN 3 OnlyQualifiedNS value = vcase valu where- valu [] = valu0 PublicNS- valu [1] = valu0 PrivateNS- valu [2] = valu0 ImportedNS- valu [3] = valu0 OnlyQualifiedNS+ valu [] = valuN PublicNS+ valu [1] = valuN PrivateNS+ valu [2] = valuN ImportedNS+ valu [3] = valuN OnlyQualifiedNS valu _ = malformed instance EmbPrj Access where- icod_ (PrivateAccess UserWritten) = icode0 0- icod_ PrivateAccess{} = icode0 1- icod_ PublicAccess = icode0'- icod_ OnlyQualified = icode0 2+ icod_ (PrivateAccess UserWritten) = icodeN 0 ()+ icod_ PrivateAccess{} = icodeN 1 ()+ icod_ PublicAccess = icodeN' PublicAccess+ icod_ OnlyQualified = icodeN 2 () value = vcase valu where- valu [0] = valu0 $ PrivateAccess UserWritten- valu [1] = valu0 $ PrivateAccess Inserted- valu [] = valu0 PublicAccess- valu [2] = valu0 OnlyQualified+ valu [0] = valuN $ PrivateAccess UserWritten+ valu [1] = valuN $ PrivateAccess Inserted+ valu [] = valuN PublicAccess+ valu [2] = valuN OnlyQualified valu _ = malformed instance EmbPrj NameSpace where- icod_ (NameSpace a b c) = icode3' a b c+ icod_ (NameSpace a b c) = icodeN' NameSpace a b c - value = vcase valu where- valu [a, b, c] = valu3 NameSpace a b c- valu _ = malformed+ value = valueN NameSpace instance EmbPrj WhyInScope where- icod_ Defined = icode0'- icod_ (Opened a b) = icode2 0 a b- icod_ (Applied a b) = icode2 1 a b+ icod_ Defined = icodeN' Defined+ icod_ (Opened a b) = icodeN 0 Opened a b+ icod_ (Applied a b) = icodeN 1 Applied a b value = vcase valu where- valu [] = valu0 Defined- valu [0, a, b] = valu2 Opened a b- valu [1, a, b] = valu2 Applied a b+ valu [] = valuN Defined+ valu [0, a, b] = valuN Opened a b+ valu [1, a, b] = valuN Applied a b valu _ = malformed instance EmbPrj AbstractName where- icod_ (AbsName a b c) = icode3' a b c+ icod_ (AbsName a b c) = icodeN' AbsName a b c - value = vcase valu where- valu [a, b, c] = valu3 AbsName a b c- valu _ = malformed+ value = valueN AbsName instance EmbPrj AbstractModule where- icod_ (AbsModule a b) = icode2' a b+ icod_ (AbsModule a b) = icodeN' AbsModule a b - value = vcase valu where- valu [a, b] = valu2 AbsModule a b- valu _ = malformed+ value = valueN AbsModule instance EmbPrj KindOfName where- icod_ DefName = icode0'- icod_ ConName = icode0 1- icod_ FldName = icode0 2- icod_ PatternSynName = icode0 3- icod_ QuotableName = icode0 4- icod_ MacroName = icode0 5+ icod_ DefName = icodeN' DefName+ icod_ ConName = icodeN 1 ConName+ icod_ FldName = icodeN 2 FldName+ icod_ PatternSynName = icodeN 3 PatternSynName+ icod_ QuotableName = icodeN 4 QuotableName+ icod_ MacroName = icodeN 5 MacroName value = vcase valu where- valu [] = valu0 DefName- valu [1] = valu0 ConName- valu [2] = valu0 FldName- valu [3] = valu0 PatternSynName- valu [4] = valu0 QuotableName- valu [5] = valu0 MacroName+ valu [] = valuN DefName+ valu [1] = valuN ConName+ valu [2] = valuN FldName+ valu [3] = valuN PatternSynName+ valu [4] = valuN QuotableName+ valu [5] = valuN MacroName valu _ = malformed instance EmbPrj LocalVar where- icod_ (LocalVar a) = icode1' a- icod_ (ShadowedVar a b) = icode2' a b+ icod_ (LocalVar a b c) = icodeN' LocalVar a b c - value = vcase valu where- valu [a] = valu1 LocalVar a- valu [a, b] = valu2 ShadowedVar a b- valu _ = malformed+ value = valueN LocalVar instance EmbPrj ConPatInfo where icod_ (ConPatInfo a _) = icod_ a@@ -122,62 +110,60 @@ -- Only for pattern synonyms (where a is Void) instance EmbPrj a => EmbPrj (A.Pattern' a) where- icod_ (A.VarP a) = icode1 0 a- icod_ (A.ConP a b c) = icode3 1 a b c- icod_ (A.DefP _ a b) = icode2 2 a b- icod_ (A.WildP _) = icode0 3- icod_ (A.AsP _ a b) = icode2 4 a b- icod_ (A.DotP _ a b) = icode2 5 a b- icod_ (A.AbsurdP _) = icode0 6- icod_ (A.LitP a) = icode1 7 a- icod_ (A.ProjP _ a b) = icode2 8 a b- icod_ (A.PatternSynP _ a b) = icode2 9 a b- icod_ (A.RecP _ a) = icode1 10 a+ icod_ (A.VarP a) = icodeN 0 A.VarP a+ icod_ (A.ConP a b c) = icodeN 1 A.ConP a b c+ icod_ (A.DefP p a b) = icodeN 2 (A.DefP p) a b+ icod_ t@(A.WildP p) = icodeN 3 t+ icod_ (A.AsP p a b) = icodeN 4 (A.AsP p) a b+ icod_ (A.DotP p a b) = icodeN 5 (A.DotP p) a b+ icod_ t@(A.AbsurdP _) = icodeN 6 t+ icod_ (A.LitP a) = icodeN 7 A.LitP a+ icod_ (A.ProjP p a b) = icodeN 8 (A.ProjP p) a b+ icod_ (A.PatternSynP p a b) = icodeN 9 (A.PatternSynP p) a b+ icod_ (A.RecP p a) = icodeN 10 (A.RecP p) a value = vcase valu where- valu [0, a] = valu1 A.VarP a- valu [1, a, b, c] = valu3 A.ConP a b c- valu [2, a, b] = valu2 (A.DefP i) a b- valu [3] = valu0 (A.WildP i)- valu [4, a, b] = valu2 (A.AsP i) a b- valu [5, a, b] = valu2 (A.DotP i) a b- valu [6] = valu0 (A.AbsurdP i)- valu [7, a] = valu1 (A.LitP) a- valu [8, a, b] = valu2 (A.ProjP i) a b- valu [9, a, b] = valu2 (A.PatternSynP i) a b- valu [10, a] = valu1 (A.RecP i) a+ valu [0, a] = valuN A.VarP a+ valu [1, a, b, c] = valuN A.ConP a b c+ valu [2, a, b] = valuN (A.DefP i) a b+ valu [3] = valuN (A.WildP i)+ valu [4, a, b] = valuN (A.AsP i) a b+ valu [5, a, b] = valuN (A.DotP i) a b+ valu [6] = valuN (A.AbsurdP i)+ valu [7, a] = valuN (A.LitP) a+ valu [8, a, b] = valuN (A.ProjP i) a b+ valu [9, a, b] = valuN (A.PatternSynP i) a b+ valu [10, a] = valuN (A.RecP i) a valu _ = malformed i = patNoRange instance EmbPrj Precedence where- icod_ TopCtx = icode0'- icod_ FunctionSpaceDomainCtx = icode0 1- icod_ (LeftOperandCtx a) = icode1 2 a- icod_ (RightOperandCtx a) = icode1 3 a- icod_ FunctionCtx = icode0 4- icod_ ArgumentCtx = icode0 5- icod_ InsideOperandCtx = icode0 6- icod_ WithFunCtx = icode0 7- icod_ WithArgCtx = icode0 8- icod_ DotPatternCtx = icode0 9+ icod_ TopCtx = icodeN' TopCtx+ icod_ FunctionSpaceDomainCtx = icodeN 1 FunctionSpaceDomainCtx+ icod_ (LeftOperandCtx a) = icodeN 2 LeftOperandCtx a+ icod_ (RightOperandCtx a) = icodeN 3 RightOperandCtx a+ icod_ FunctionCtx = icodeN 4 FunctionCtx+ icod_ ArgumentCtx = icodeN 5 ArgumentCtx+ icod_ InsideOperandCtx = icodeN 6 InsideOperandCtx+ icod_ WithFunCtx = icodeN 7 WithFunCtx+ icod_ WithArgCtx = icodeN 8 WithArgCtx+ icod_ DotPatternCtx = icodeN 9 DotPatternCtx value = vcase valu where- valu [] = valu0 TopCtx- valu [1] = valu0 FunctionSpaceDomainCtx- valu [2, a] = valu1 LeftOperandCtx a- valu [3, a] = valu1 RightOperandCtx a- valu [4] = valu0 FunctionCtx- valu [5] = valu0 ArgumentCtx- valu [6] = valu0 InsideOperandCtx- valu [7] = valu0 WithFunCtx- valu [8] = valu0 WithArgCtx- valu [9] = valu0 DotPatternCtx+ valu [] = valuN TopCtx+ valu [1] = valuN FunctionSpaceDomainCtx+ valu [2, a] = valuN LeftOperandCtx a+ valu [3, a] = valuN RightOperandCtx a+ valu [4] = valuN FunctionCtx+ valu [5] = valuN ArgumentCtx+ valu [6] = valuN InsideOperandCtx+ valu [7] = valuN WithFunCtx+ valu [8] = valuN WithArgCtx+ valu [9] = valuN DotPatternCtx valu _ = malformed instance EmbPrj ScopeInfo where- icod_ (ScopeInfo a b c d _ _ _) = icode4' a b c d+ icod_ (ScopeInfo a b c d e f g) = icodeN' (\ a b c d -> ScopeInfo a b c d e f g) a b c d - value = vcase valu where -- reverse maps will be recomputed- valu [a, b, c, d] = valu4 (\ a b c d -> ScopeInfo a b c d Map.empty Map.empty Set.empty) a b c d- valu _ = malformed+ value = valueN (\ a b c d -> ScopeInfo a b c d Map.empty Map.empty Set.empty)
src/full/Agda/TypeChecking/Serialise/Instances/Common.hs view
@@ -1,6 +1,5 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-} #if __GLASGOW_HASKELL__ <= 708 {-# LANGUAGE GeneralizedNewtypeDeriving #-}@@ -9,11 +8,14 @@ {-# OPTIONS_GHC -fno-warn-orphans #-} -module Agda.TypeChecking.Serialise.Instances.Common () where+module Agda.TypeChecking.Serialise.Instances.Common (SerialisedRange(..)) where +import Prelude hiding (mapM)+ import Control.Applicative-import Control.Monad.Reader+import Control.Monad.Reader hiding (mapM) import Control.Monad.State.Strict (gets, modify)+import Control.Exception import Data.Array.IArray import Data.Word@@ -29,9 +31,12 @@ import qualified Data.Set as Set import Data.Sequence (Seq) import qualified Data.Sequence as Seq+import Data.Traversable ( mapM )+ #if __GLASGOW_HASKELL__ <= 708-import Data.Typeable (Typeable)+import Data.Typeable ( Typeable ) #endif+ import Data.Void import Agda.Syntax.Common@@ -51,10 +56,15 @@ import Agda.Utils.HashMap (HashMap) import qualified Agda.Utils.HashMap as HMap import Agda.Utils.FileName+import Agda.Utils.Maybe import qualified Agda.Utils.Maybe.Strict as Strict+import Agda.Utils.Trie import Agda.Utils.Except +import Agda.Utils.Empty (Empty)+import qualified Agda.Utils.Empty as Empty+ #include "undefined.h" import Agda.Utils.Impossible @@ -75,7 +85,7 @@ value i = (! i) `fmap` gets integerE instance EmbPrj Word64 where- icod_ i = icode2' (int32 q) (int32 r)+ icod_ i = icodeN' (undefined :: Int32 -> Int32 -> Int32) (int32 q) (int32 r) where (q, r) = quotRem i (2^32) int32 :: Word64 -> Int32 int32 = fromIntegral@@ -106,42 +116,38 @@ value = vcase valu where valu _ = malformed instance EmbPrj () where- icod_ () = icode0'+ icod_ () = icodeN' () value = vcase valu where- valu [] = valu0 ()+ valu [] = valuN () valu _ = malformed instance (EmbPrj a, EmbPrj b) => EmbPrj (a, b) where- icod_ (a, b) = icode2' a b+ icod_ (a, b) = icodeN' (,) a b - value = vcase valu where- valu [a, b] = valu2 (,) a b- valu _ = malformed+ value = valueN (,) instance (EmbPrj a, EmbPrj b, EmbPrj c) => EmbPrj (a, b, c) where- icod_ (a, b, c) = icode3' a b c+ icod_ (a, b, c) = icodeN' (,,) a b c - value = vcase valu where- valu [a, b, c] = valu3 (,,) a b c- valu _ = malformed+ value = valueN (,,) instance (EmbPrj a, EmbPrj b) => EmbPrj (Either a b) where- icod_ (Left x) = icode1 0 x- icod_ (Right x) = icode1 1 x+ icod_ (Left x) = icodeN 0 Left x+ icod_ (Right x) = icodeN 1 Right x value = vcase valu where- valu [0, x] = valu1 Left x- valu [1, x] = valu1 Right x+ valu [0, x] = valuN Left x+ valu [1, x] = valuN Right x valu _ = malformed instance EmbPrj a => EmbPrj (Maybe a) where- icod_ Nothing = icode0'- icod_ (Just x) = icode1' x+ icod_ Nothing = icodeN' Nothing+ icod_ (Just x) = icodeN' Just x value = vcase valu where- valu [] = valu0 Nothing- valu [x] = valu1 Just x+ valu [] = valuN Nothing+ valu [x] = valuN Just x valu _ = malformed instance EmbPrj a => EmbPrj (Strict.Maybe a) where@@ -149,18 +155,37 @@ value m = Strict.toStrict `fmap` value m instance EmbPrj Bool where- icod_ True = icode0'- icod_ False = icode0 0+ icod_ True = icodeN' True+ icod_ False = icodeN 0 False value = vcase valu where- valu [] = valu0 True- valu [0] = valu0 False+ valu [] = valuN True+ valu [0] = valuN False valu _ = malformed +instance EmbPrj DataOrRecord where+ icod_ IsData = icodeN' IsData+ icod_ IsRecord = icodeN 0 IsRecord++ value = vcase $ \case+ [] -> valuN IsData+ [0] -> valuN IsRecord+ _ -> malformed+ instance EmbPrj AbsolutePath where icod_ file = do- d <- asks absPathD- liftIO $ fromMaybe __IMPOSSIBLE__ <$> H.lookup d file+ d <- asks absPathD+ liftIO $ flip fromMaybeM (H.lookup d file) $ do+ -- The path @file@ should be cached in the dictionary @d@.+ -- This seems not to be the case, thus, crash here.+ -- But leave some hints for the posterity why things could go so wrong.+ -- reportSLn "impossible" 10 -- does not work here+ putStrLn $ unlines $+ [ "Panic while serializing absolute path: " ++ show file+ , "The path could not be found in the dictionary:"+ ]+ putStrLn . show =<< H.toList d+ __IMPOSSIBLE__ value m = do m :: TopLevelModuleName@@ -174,25 +199,21 @@ Right f -> return f instance EmbPrj a => EmbPrj (Position' a) where- icod_ (P.Pn file pos line col) = icode4' file pos line col+ icod_ (P.Pn file pos line col) = icodeN' P.Pn file pos line col - value = vcase valu where- valu [f, p, l, c] = valu4 P.Pn f p l c- valu _ = malformed+ value = valueN P.Pn instance EmbPrj TopLevelModuleName where- icod_ (TopLevelModuleName a) = icode1' a+ icod_ (TopLevelModuleName a b) = icodeN' TopLevelModuleName a b - value = vcase valu where- valu [a] = valu1 TopLevelModuleName a- valu _ = malformed+ value = valueN TopLevelModuleName #if __GLASGOW_HASKELL__ >= 710 instance {-# OVERLAPPABLE #-} EmbPrj a => EmbPrj [a] where #else instance EmbPrj a => EmbPrj [a] where #endif- icod_ xs = icodeN =<< mapM icode xs+ icod_ xs = icodeNode =<< mapM icode xs value = vcase (mapM value) -- icode [] = icode0' -- icode (x : xs) = icode2' x xs@@ -212,21 +233,24 @@ icod_ s = icode (Set.toList s) value s = Set.fromList `fmap` value s +instance (Ord a, EmbPrj a, EmbPrj b) => EmbPrj (Trie a b) where+ icod_ (Trie a b)= icodeN' Trie a b++ value = valueN Trie+ instance EmbPrj a => EmbPrj (Seq a) where icod_ s = icode (Fold.toList s) value s = Seq.fromList `fmap` value s instance EmbPrj a => EmbPrj (P.Interval' a) where- icod_ (P.Interval p q) = icode2' p q+ icod_ (P.Interval p q) = icodeN' P.Interval p q - value = vcase valu where- valu [p, q] = valu2 P.Interval p q- valu _ = malformed+ value = valueN P.Interval -- | Ranges are always deserialised as 'noRange'. instance EmbPrj Range where- icod_ _ = icode0'+ icod_ _ = icodeN' () value _ = return noRange -- | Ranges that should be serialised properly.@@ -238,84 +262,81 @@ instance EmbPrj SerialisedRange where icod_ (SerialisedRange r) =- icode2' (P.rangeFile r) (P.rangeIntervals r)+ icodeN' (undefined :: SrcFile -> [IntervalWithoutFile] -> SerialisedRange)+ (P.rangeFile r) (P.rangeIntervals r) value = vcase valu where- valu [a, b] = SerialisedRange <$> valu2 P.intervalsToRange a b+ valu [a, b] = SerialisedRange <$> valuN P.intervalsToRange a b valu _ = malformed instance EmbPrj C.Name where- icod_ (C.NoName a b) = icode2 0 a b- icod_ (C.Name r xs) = icode2' r xs+ icod_ (C.NoName a b) = icodeN 0 C.NoName a b+ icod_ (C.Name r xs) = icodeN' C.Name r xs value = vcase valu where- valu [0, a, b] = valu2 C.NoName a b- valu [r, xs] = valu2 C.Name r xs+ valu [0, a, b] = valuN C.NoName a b+ valu [r, xs] = valuN C.Name r xs valu _ = malformed instance EmbPrj NamePart where- icod_ Hole = icode0'- icod_ (Id a) = icode1' a+ icod_ Hole = icodeN' Hole+ icod_ (Id a) = icodeN' Id a value = vcase valu where- valu [] = valu0 Hole- valu [a] = valu1 Id a+ valu [] = valuN Hole+ valu [a] = valuN Id a valu _ = malformed instance EmbPrj C.QName where- icod_ (Qual a b) = icode2' a b- icod_ (C.QName a ) = icode1' a+ icod_ (Qual a b) = icodeN' Qual a b+ icod_ (C.QName a ) = icodeN' C.QName a value = vcase valu where- valu [a, b] = valu2 Qual a b- valu [a] = valu1 C.QName a+ valu [a, b] = valuN Qual a b+ valu [a] = valuN C.QName a valu _ = malformed instance EmbPrj Agda.Syntax.Fixity.Associativity where- icod_ LeftAssoc = icode0'- icod_ RightAssoc = icode0 1- icod_ NonAssoc = icode0 2+ icod_ LeftAssoc = icodeN' LeftAssoc+ icod_ RightAssoc = icodeN 1 RightAssoc+ icod_ NonAssoc = icodeN 2 NonAssoc value = vcase valu where- valu [] = valu0 LeftAssoc- valu [1] = valu0 RightAssoc- valu [2] = valu0 NonAssoc+ valu [] = valuN LeftAssoc+ valu [1] = valuN RightAssoc+ valu [2] = valuN NonAssoc valu _ = malformed instance EmbPrj Agda.Syntax.Fixity.PrecedenceLevel where- icod_ Unrelated = icode0'- icod_ (Related a) = icode1' a+ icod_ Unrelated = icodeN' Unrelated+ icod_ (Related a) = icodeN' Related a value = vcase valu where- valu [] = valu0 Unrelated- valu [a] = valu1 Related a+ valu [] = valuN Unrelated+ valu [a] = valuN Related a valu _ = malformed instance EmbPrj Agda.Syntax.Fixity.Fixity where- icod_ (Fixity a b c) = icode3' a b c+ icod_ (Fixity a b c) = icodeN' Fixity a b c - value = vcase valu where- valu [a, b, c] = valu3 Fixity a b c- valu _ = malformed+ value = valueN Fixity instance EmbPrj Agda.Syntax.Fixity.Fixity' where- icod_ (Fixity' a b _) = icode2' a b -- discard theNameRange+ icod_ (Fixity' a b r) = icodeN' (\ a b -> Fixity' a b r) a b -- discard theNameRange - value = vcase valu where- valu [a, b] = valu2 (\ f n -> Fixity' f n noRange) a b- valu _ = malformed+ value = valueN (\ f n -> Fixity' f n noRange) instance EmbPrj GenPart where- icod_ (BindHole a) = icode1 0 a- icod_ (NormalHole a) = icode1 1 a- icod_ (WildHole a) = icode1 2 a- icod_ (IdPart a) = icode1' a+ icod_ (BindHole a) = icodeN 0 BindHole a+ icod_ (NormalHole a) = icodeN 1 NormalHole a+ icod_ (WildHole a) = icodeN 2 WildHole a+ icod_ (IdPart a) = icodeN' IdPart a value = vcase valu where- valu [0, a] = valu1 BindHole a- valu [1, a] = valu1 NormalHole a- valu [2, a] = valu1 WildHole a- valu [a] = valu1 IdPart a+ valu [0, a] = valuN BindHole a+ valu [1, a] = valuN NormalHole a+ valu [2, a] = valuN WildHole a+ valu [a] = valuN IdPart a valu _ = malformed instance EmbPrj MetaId where@@ -323,11 +344,9 @@ value i = MetaId <$> value i instance EmbPrj A.QName where- icod_ n@(A.QName a b) = icodeMemo qnameD qnameC (qnameId n) $ icode2' a b+ icod_ n@(A.QName a b) = icodeMemo qnameD qnameC (qnameId n) $ icodeN' A.QName a b - value = vcase valu where- valu [a, b] = valu2 A.QName a b- valu _ = malformed+ value = valueN A.QName instance EmbPrj A.AmbiguousQName where icod_ (A.AmbQ a) = icode a@@ -339,90 +358,73 @@ instance EmbPrj A.Name where icod_ (A.Name a b c d) = icodeMemo nameD nameC a $- icode4' a b (SerialisedRange c) d+ icodeN' (\ a b -> A.Name a b . underlyingRange) a b (SerialisedRange c) d - value = vcase valu where- valu [a, b, c, d] = valu4 (\a b c -> A.Name a b (underlyingRange c))- a b c d- valu _ = malformed+ value = valueN (\a b c -> A.Name a b (underlyingRange c)) instance EmbPrj a => EmbPrj (C.FieldAssignment' a) where- icod_ (C.FieldAssignment a b) = icode2' a b+ icod_ (C.FieldAssignment a b) = icodeN' C.FieldAssignment a b - value = vcase valu where- valu [a, b] = valu2 C.FieldAssignment a b- valu _ = malformed+ value = valueN C.FieldAssignment instance (EmbPrj s, EmbPrj t) => EmbPrj (Named s t) where- icod_ (Named a b) = icode2' a b+ icod_ (Named a b) = icodeN' Named a b - value = vcase valu where- valu [a, b] = valu2 Named a b- valu _ = malformed+ value = valueN Named instance EmbPrj a => EmbPrj (Ranged a) where- icod_ (Ranged r x) = icode2' r x+ icod_ (Ranged r x) = icodeN' Ranged r x - value = vcase valu where- valu [r, x] = valu2 Ranged r x- valu _ = malformed+ value = valueN Ranged instance EmbPrj ArgInfo where- icod_ (ArgInfo h r o v) = icode4' h r o v+ icod_ (ArgInfo h r o) = icodeN' ArgInfo h r o - value = vcase valu where- valu [h, r, o, v] = valu4 ArgInfo h r o v- valu _ = malformed+ value = valueN ArgInfo instance EmbPrj NameId where- icod_ (NameId a b) = icode2' a b+ icod_ (NameId a b) = icodeN' NameId a b - value = vcase valu where- valu [a, b] = valu2 NameId a b- valu _ = malformed+ value = valueN NameId instance (Eq k, Hashable k, EmbPrj k, EmbPrj v) => EmbPrj (HashMap k v) where icod_ m = icode (HMap.toList m) value m = HMap.fromList `fmap` value m instance EmbPrj a => EmbPrj (WithHiding a) where- icod_ (WithHiding a b) = icode2' a b+ icod_ (WithHiding a b) = icodeN' WithHiding a b - value = vcase valu where- valu [a, b] = valu2 WithHiding a b- valu _ = malformed+ value = valueN WithHiding instance EmbPrj a => EmbPrj (Arg a) where- icod_ (Arg i e) = icode2' i e+ icod_ (Arg i e) = icodeN' Arg i e - value = vcase valu where- valu [i, e] = valu2 Arg i e- valu _ = malformed+ value = valueN Arg instance EmbPrj a => EmbPrj (Dom a) where- icod_ (Dom i e) = icode2' i e+ icod_ (Dom i e) = icodeN' Dom i e - value = vcase valu where- valu [i, e] = valu2 Dom i e- valu _ = malformed+ value = valueN Dom instance EmbPrj Induction where- icod_ Inductive = icode0'- icod_ CoInductive = icode0 1+ icod_ Inductive = icodeN' Inductive+ icod_ CoInductive = icodeN 1 CoInductive value = vcase valu where- valu [] = valu0 Inductive- valu [1] = valu0 CoInductive+ valu [] = valuN Inductive+ valu [1] = valuN CoInductive valu _ = malformed instance EmbPrj Hiding where- icod_ Hidden = return 0- icod_ NotHidden = return 1- icod_ Instance = return 2+ icod_ Hidden = return 0+ icod_ NotHidden = return 1+ icod_ (Instance NoOverlap) = return 2+ icod_ (Instance YesOverlap) = return 3 value 0 = return Hidden value 1 = return NotHidden- value 2 = return Instance+ value 2 = return (Instance NoOverlap)+ value 3 = return (Instance YesOverlap) value _ = malformed instance EmbPrj Relevance where@@ -431,34 +433,36 @@ icod_ (Forced Small) = return 2 icod_ (Forced Big) = return 3 icod_ NonStrict = return 4- icod_ UnusedArg = return 5 value 0 = return Relevant value 1 = return Irrelevant value 2 = return (Forced Small) value 3 = return (Forced Big) value 4 = return NonStrict- value 5 = return UnusedArg value _ = malformed instance EmbPrj Origin where icod_ UserWritten = return 0 icod_ Inserted = return 1 icod_ Reflected = return 2+ icod_ CaseSplit = return 3 value 0 = return UserWritten value 1 = return Inserted value 2 = return Reflected+ value 3 = return CaseSplit value _ = malformed instance EmbPrj ConOrigin where icod_ ConOSystem = return 0 icod_ ConOCon = return 1 icod_ ConORec = return 2+ icod_ ConOSplit = return 3 value 0 = return ConOSystem value 1 = return ConOCon value 2 = return ConORec+ value 3 = return ConOSplit value _ = malformed instance EmbPrj ProjOrigin where@@ -472,36 +476,50 @@ value _ = malformed instance EmbPrj Agda.Syntax.Literal.Literal where- icod_ (LitNat a b) = icode2' a b- icod_ (LitFloat a b) = icode2 1 a b- icod_ (LitString a b) = icode2 2 a b- icod_ (LitChar a b) = icode2 3 a b- icod_ (LitQName a b) = icode2 5 a b- icod_ (LitMeta a b c) = icode3 6 a b c+ icod_ (LitNat a b) = icodeN' LitNat a b+ icod_ (LitFloat a b) = icodeN 1 LitFloat a b+ icod_ (LitString a b) = icodeN 2 LitString a b+ icod_ (LitChar a b) = icodeN 3 LitChar a b+ icod_ (LitQName a b) = icodeN 5 LitQName a b+ icod_ (LitMeta a b c) = icodeN 6 LitMeta a b c value = vcase valu where- valu [a, b] = valu2 LitNat a b- valu [1, a, b] = valu2 LitFloat a b- valu [2, a, b] = valu2 LitString a b- valu [3, a, b] = valu2 LitChar a b- valu [5, a, b] = valu2 LitQName a b- valu [6, a, b, c] = valu3 LitMeta a b c+ valu [a, b] = valuN LitNat a b+ valu [1, a, b] = valuN LitFloat a b+ valu [2, a, b] = valuN LitString a b+ valu [3, a, b] = valuN LitChar a b+ valu [5, a, b] = valuN LitQName a b+ valu [6, a, b, c] = valuN LitMeta a b c valu _ = malformed instance EmbPrj IsAbstract where- icod_ AbstractDef = icode0 0- icod_ ConcreteDef = icode0'+ icod_ AbstractDef = icodeN 0 AbstractDef+ icod_ ConcreteDef = icodeN' ConcreteDef value = vcase valu where- valu [0] = valu0 AbstractDef- valu [] = valu0 ConcreteDef+ valu [0] = valuN AbstractDef+ valu [] = valuN ConcreteDef valu _ = malformed instance EmbPrj Delayed where- icod_ Delayed = icode0 0- icod_ NotDelayed = icode0'+ icod_ Delayed = icodeN 0 Delayed+ icod_ NotDelayed = icodeN' NotDelayed value = vcase valu where- valu [0] = valu0 Delayed- valu [] = valu0 NotDelayed+ valu [0] = valuN Delayed+ valu [] = valuN NotDelayed valu _ = malformed++instance EmbPrj Impossible where+ icod_ (Impossible a b) = icodeN 0 Impossible a b+ icod_ (Unreachable a b) = icodeN 1 Unreachable a b++ value = vcase valu where+ valu [0, a, b] = valuN Impossible a b+ valu [1, a, b] = valuN Unreachable a b+ valu _ = malformed++instance EmbPrj Empty where+ icod_ a = icod_ =<< lift (Empty.toImpossible a)++ value = fmap throwImpossible . value
src/full/Agda/TypeChecking/Serialise/Instances/Compilers.hs view
@@ -3,164 +3,20 @@ module Agda.TypeChecking.Serialise.Instances.Compilers where -import qualified Data.Binary.Get as B-import qualified Data.Binary.Put as B--import qualified Agda.Compiler.Epic.Interface as Epic-import qualified Agda.Compiler.UHC.Pragmas.Base as CR-import qualified Agda.Compiler.UHC.Bridge as UHCB-import qualified Agda.Compiler.JS.Syntax as JS- import Agda.TypeChecking.Serialise.Base-import Agda.TypeChecking.Serialise.Instances.Common ()+import Agda.TypeChecking.Serialise.Instances.Common import Agda.TypeChecking.Monad -instance EmbPrj HaskellExport where- icod_ (HsExport a b) = icode2' a b-- value = vcase valu where- valu [a,b] = valu2 HsExport a b- valu _ = malformed--instance EmbPrj HaskellRepresentation where- icod_ (HsType a) = icode1' a- icod_ (HsDefn a b) = icode2' a b-- value = vcase valu where- valu [a] = valu1 HsType a- valu [a, b] = valu2 HsDefn a b- valu _ = malformed--instance EmbPrj CompiledRepresentation where- icod_ (CompiledRep a b c d e) = icode5' a b c d e-- value = vcase valu where- valu [a, b, c, d, e] = valu5 CompiledRep a b c d e- valu _ = malformed--instance EmbPrj JS.Exp where- icod_ (JS.Self) = icode0 0- icod_ (JS.Local i) = icode1 1 i- icod_ (JS.Global i) = icode1 2 i- icod_ (JS.Undefined) = icode0 3- icod_ (JS.String s) = icode1 4 s- icod_ (JS.Char c) = icode1 5 c- icod_ (JS.Integer n) = icode1 6 n- icod_ (JS.Double d) = icode1 7 d- icod_ (JS.Lambda n e) = icode2 8 n e- icod_ (JS.Object o) = icode1 9 o- icod_ (JS.Apply e es) = icode2 10 e es- icod_ (JS.Lookup e l) = icode2 11 e l- icod_ (JS.If e f g) = icode3 12 e f g- icod_ (JS.BinOp e op f) = icode3 13 e op f- icod_ (JS.PreOp op e) = icode2 14 op e- icod_ (JS.Const i) = icode1 15 i- icod_ (JS.PlainJS a) = icode1 16 a-- value = vcase valu where- valu [0] = valu0 JS.Self- valu [1, a] = valu1 JS.Local a- valu [2, a] = valu1 JS.Global a- valu [3] = valu0 JS.Undefined- valu [4, a] = valu1 JS.String a- valu [5, a] = valu1 JS.Char a- valu [6, a] = valu1 JS.Integer a- valu [7, a] = valu1 JS.Double a- valu [8, a, b] = valu2 JS.Lambda a b- valu [9, a] = valu1 JS.Object a- valu [10, a, b] = valu2 JS.Apply a b- valu [11, a, b] = valu2 JS.Lookup a b- valu [12, a, b, c] = valu3 JS.If a b c- valu [13, a, b, c] = valu3 JS.BinOp a b c- valu [14, a, b] = valu2 JS.PreOp a b- valu [15, a] = valu1 JS.Const a- valu [16, a] = valu1 JS.PlainJS a- valu _ = malformed--instance EmbPrj JS.LocalId where- icod_ (JS.LocalId l) = icode l- value n = JS.LocalId `fmap` value n--instance EmbPrj JS.GlobalId where- icod_ (JS.GlobalId l) = icode l- value n = JS.GlobalId `fmap` value n--instance EmbPrj JS.MemberId where- icod_ (JS.MemberId l) = icode l- value n = JS.MemberId `fmap` value n--instance EmbPrj CoreRepresentation where- icod_ (CrDefn a) = icode1 1 a- icod_ (CrType a) = icode1 2 a- icod_ (CrConstr a) = icode1 3 a-- value = vcase valu where- valu [1, a] = valu1 CrDefn a- valu [2, a] = valu1 CrType a- valu [3, a] = valu1 CrConstr a- valu _ = malformed--instance EmbPrj CR.CoreType where- icod_ (CR.CTMagic a) = icode1 1 a- icod_ (CR.CTNormal a) = icode1 2 a-- value = vcase valu where- valu [1, a] = valu1 CR.CTMagic a- valu [2, a] = valu1 CR.CTNormal a- valu _ = malformed--instance EmbPrj CR.CoreConstr where- icod_ (CR.CCMagic a b) = icode2 1 a b- icod_ (CR.CCNormal a b c) = icode3 2 a b c-- value = vcase valu where- valu [1, a, b] = valu2 CR.CCMagic a b- valu [2, a, b, c] = valu3 CR.CCNormal a b c- valu _ = malformed--instance EmbPrj CR.HsName where- icod_ = icode . B.runPut . UHCB.serialize- value n = value n >>= return . (B.runGet UHCB.unserialize)---- This is used for the Epic compiler backend-instance EmbPrj Epic.EInterface where- icod_ (Epic.EInterface a b c d e f g h) = icode8' a b c d e f g h-- value = vcase valu where- valu [a, b, c, d, e, f, g, h] = valu8 Epic.EInterface a b c d e f g h- valu _ = malformed--instance EmbPrj Epic.InjectiveFun where- icod_ (Epic.InjectiveFun a b) = icode2' a b-- value = vcase valu where- valu [a,b] = valu2 Epic.InjectiveFun a b- valu _ = malformed--instance EmbPrj Epic.Relevance where- icod_ Epic.Irr = icode0 0- icod_ Epic.Rel = icode0 1-- value = vcase valu where- valu [0] = valu0 Epic.Irr- valu [1] = valu0 Epic.Rel- valu _ = malformed+instance EmbPrj CompilerPragma where+ icod_ (CompilerPragma a b) =+ icodeN' (CompilerPragma . underlyingRange) (SerialisedRange a) b -instance EmbPrj Epic.Forced where- icod_ Epic.Forced = icode0 0- icod_ Epic.NotForced = icode0 1+ value = valueN (CompilerPragma . underlyingRange) - value = vcase valu where- valu [0] = valu0 Epic.Forced- valu [1] = valu0 Epic.NotForced- valu _ = malformed+instance EmbPrj ForeignCode where+ icod_ (ForeignCode r a) =+ icodeN' (ForeignCode . underlyingRange) (SerialisedRange r) a -instance EmbPrj Epic.Tag where- icod_ (Epic.Tag a) = icode1 0 a- icod_ (Epic.PrimTag a) = icode1 1 a+ value = valueN (ForeignCode . underlyingRange) - value = vcase valu where- valu [0, a] = valu1 Epic.Tag a- valu [1, a] = valu1 Epic.PrimTag a- valu _ = malformed
+ src/full/Agda/TypeChecking/Serialise/Instances/Errors.hs view
@@ -0,0 +1,101 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++#if __GLASGOW_HASKELL__ <= 708+{-# OPTIONS_GHC -fcontext-stack=30 #-}+#endif++module Agda.TypeChecking.Serialise.Instances.Errors where++#if __GLASGOW_HASKELL__ <= 708+import Agda.TypeChecking.Pretty ()+#endif++import Agda.TypeChecking.Serialise.Base+import Agda.TypeChecking.Serialise.Instances.Common+import Agda.TypeChecking.Serialise.Instances.Internal ()+import Agda.TypeChecking.Serialise.Instances.Abstract ()++import Agda.Syntax.Common+import Agda.Syntax.Concrete.Definitions (DeclarationWarning(..))+import Agda.Syntax.Abstract.Name (ModuleName)+import Agda.TypeChecking.Monad.Base+import Agda.Interaction.Options+import Agda.Termination.CutOff+import Agda.TypeChecking.Positivity.Occurrence ()+import Agda.Syntax.Parser.Monad (ParseWarning( OverlappingTokensWarning ))+import Agda.Utils.Pretty+import Agda.Utils.FileName ()++import Agda.Utils.Lens++#include "undefined.h"+import Agda.Utils.Impossible++instance EmbPrj TCWarning where+ icod_ (TCWarning a b c) = icodeN' TCWarning a b c++ value = valueN TCWarning++-- We don't need to serialise warnings that turn into errors+instance EmbPrj Warning where+ icod_ (TerminationIssue a) = __IMPOSSIBLE__+ icod_ (UnreachableClauses a b) = icodeN 0 UnreachableClauses a b+ icod_ (CoverageIssue a b) = __IMPOSSIBLE__+ icod_ (CoverageNoExactSplit a b) = __IMPOSSIBLE__+ icod_ (NotStrictlyPositive a b) = __IMPOSSIBLE__+ icod_ (UnsolvedMetaVariables a) = __IMPOSSIBLE__+ icod_ (UnsolvedInteractionMetas a) = __IMPOSSIBLE__+ icod_ (UnsolvedConstraints a) = __IMPOSSIBLE__+ icod_ (OldBuiltin a b) = icodeN 1 OldBuiltin a b+ icod_ EmptyRewritePragma = icodeN 2 EmptyRewritePragma+ icod_ UselessPublic = icodeN 3 UselessPublic+ icod_ (UselessInline a) = icodeN 4 UselessInline a+ icod_ (GenericWarning a) = icodeN 5 GenericWarning a+ icod_ (GenericNonFatalError a) = __IMPOSSIBLE__+ icod_ (SafeFlagPostulate a) = __IMPOSSIBLE__+ icod_ (SafeFlagPragma a) = __IMPOSSIBLE__+ icod_ SafeFlagNonTerminating = __IMPOSSIBLE__+ icod_ SafeFlagTerminating = __IMPOSSIBLE__+ icod_ SafeFlagPrimTrustMe = __IMPOSSIBLE__+ icod_ SafeFlagNoPositivityCheck = __IMPOSSIBLE__+ icod_ SafeFlagPolarity = __IMPOSSIBLE__+ icod_ (ParseWarning a) = __IMPOSSIBLE__+ icod_ (DeprecationWarning a b c) = icodeN 6 DeprecationWarning a b c+ icod_ (NicifierIssue a) = icodeN 7 NicifierIssue a++ value = vcase valu where+ valu [0, a, b] = valuN UnreachableClauses a b+ valu [1, a, b] = valuN OldBuiltin a b+ valu [2] = valuN EmptyRewritePragma+ valu [3] = valuN UselessPublic+ valu [4, a] = valuN UselessInline a+ valu [5, a] = valuN GenericWarning a+ valu [6, a, b, c] = valuN DeprecationWarning a b c+ valu [7, a] = valuN NicifierIssue a+ valu _ = malformed++instance EmbPrj DeclarationWarning where+ icod_ = \case+ UnknownNamesInFixityDecl a -> icodeN 0 UnknownNamesInFixityDecl a+ UnknownNamesInPolarityPragmas a -> icodeN 1 UnknownNamesInPolarityPragmas a+ PolarityPragmasButNotPostulates a -> icodeN 2 PolarityPragmasButNotPostulates a+ UselessPrivate a -> icodeN 3 UselessPrivate a+ UselessAbstract a -> icodeN 4 UselessAbstract a+ UselessInstance a -> icodeN 5 UselessInstance a++ value = vcase $ \case+ [0, a] -> valueN UnknownNamesInFixityDecl a+ [1, a] -> valueN UnknownNamesInPolarityPragmas a+ [2, a] -> valueN PolarityPragmasButNotPostulates a+ [3, a] -> valueN UselessPrivate a+ [4, a] -> valueN UselessAbstract a+ [5, a] -> valueN UselessInstance a+ _ -> malformed++instance EmbPrj Doc where+ icod_ d = icodeN' (undefined :: String -> Doc) (render d)++ value = valueN text+
src/full/Agda/TypeChecking/Serialise/Instances/Highlighting.hs view
@@ -9,89 +9,96 @@ import Agda.TypeChecking.Serialise.Instances.Common () instance EmbPrj HR.Range where- icod_ (HR.Range a b) = icode2' a b+ icod_ (HR.Range a b) = icodeN' HR.Range a b - value = vcase valu where- valu [a, b] = valu2 HR.Range a b- valu _ = malformed+ value = valueN HR.Range instance EmbPrj HP.NameKind where- icod_ HP.Bound = icode0'- icod_ (HP.Constructor a) = icode1 1 a- icod_ HP.Datatype = icode0 2- icod_ HP.Field = icode0 3- icod_ HP.Function = icode0 4- icod_ HP.Module = icode0 5- icod_ HP.Postulate = icode0 6- icod_ HP.Primitive = icode0 7- icod_ HP.Record = icode0 8- icod_ HP.Argument = icode0 9- icod_ HP.Macro = icode0 10+ icod_ HP.Bound = icodeN' HP.Bound+ icod_ (HP.Constructor a) = icodeN 1 HP.Constructor a+ icod_ HP.Datatype = icodeN 2 ()+ icod_ HP.Field = icodeN 3 ()+ icod_ HP.Function = icodeN 4 ()+ icod_ HP.Module = icodeN 5 ()+ icod_ HP.Postulate = icodeN 6 ()+ icod_ HP.Primitive = icodeN 7 ()+ icod_ HP.Record = icodeN 8 ()+ icod_ HP.Argument = icodeN 9 ()+ icod_ HP.Macro = icodeN 10 () value = vcase valu where- valu [] = valu0 HP.Bound- valu [1 , a] = valu1 HP.Constructor a- valu [2] = valu0 HP.Datatype- valu [3] = valu0 HP.Field- valu [4] = valu0 HP.Function- valu [5] = valu0 HP.Module- valu [6] = valu0 HP.Postulate- valu [7] = valu0 HP.Primitive- valu [8] = valu0 HP.Record- valu [9] = valu0 HP.Argument- valu [10] = valu0 HP.Macro+ valu [] = valuN HP.Bound+ valu [1 , a] = valuN HP.Constructor a+ valu [2] = valuN HP.Datatype+ valu [3] = valuN HP.Field+ valu [4] = valuN HP.Function+ valu [5] = valuN HP.Module+ valu [6] = valuN HP.Postulate+ valu [7] = valuN HP.Primitive+ valu [8] = valuN HP.Record+ valu [9] = valuN HP.Argument+ valu [10] = valuN HP.Macro valu _ = malformed instance EmbPrj HP.Aspect where- icod_ HP.Comment = icode0 0- icod_ HP.Keyword = icode0 1- icod_ HP.String = icode0 2- icod_ HP.Number = icode0 3- icod_ HP.Symbol = icode0'- icod_ HP.PrimitiveType = icode0 5- icod_ (HP.Name mk b) = icode2 6 mk b+ icod_ HP.Comment = icodeN 0 ()+ icod_ HP.Option = icodeN 1 ()+ icod_ HP.Keyword = icodeN 2 ()+ icod_ HP.String = icodeN 3 ()+ icod_ HP.Number = icodeN 4 ()+ icod_ HP.Symbol = icodeN' HP.Symbol+ icod_ HP.PrimitiveType = icodeN 6 ()+ icod_ (HP.Name mk b) = icodeN 7 HP.Name mk b value = vcase valu where- valu [0] = valu0 HP.Comment- valu [1] = valu0 HP.Keyword- valu [2] = valu0 HP.String- valu [3] = valu0 HP.Number- valu [] = valu0 HP.Symbol- valu [5] = valu0 HP.PrimitiveType- valu [6, mk, b] = valu2 HP.Name mk b+ valu [0] = valuN HP.Comment+ valu [1] = valuN HP.Option+ valu [2] = valuN HP.Keyword+ valu [3] = valuN HP.String+ valu [4] = valuN HP.Number+ valu [] = valuN HP.Symbol+ valu [6] = valuN HP.PrimitiveType+ valu [7, mk, b] = valuN HP.Name mk b valu _ = malformed instance EmbPrj HP.OtherAspect where- icod_ HP.Error = icode0 0- icod_ HP.DottedPattern = icode0'- icod_ HP.UnsolvedMeta = icode0 2- icod_ HP.TerminationProblem = icode0 3- icod_ HP.IncompletePattern = icode0 4- icod_ HP.TypeChecks = icode0 5- icod_ HP.UnsolvedConstraint = icode0 6- icod_ HP.PositivityProblem = icode0 7+ icod_ HP.Error = icodeN 0 ()+ icod_ HP.DottedPattern = icodeN' HP.DottedPattern+ icod_ HP.UnsolvedMeta = icodeN 2 ()+ icod_ HP.TerminationProblem = icodeN 3 ()+ icod_ HP.IncompletePattern = icodeN 4 ()+ icod_ HP.TypeChecks = icodeN 5 ()+ icod_ HP.UnsolvedConstraint = icodeN 6 ()+ icod_ HP.PositivityProblem = icodeN 7 ()+ icod_ HP.ReachabilityProblem = icodeN 8 ()+ icod_ HP.CoverageProblem = icodeN 9 ()+ icod_ HP.CatchallClause = icodeN 10 () value = vcase valu where- valu [0] = valu0 HP.Error- valu [] = valu0 HP.DottedPattern- valu [2] = valu0 HP.UnsolvedMeta- valu [3] = valu0 HP.TerminationProblem- valu [4] = valu0 HP.IncompletePattern- valu [5] = valu0 HP.TypeChecks- valu [6] = valu0 HP.UnsolvedConstraint- valu [7] = valu0 HP.PositivityProblem+ valu [0] = valuN HP.Error+ valu [] = valuN HP.DottedPattern+ valu [2] = valuN HP.UnsolvedMeta+ valu [3] = valuN HP.TerminationProblem+ valu [4] = valuN HP.IncompletePattern+ valu [5] = valuN HP.TypeChecks+ valu [6] = valuN HP.UnsolvedConstraint+ valu [7] = valuN HP.PositivityProblem+ valu [8] = valuN HP.ReachabilityProblem+ valu [9] = valuN HP.CoverageProblem+ valu [10] = valuN HP.CatchallClause valu _ = malformed instance EmbPrj HP.Aspects where- icod_ (HP.Aspects a b c d) = icode4' a b c d+ icod_ (HP.Aspects a b c d) = icodeN' HP.Aspects a b c d - value = vcase valu where- valu [a, b, c, d] = valu4 HP.Aspects a b c d- valu _ = malformed+ value = valueN HP.Aspects +instance EmbPrj HP.DefinitionSite where+ icod_ (HP.DefinitionSite a b c d) = icodeN' HP.DefinitionSite a b c d++ value = valueN HP.DefinitionSite+ instance EmbPrj HP.CompressedFile where- icod_ (HP.CompressedFile f) = icode1' f+ icod_ (HP.CompressedFile f) = icodeN' HP.CompressedFile f - value = vcase valu where- valu [f] = valu1 HP.CompressedFile f- valu _ = malformed+ value = valueN HP.CompressedFile
src/full/Agda/TypeChecking/Serialise/Instances/Internal.hs view
@@ -24,166 +24,149 @@ import Agda.Utils.Impossible instance EmbPrj Signature where- icod_ (Sig a b c) = icode3' a b c+ icod_ (Sig a b c) = icodeN' Sig a b c - value = vcase valu where- valu [a, b, c] = valu3 Sig a b c- valu _ = malformed+ value = valueN Sig instance EmbPrj Section where- icod_ (Section a) = icode1' a+ icod_ (Section a) = icodeN' Section a - value = vcase valu where- valu [a] = valu1 Section a- valu _ = malformed+ value = valueN Section instance EmbPrj a => EmbPrj (Tele a) where- icod_ EmptyTel = icode0'- icod_ (ExtendTel a b) = icode2' a b+ icod_ EmptyTel = icodeN' EmptyTel+ icod_ (ExtendTel a b) = icodeN' ExtendTel a b value = vcase valu where- valu [] = valu0 EmptyTel- valu [a, b] = valu2 ExtendTel a b+ valu [] = valuN EmptyTel+ valu [a, b] = valuN ExtendTel a b valu _ = malformed instance EmbPrj Permutation where- icod_ (Perm a b) = icode2' a b+ icod_ (Perm a b) = icodeN' Perm a b - value = vcase valu where- valu [a, b] = valu2 Perm a b- valu _ = malformed+ value = valueN Perm instance EmbPrj a => EmbPrj (Drop a) where- icod_ (Drop a b) = icode2' a b+ icod_ (Drop a b) = icodeN' Drop a b - value = vcase valu where- valu [a, b] = valu2 Drop a b- valu _ = malformed+ value = valueN Drop instance EmbPrj a => EmbPrj (Elim' a) where- icod_ (Apply a) = icode1' a- icod_ (Proj a b) = icode2 0 a b+ icod_ (Apply a) = icodeN' Apply a+ icod_ (Proj a b) = icodeN 0 Proj a b value = vcase valu where- valu [a] = valu1 Apply a- valu [0, a, b] = valu2 Proj a b+ valu [a] = valuN Apply a+ valu [0, a, b] = valuN Proj a b valu _ = malformed instance EmbPrj I.ConHead where- icod_ (ConHead a b c) = icode3' a b c+ icod_ (ConHead a b c) = icodeN' ConHead a b c - value = vcase valu where- valu [a, b, c] = valu3 ConHead a b c- valu _ = malformed+ value = valueN ConHead instance (EmbPrj a) => EmbPrj (I.Type' a) where- icod_ (El a b) = icode2' a b+ icod_ (El a b) = icodeN' El a b - value = vcase valu where- valu [a, b] = valu2 El a b- valu _ = malformed+ value = valueN El -instance (EmbPrj a) => EmbPrj (I.Abs a) where- icod_ (NoAbs a b) = icode2 0 a b- icod_ (Abs a b) = icode2' a b+instance EmbPrj a => EmbPrj (I.Abs a) where+ icod_ (NoAbs a b) = icodeN 0 NoAbs a b+ icod_ (Abs a b) = icodeN' Abs a b value = vcase valu where- valu [a, b] = valu2 Abs a b- valu [0, a, b] = valu2 NoAbs a b+ valu [a, b] = valuN Abs a b+ valu [0, a, b] = valuN NoAbs a b valu _ = malformed instance EmbPrj I.Term where- icod_ (Var a []) = icode1' a- icod_ (Var a b) = icode2 0 a b- icod_ (Lam a b) = icode2 1 a b- icod_ (Lit a ) = icode1 2 a- icod_ (Def a b) = icode2 3 a b- icod_ (Con a b c) = icode3 4 a b c- icod_ (Pi a b) = icode2 5 a b- icod_ (Sort a ) = icode1 7 a+ icod_ (Var a []) = icodeN' (\ a -> Var a []) a+ icod_ (Var a b) = icodeN 0 Var a b+ icod_ (Lam a b) = icodeN 1 Lam a b+ icod_ (Lit a ) = icodeN 2 Lit a+ icod_ (Def a b) = icodeN 3 Def a b+ icod_ (Con a b c) = icodeN 4 Con a b c+ icod_ (Pi a b) = icodeN 5 Pi a b+ icod_ (Sort a ) = icodeN 7 Sort a icod_ (MetaV a b) = __IMPOSSIBLE__- icod_ (DontCare a ) = icode1 8 a- icod_ (Level a ) = icode1 9 a+ icod_ (DontCare a ) = icodeN 8 DontCare a+ icod_ (Level a ) = icodeN 9 Level a icod_ (Shared p) = icodeMemo termD termC p $ icode (derefPtr p) value r = vcase valu' r where valu' xs = gets mkShared <*> valu xs- valu [a] = valu1 var a- valu [0, a, b] = valu2 Var a b- valu [1, a, b] = valu2 Lam a b- valu [2, a] = valu1 Lit a- valu [3, a, b] = valu2 Def a b- valu [4, a, b, c] = valu3 Con a b c- valu [5, a, b] = valu2 Pi a b- valu [7, a] = valu1 Sort a- valu [8, a] = valu1 DontCare a- valu [9, a] = valu1 Level a+ valu [a] = valuN var a+ valu [0, a, b] = valuN Var a b+ valu [1, a, b] = valuN Lam a b+ valu [2, a] = valuN Lit a+ valu [3, a, b] = valuN Def a b+ valu [4, a, b, c] = valuN Con a b c+ valu [5, a, b] = valuN Pi a b+ valu [7, a] = valuN Sort a+ valu [8, a] = valuN DontCare a+ valu [9, a] = valuN Level a valu _ = malformed instance EmbPrj Level where- icod_ (Max a) = icode1' a+ icod_ (Max a) = icodeN' Max a - value = vcase valu where- valu [a] = valu1 Max a- valu _ = malformed+ value = valueN Max instance EmbPrj PlusLevel where- icod_ (ClosedLevel a) = icode1' a- icod_ (Plus a b) = icode2' a b+ icod_ (ClosedLevel a) = icodeN' ClosedLevel a+ icod_ (Plus a b) = icodeN' Plus a b value = vcase valu where- valu [a] = valu1 ClosedLevel a- valu [a, b] = valu2 Plus a b+ valu [a] = valuN ClosedLevel a+ valu [a, b] = valuN Plus a b valu _ = malformed instance EmbPrj LevelAtom where- icod_ (NeutralLevel _ a) = icode1' a- icod_ (UnreducedLevel a) = icode1 1 a- icod_ MetaLevel{} = __IMPOSSIBLE__+ icod_ (NeutralLevel r a) = icodeN' (NeutralLevel r) a+ icod_ (UnreducedLevel a) = icodeN 1 UnreducedLevel a+ icod_ (MetaLevel a b) = __IMPOSSIBLE__ icod_ BlockedLevel{} = __IMPOSSIBLE__ value = vcase valu where- valu [a] = valu1 UnreducedLevel a -- we forget that we are a NeutralLevel,+ valu [a] = valuN UnreducedLevel a -- we forget that we are a NeutralLevel, -- since we do not want do (de)serialize -- the reason for neutrality- valu [1, a] = valu1 UnreducedLevel a+ valu [1, a] = valuN UnreducedLevel a valu _ = malformed instance EmbPrj I.Sort where- icod_ (Type a ) = icode1' a- icod_ Prop = icode1 1 ()- icod_ SizeUniv = icode1 3 ()- icod_ Inf = icode1 4 ()- icod_ (DLub a b) = __IMPOSSIBLE__+ icod_ (Type a ) = icodeN 0 Type a+ icod_ Prop = icodeN' Prop+ icod_ SizeUniv = icodeN 1 SizeUniv+ icod_ Inf = icodeN 2 Inf+ icod_ (DLub a b) = icodeN 3 DLub a b -- Andreas, 2017-01-18: not __IMPOSSIBLE__ see #2408 value = vcase valu where- valu [a] = valu1 Type a- valu [1, _] = valu0 Prop- valu [3, _] = valu0 SizeUniv- valu [4, _] = valu0 Inf- valu _ = malformed+ valu [] = valuN Prop+ valu [0, a] = valuN Type a+ valu [1] = valuN SizeUniv+ valu [2] = valuN Inf+ valu [3, a, b] = valuN DLub a b+ valu _ = malformed instance EmbPrj DisplayForm where- icod_ (Display a b c) = icode3' a b c+ icod_ (Display a b c) = icodeN' Display a b c - value = vcase valu where- valu [a, b, c] = valu3 Display a b c- valu _ = malformed+ value = valueN Display instance EmbPrj a => EmbPrj (Open a) where- icod_ (OpenThing a b) = icode2' a b+ icod_ (OpenThing a b) = icodeN' OpenThing a b - value = vcase valu where- valu [a, b] = valu2 OpenThing a b- valu _ = malformed+ value = valueN OpenThing instance EmbPrj a => EmbPrj (Local a) where- icod_ (Local a b) = icode2' a b- icod_ (Global a) = icode1' a+ icod_ (Local a b) = icodeN' Local a b+ icod_ (Global a) = icodeN' Global a value = vcase valu where- valu [a, b] = valu2 Local a b- valu [a] = valu1 Global a+ valu [a, b] = valuN Local a b+ valu [a] = valuN Global a valu _ = malformed instance EmbPrj CtxId where@@ -191,18 +174,18 @@ value n = CtxId `fmap` value n instance EmbPrj DisplayTerm where- icod_ (DTerm a ) = icode1' a- icod_ (DDot a ) = icode1 1 a- icod_ (DCon a b c) = icode3 2 a b c- icod_ (DDef a b) = icode2 3 a b- icod_ (DWithApp a b c) = icode3 4 a b c+ icod_ (DTerm a ) = icodeN' DTerm a+ icod_ (DDot a ) = icodeN 1 DDot a+ icod_ (DCon a b c) = icodeN 2 DCon a b c+ icod_ (DDef a b) = icodeN 3 DDef a b+ icod_ (DWithApp a b c) = icodeN 4 DWithApp a b c value = vcase valu where- valu [a] = valu1 DTerm a- valu [1, a] = valu1 DDot a- valu [2, a, b, c] = valu3 DCon a b c- valu [3, a, b] = valu2 DDef a b- valu [4, a, b, c] = valu3 DWithApp a b c+ valu [a] = valuN DTerm a+ valu [1, a] = valuN DDot a+ valu [2, a, b, c] = valuN DCon a b c+ valu [3, a, b] = valuN DDef a b+ valu [4, a, b, c] = valuN DWithApp a b c valu _ = malformed instance EmbPrj MutualId where@@ -210,65 +193,54 @@ value n = MutId `fmap` value n instance EmbPrj Definition where- icod_ (Defn a b c d e f g h i j k l) = icode12' a b (P.killRange c) d e f g h i j k l+ icod_ (Defn a b c d e f g h i j k l m) =+ icodeN' Defn a b (P.killRange c) d e f g h i j k l m - value = vcase valu where- valu [a, b, c, d, e, f, g, h, i, j, k, l] = valu12 Defn a b c d e f g h i j k l- valu _ = malformed+ value = valueN Defn instance EmbPrj NLPat where- icod_ (PVar a b c) = icode3 0 a b c- icod_ (PWild) = icode0 1- icod_ (PDef a b) = icode2 2 a b- icod_ (PLam a b) = icode2 3 a b- icod_ (PPi a b) = icode2 4 a b- icod_ (PBoundVar a b) = icode2 5 a b- icod_ (PTerm a) = icode1 6 a+ icod_ (PVar a b) = icodeN 0 PVar a b+ icod_ (PWild) = icodeN 1 PWild+ icod_ (PDef a b) = icodeN 2 PDef a b+ icod_ (PLam a b) = icodeN 3 PLam a b+ icod_ (PPi a b) = icodeN 4 PPi a b+ icod_ (PBoundVar a b) = icodeN 5 PBoundVar a b+ icod_ (PTerm a) = icodeN 6 PTerm a value = vcase valu where- valu [0, a, b, c] = valu3 PVar a b c- valu [1] = valu0 PWild- valu [2, a, b] = valu2 PDef a b- valu [3, a, b] = valu2 PLam a b- valu [4, a, b] = valu2 PPi a b- valu [5, a, b] = valu2 PBoundVar a b- valu [6, a] = valu1 PTerm a+ valu [0, a, b] = valuN PVar a b+ valu [1] = valuN PWild+ valu [2, a, b] = valuN PDef a b+ valu [3, a, b] = valuN PLam a b+ valu [4, a, b] = valuN PPi a b+ valu [5, a, b] = valuN PBoundVar a b+ valu [6, a] = valuN PTerm a valu _ = malformed instance EmbPrj NLPType where- icod_ (NLPType a b) = icode2' a b+ icod_ (NLPType a b) = icodeN' NLPType a b - value = vcase valu where- valu [a, b] = valu2 NLPType a b- valu _ = malformed+ value = valueN NLPType instance EmbPrj RewriteRule where- icod_ (RewriteRule a b c d e f) = icode6' a b c d e f+ icod_ (RewriteRule a b c d e f) = icodeN' RewriteRule a b c d e f - value = vcase valu where- valu [a, b, c, d, e, f] = valu6 RewriteRule a b c d e f- valu _ = malformed+ value = valueN RewriteRule instance EmbPrj Projection where- icod_ (Projection a b c d e) = icode5' a b c d e+ icod_ (Projection a b c d e) = icodeN' Projection a b c d e - value = vcase valu where- valu [a, b, c, d, e] = valu5 Projection a b c d e- valu _ = malformed+ value = valueN Projection instance EmbPrj ProjLams where- icod_ (ProjLams a) = icode1' a+ icod_ (ProjLams a) = icodeN' ProjLams a - value = vcase valu where- valu [a] = valu1 ProjLams a- valu _ = malformed+ value = valueN ProjLams instance EmbPrj ExtLamInfo where- icod_ (ExtLamInfo a b) = icode2' a b+ icod_ (ExtLamInfo a b) = icodeN' ExtLamInfo a b - value = vcase valu where- valu [a, b] = valu2 ExtLamInfo a b- valu _ = malformed+ value = valueN ExtLamInfo instance EmbPrj Polarity where icod_ Covariant = return 0@@ -299,129 +271,139 @@ value _ = malformed instance EmbPrj EtaEquality where- icod_ (Specified a) = icode1 0 a- icod_ (Inferred a) = icode1 1 a+ icod_ (Specified a) = icodeN 0 Specified a+ icod_ (Inferred a) = icodeN 1 Inferred a value = vcase valu where- valu [0,a] = valu1 Specified a- valu [1,a] = valu1 Inferred a+ valu [0,a] = valuN Specified a+ valu [1,a] = valuN Inferred a valu _ = malformed instance EmbPrj Defn where- icod_ Axiom = icode0 0- icod_ (Function a b _ c d e f g h i j k m) = icode12 1 a b c d e f g h i j k m- icod_ (Datatype a b c d e f g h i j) = icode10 2 a b c d e f g h i j- icod_ (Record a b c d e f g h i j k) = icode11 3 a b c d e f g h i j k- icod_ (Constructor a b c d e f) = icode6 4 a b c d e f- icod_ (Primitive a b c d) = icode4 5 a b c d- icod_ AbstractDefn = __IMPOSSIBLE__+ icod_ Axiom = icodeN 0 Axiom+ icod_ (Function a b t c d e f g h i j k m) =+ icodeN 1 (\ a b -> Function a b t) a b c d e f g h i j k m+ icod_ (Datatype a b c d e f g h i j) = icodeN 2 Datatype a b c d e f g h i j+ icod_ (Record a b c d e f g h i j) = icodeN 3 Record a b c d e f g h i j+ icod_ (Constructor a b c d e f g) = icodeN 4 Constructor a b c d e f g+ icod_ (Primitive a b c d) = icodeN 5 Primitive a b c d+ icod_ AbstractDefn{} = __IMPOSSIBLE__ value = vcase valu where- valu [0] = valu0 Axiom- valu [1, a, b, c, d, e, f, g, h, i, j, k, m] = valu12 (\ a b -> Function a b Nothing) a b c d e f g h i j k m- valu [2, a, b, c, d, e, f, g, h, i, j] = valu10 Datatype a b c d e f g h i j- valu [3, a, b, c, d, e, f, g, h, i, j, k] = valu11 Record a b c d e f g h i j k- valu [4, a, b, c, d, e, f] = valu6 Constructor a b c d e f- valu [5, a, b, c, d] = valu4 Primitive a b c d+ valu [0] = valuN Axiom+ valu [1, a, b, c, d, e, f, g, h, i, j, k, m] = valuN (\ a b -> Function a b Nothing) a b c d e f g h i j k m+ valu [2, a, b, c, d, e, f, g, h, i, j] = valuN Datatype a b c d e f g h i j+ valu [3, a, b, c, d, e, f, g, h, i, j] = valuN Record a b c d e f g h i j+ valu [4, a, b, c, d, e, f, g] = valuN Constructor a b c d e f g+ valu [5, a, b, c, d] = valuN Primitive a b c d valu _ = malformed instance EmbPrj FunctionFlag where- icod_ FunStatic = icode0 0- icod_ FunInline = icode0 1- icod_ FunMacro = icode0 2+ icod_ FunStatic = icodeN 0 FunStatic+ icod_ FunInline = icodeN 1 FunInline+ icod_ FunMacro = icodeN 2 FunMacro value = vcase valu where- valu [0] = valu0 FunStatic- valu [1] = valu0 FunInline- valu [2] = valu0 FunMacro+ valu [0] = valuN FunStatic+ valu [1] = valuN FunInline+ valu [2] = valuN FunMacro valu _ = malformed instance EmbPrj a => EmbPrj (WithArity a) where- icod_ (WithArity a b) = icode2' a b+ icod_ (WithArity a b) = icodeN' WithArity a b - value = vcase valu where- valu [a, b] = valu2 WithArity a b- valu _ = malformed+ value = valueN WithArity instance EmbPrj a => EmbPrj (Case a) where- icod_ (Branches a b c d) = icode4' a b c d+ icod_ (Branches a b c d) = icodeN' Branches a b c d - value = vcase valu where- valu [a, b, c, d] = valu4 Branches a b c d- valu _ = malformed+ value = valueN Branches instance EmbPrj CompiledClauses where- icod_ Fail = icode0'- icod_ (Done a b) = icode2' a (P.killRange b)- icod_ (Case a b) = icode2 2 a b+ icod_ Fail = icodeN' Fail+ icod_ (Done a b) = icodeN' Done a (P.killRange b)+ icod_ (Case a b) = icodeN 2 Case a b value = vcase valu where- valu [] = valu0 Fail- valu [a, b] = valu2 Done a b- valu [2, a, b] = valu2 Case a b+ valu [] = valuN Fail+ valu [a, b] = valuN Done a b+ valu [2, a, b] = valuN Case a b valu _ = malformed instance EmbPrj a => EmbPrj (FunctionInverse' a) where- icod_ NotInjective = icode0'- icod_ (Inverse a) = icode1' a+ icod_ NotInjective = icodeN' NotInjective+ icod_ (Inverse a) = icodeN' Inverse a value = vcase valu where- valu [] = valu0 NotInjective- valu [a] = valu1 Inverse a+ valu [] = valuN NotInjective+ valu [a] = valuN Inverse a valu _ = malformed instance EmbPrj TermHead where- icod_ SortHead = icode0'- icod_ PiHead = icode0 1- icod_ (ConsHead a) = icode1 2 a+ icod_ SortHead = icodeN' SortHead+ icod_ PiHead = icodeN 1 PiHead+ icod_ (ConsHead a) = icodeN 2 ConsHead a value = vcase valu where- valu [] = valu0 SortHead- valu [1] = valu0 PiHead- valu [2, a] = valu1 ConsHead a+ valu [] = valuN SortHead+ valu [1] = valuN PiHead+ valu [2, a] = valuN ConsHead a valu _ = malformed instance EmbPrj I.Clause where- icod_ (Clause a b c d e f) = icode6' a b c d e f+ icod_ (Clause a b c d e f g h) = icodeN' Clause a b c d e f g h - value = vcase valu where- valu [a, b, c, d, e, f] = valu6 Clause a b c d e f- valu _ = malformed+ value = valueN Clause instance EmbPrj I.ConPatternInfo where- icod_ (ConPatternInfo a b) = icode2' a b+ icod_ (ConPatternInfo a b) = icodeN' ConPatternInfo a b - value = vcase valu where- valu [a, b] = valu2 ConPatternInfo a b- valu _ = malformed+ value = valueN ConPatternInfo instance EmbPrj I.DBPatVar where- icod_ (DBPatVar a b) = icode2' a b+ icod_ (DBPatVar a b) = icodeN' DBPatVar a b - value = vcase valu where- valu [a, b] = valu2 DBPatVar a b- valu _ = malformed+ value = valueN DBPatVar instance EmbPrj a => EmbPrj (I.Pattern' a) where- icod_ (VarP a ) = icode1' a- icod_ (ConP a b c) = icode3 1 a b c- icod_ (LitP a ) = icode1 2 a- icod_ (DotP a ) = icode1 3 a- icod_ (ProjP a b ) = icode2 4 a b+ icod_ (VarP a ) = icodeN' VarP a+ icod_ (ConP a b c) = icodeN 1 ConP a b c+ icod_ (LitP a ) = icodeN 2 LitP a+ icod_ (DotP a ) = icodeN 3 DotP a+ icod_ (ProjP a b ) = icodeN 4 ProjP a b+ icod_ (AbsurdP a ) = icodeN 5 AbsurdP a value = vcase valu where- valu [a] = valu1 VarP a- valu [1, a, b, c] = valu3 ConP a b c- valu [2, a] = valu1 LitP a- valu [3, a] = valu1 DotP a- valu [4, a, b] = valu2 ProjP a b+ valu [a] = valuN VarP a+ valu [1, a, b, c] = valuN ConP a b c+ valu [2, a] = valuN LitP a+ valu [3, a] = valuN DotP a+ valu [4, a, b] = valuN ProjP a b+ valu [5, a] = valuN AbsurdP a valu _ = malformed instance EmbPrj a => EmbPrj (Builtin a) where- icod_ (Prim a) = icode1' a- icod_ (Builtin a) = icode1 1 a+ icod_ (Prim a) = icodeN' Prim a+ icod_ (Builtin a) = icodeN 1 Builtin a value = vcase valu where- valu [a] = valu1 Prim a- valu [1, a] = valu1 Builtin a+ valu [a] = valuN Prim a+ valu [1, a] = valuN Builtin a valu _ = malformed++instance EmbPrj a => EmbPrj (Substitution' a) where+ icod_ IdS = icodeN' IdS+ icod_ (EmptyS a) = icodeN 1 EmptyS a+ icod_ (a :# b) = icodeN 2 (:#) a b+ icod_ (Strengthen a b) = icodeN 3 Strengthen a b+ icod_ (Wk a b) = icodeN 4 Wk a b+ icod_ (Lift a b) = icodeN 5 Lift a b++ value = vcase valu where+ valu [] = valuN IdS+ valu [1, a] = valuN EmptyS a+ valu [2, a, b] = valuN (:#) a b+ valu [3, a, b] = valuN Strengthen a b+ valu [4, a, b] = valuN Wk a b+ valu [5, a, b] = valuN Lift a b+ valu _ = malformed
src/full/Agda/TypeChecking/SizedTypes.hs view
@@ -7,7 +7,7 @@ import Control.Monad.Writer -import Data.List hiding (null)+import qualified Data.List as List import qualified Data.Map as Map import Agda.Syntax.Common@@ -43,18 +43,31 @@ -- | Check whether a type is either not a SIZELT or a SIZELT that is non-empty. checkSizeLtSat :: Term -> TCM () checkSizeLtSat t = do- reportSDoc "tc.size" 10 $ sep- [ text "checking that " <+> prettyTCM t <+> text " is not an empty type of sizes"- , text "in context " <+> do inTopContext . prettyTCM =<< getContextTelescope- ]+ reportSDoc "tc.size" 10 $ do+ tel <- getContextTelescope+ sep+ [ text "checking that " <+> prettyTCM t <+> text " is not an empty type of sizes"+ , if null tel then empty else do+ text "in context " <+> inTopContext (prettyTCM tel)+ ]+ reportSLn "tc.size" 60 $ "- raw type = " ++ show t let postpone :: Term -> TCM ()- postpone t = addConstraint $ CheckSizeLtSat t+ postpone t = do+ reportSDoc "tc.size.lt" 20 $ sep+ [ text "- postponing `not empty type of sizes' check for " <+> prettyTCM t ]+ addConstraint $ CheckSizeLtSat t+ let ok :: TCM ()+ ok = reportSLn "tc.size.lt" 20 $ "- succeeded: not an empty type of sizes" ifBlocked t (const postpone) $ \ t -> do- caseMaybeM (isSizeType t) (return ()) $ \ b -> do+ reportSLn "tc.size.lt" 20 $ "- type is not blocked"+ caseMaybeM (isSizeType t) ok $ \ b -> do+ reportSLn "tc.size.lt" 20 $ " - type is a size type" case b of- BoundedNo -> return ()+ BoundedNo -> ok BoundedLt b -> do+ reportSDoc "tc.size.lt" 20 $ text " - type is SIZELT" <+> prettyTCM b ifBlocked b (\ _ _ -> postpone t) $ \ b -> do+ reportSLn "tc.size.lt" 20 $ " - size bound is not blocked" catchConstraint (CheckSizeLtSat t) $ do unlessM (checkSizeNeverZero b) $ do typeError . GenericDocError =<< do@@ -177,9 +190,9 @@ case res of Just (BoundedLt u) -> do n <- getContextSize- let tel | n > 0 = telFromList $ genericDrop n $ telToList tel0+ let tel | n > 0 = telFromList $ drop n $ telToList tel0 | otherwise = tel0- addContext tel $ do+ addContext' tel $ do v <- sizeSuc 1 $ raise (size tel) v `apply` teleArgs tel -- compareSizes CmpLeq v u size <- sizeType@@ -286,8 +299,14 @@ -- | @compareBelowMax u vs@ checks @u <= max vs@. Precondition: @size vs >= 2@ compareBelowMax :: DeepSizeView -> SizeMaxView -> TCM ()-compareBelowMax u vs =+compareBelowMax u vs = do+ reportSDoc "tc.conv.size" 45 $ vcat+ [ text "compareBelowMax"+ ] alt (dontAssignMetas $ alts $ map (compareSizeViews CmpLeq u) vs) $ do+ reportSDoc "tc.conv.size" 45 $ vcat+ [ text "compareBelowMax: giving up"+ ] u <- unDeepSizeView u v <- unMaxView vs size <- sizeType@@ -299,6 +318,12 @@ compareSizeViews :: Comparison -> DeepSizeView -> DeepSizeView -> TCM () compareSizeViews cmp s1' s2' = do+ reportSDoc "tc.conv.size" 45 $ hsep+ [ text "compareSizeViews"+ , text (show s1')+ , text (show cmp)+ , text (show s2')+ ] size <- sizeType let (s1, s2) = removeSucs (s1', s2') withUnView cont = do@@ -359,14 +384,27 @@ isSizeConstraint Closure{ clValue = ValueCmp _ s _ _ } = isJust <$> isSizeType s isSizeConstraint _ = return False +-- | Take out all size constraints (DANGER!).+takeSizeConstraints :: TCM [Closure Constraint]+takeSizeConstraints = do+ test <- isSizeTypeTest+ let sizeConstraint :: Closure Constraint -> Bool+ sizeConstraint cl@Closure{ clValue = ValueCmp CmpLeq s _ _ }+ | isJust (test $ unEl s) = True+ sizeConstraint _ = False+ cs <- filter sizeConstraint . map theConstraint <$> getAllConstraints+ dropConstraints $ sizeConstraint . theConstraint+ return cs+ -- | Find the size constraints. getSizeConstraints :: TCM [Closure Constraint] getSizeConstraints = do test <- isSizeTypeTest- let sizeConstraint cl@Closure{ clValue = ValueCmp CmpLeq s _ _ }- | isJust (test $ unEl s) = Just cl- sizeConstraint _ = Nothing- mapMaybe (sizeConstraint . theConstraint) <$> getAllConstraints+ let sizeConstraint :: Closure Constraint -> Bool+ sizeConstraint cl@Closure{ clValue = ValueCmp CmpLeq s _ _ }+ | isJust (test $ unEl s) = True+ sizeConstraint _ = False+ filter sizeConstraint . map theConstraint <$> getAllConstraints -- | Return a list of size metas and their context. getSizeMetas :: Bool -> TCM [(MetaId, Type, Telescope)]@@ -524,17 +562,17 @@ case (a,b) of (Rigid{}, Rigid{}) -> return c (SizeMeta m xs, Rigid i) -> do- j <- findIndex (==i) xs+ j <- List.findIndex (==i) xs return $ Leq (SizeMeta m [0..size xs-1]) n (Rigid j) (Rigid i, SizeMeta m xs) -> do- j <- findIndex (==i) xs+ j <- List.findIndex (==i) xs return $ Leq (Rigid j) n (SizeMeta m [0..size xs-1]) (SizeMeta m xs, SizeMeta l ys) -- try to invert xs on ys- | Just ys' <- mapM (\ y -> findIndex (==y) xs) ys ->+ | Just ys' <- mapM (\ y -> List.findIndex (==y) xs) ys -> return $ Leq (SizeMeta m [0..size xs-1]) n (SizeMeta l ys') -- try to invert ys on xs- | Just xs' <- mapM (\ x -> findIndex (==x) ys) xs ->+ | Just xs' <- mapM (\ x -> List.findIndex (==x) ys) xs -> return $ Leq (SizeMeta m xs') n (SizeMeta l [0..size ys-1]) -- give up | otherwise -> Nothing@@ -562,7 +600,7 @@ -- Size metas in constraints. metas0 :: [(MetaId, Int)] -- meta id + arity- metas0 = nub $ map (mapSnd length) $ concatMap flexibleVariables cs+ metas0 = List.nub $ map (mapSnd length) $ concatMap flexibleVariables cs -- Unconstrained size metas that do not occur in constraints. metas1 :: [(MetaId, Int)]
src/full/Agda/TypeChecking/SizedTypes/Solve.hs view
@@ -1,6 +1,5 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE NondecreasingIndentation #-}-{-# LANGUAGE ScopedTypeVariables #-} -- | Solving size constraints under hypotheses. --@@ -103,12 +102,12 @@ import Agda.Utils.Maybe import Agda.Utils.Monad import Agda.Utils.Null+import Agda.Utils.Pretty (Pretty, prettyShow)+import qualified Agda.Utils.Pretty as P import Agda.Utils.Size import Agda.Utils.Tuple import qualified Agda.Utils.VarSet as VarSet -import qualified Agda.Utils.Either as Either- #include "undefined.h" import Agda.Utils.Impossible @@ -125,9 +124,10 @@ solveSizeConstraints :: DefaultToInfty -> TCM () solveSizeConstraints flag = do - -- 1. Get the constraints normalised.+ -- 1. Take out the size constraints normalised. - cs0 <- mapM (mapClosure normalise) =<< S.getSizeConstraints+ cs0 <- mapM (mapClosure normalise) =<< S.takeSizeConstraints+ -- NOTE: this deletes the size constraints from the constraint set! unless (null cs0) $ reportSDoc "tc.size.solve" 40 $ vcat $ [ text $ "Solving constraints (" ++ show flag ++ ")"@@ -215,6 +215,8 @@ -- forM_ cs0 $ \ cl -> enterClosure cl solveConstraint -- 5. Make sure we did not lose any constraints.++ -- This is necessary since we have removed the size constraints. forM_ cs0 $ \ cl -> enterClosure cl solveConstraint @@ -341,7 +343,7 @@ -- Check that all the free variables of the constraint are contained in -- coveredVars. -- We ignore the free variables occurring in sorts.- guard $ getAll $ runFree (\ (i, _) -> All $ i `VarSet.member` coveredVars) IgnoreAll c+ guard $ getAll $ runFree (All . (`VarSet.member` coveredVars)) IgnoreAll c -- Turn cand into a substitution. -- Since we ignored the free variables in sorts, we better patch up -- the substitution with some dummy term (Sort Prop) rather than __IMPOSSIBLE__.@@ -493,10 +495,10 @@ -- Running the solver once might result in unsolvable left-over constraints. -- We need to iterate the solver to detect this. sol :: Solution NamedRigid Int <- either err return $- iterateSolver Map.empty hg csF Map.empty+ iterateSolver Map.empty hg csF emptySolution -- Convert solution to meta instantiation.- forM_ (Map.assocs sol) $ \ (m, a) -> do+ forM_ (Map.assocs $ theSolution sol) $ \ (m, a) -> do unless (validOffset a) __IMPOSSIBLE__ -- Solution does not contain metas u <- unSizeExpr $ fmap __IMPOSSIBLE__ a@@ -516,7 +518,8 @@ [ text $ " xs = " ++ show xs , text $ " u = " ++ show u ]- assignMeta n x t xs u+ unlessM (isFrozen x) $+ assignMeta n x t xs u -- WRONG: -- let partialSubst = List.sort $ zip xs $ map var $ downFrom n -- assignMeta' n x t (length xs) partialSubst u@@ -529,7 +532,7 @@ -- ms = unsolved size metas from cluster let ms = Set.fromList (map sizeMetaId metas) Set.\\ -- Some CPP or ghc does not like trailing backslash, thus, this comment!- Set.mapMonotonic MetaId (Map.keysSet sol)+ Set.mapMonotonic MetaId (Map.keysSet $ theSolution sol) -- Make sure they do not contain an interaction point let noIP = Set.null $ Set.intersection ims ms @@ -552,7 +555,7 @@ reportSDoc "tc.size.solve" 30 $ prettyTCM (MetaV m []) <+> text "is frozen, cannot set it to ∞" return False- ifM (isFrozen m) no $ {-else-} do+ ifM (isFrozen m `or2M` do not <$> asks envAssignMetas) no $ {-else-} do reportSDoc "tc.size.solve" 20 $ text "solution " <+> prettyTCM (MetaV m []) <+> text " := " <+> prettyTCM inf@@ -582,7 +585,7 @@ forM (zip [0..] gamma) $ \ (i, ce) -> do -- Get name and type of variable i. let xt = unDom $ ctxEntry ce- x = show $ fst xt+ x = prettyShow $ fst xt t <- reduce . raise (1 + i) . unEl . snd $ xt case ignoreSharing t of Def d [Apply u] | d == sizelt -> do@@ -656,11 +659,11 @@ data NamedRigid = NamedRigid { rigidName :: String -- ^ Name for printing in debug messages. , rigidIndex :: Int -- ^ De Bruijn index.- }+ } deriving (Show) instance Eq NamedRigid where (==) = (==) `on` rigidIndex instance Ord NamedRigid where compare = compare `on` rigidIndex-instance Show NamedRigid where show = rigidName+instance Pretty NamedRigid where pretty = P.text . rigidName instance Plus NamedRigid Int NamedRigid where plus (NamedRigid x i) j = NamedRigid x (i + j) @@ -671,14 +674,14 @@ -- , sizeMetaPerm :: Permutation -- ^ Permutation from the current context -- -- to the context of the meta. , sizeMetaArgs :: [Int] -- ^ De Bruijn indices.- }+ } deriving (Show) -- | An equality which ignores the meta arguments. instance Eq SizeMeta where (==) = (==) `on` sizeMetaId -- | An order which ignores the meta arguments. instance Ord SizeMeta where compare = compare `on` sizeMetaId -instance Show SizeMeta where show = show . sizeMetaId+instance Pretty SizeMeta where pretty = P.pretty . sizeMetaId instance PrettyTCM SizeMeta where prettyTCM (SizeMeta x es) = prettyTCM (MetaV x $ map (Apply . defaultArg . var) es)@@ -721,7 +724,7 @@ prettyTCM (Constraint a cmp b) = do u <- unSizeExpr a v <- unSizeExpr b- prettyTCM u <+> text (show cmp) <+> prettyTCM v+ prettyTCM u <+> pretty cmp <+> prettyTCM v -- | Size constraint with de Bruijn indices. data HypSizeConstraint = HypSizeConstraint@@ -778,7 +781,7 @@ SizeInf -> return $ Just Infty SizeSuc u -> fmap (`plus` (1 :: Offset)) <$> sizeExpr u OtherSize u -> case ignoreSharing u of- Var i [] -> (\ x -> Just $ Rigid (NamedRigid x i) 0) . show <$> nameOfBV i+ Var i [] -> (\ x -> Just $ Rigid (NamedRigid x i) 0) . prettyShow <$> nameOfBV i -- MetaV m es -> return $ Just $ Flex (SizeMeta m es) 0 MetaV m es | Just xs <- mapM isVar es, List.fastDistinct xs -> return $ Just $ Flex (SizeMeta m xs) 0
src/full/Agda/TypeChecking/SizedTypes/Syntax.hs view
@@ -6,6 +6,9 @@ module Agda.TypeChecking.SizedTypes.Syntax where +import Prelude hiding (null)++import Data.Maybe import Data.Foldable (Foldable) import Data.Map (Map) import qualified Data.Map as Map@@ -15,15 +18,23 @@ import Agda.TypeChecking.SizedTypes.Utils +import Agda.Utils.Functor+import Agda.Utils.Null+import Agda.Utils.Pretty+ -- * Syntax -- | Constant finite sizes @n >= 0@. newtype Offset = O Int deriving (Eq, Ord, Num, Enum) +-- This Show instance is ok because of the Enum constraint. instance Show Offset where show (O n) = show n +instance Pretty Offset where+ pretty (O n) = pretty n+ instance MeetSemiLattice Offset where meet = min @@ -34,21 +45,29 @@ newtype Rigid = RigidId { rigidId :: String } deriving (Eq, Ord) -instance Show Rigid where show = rigidId+instance Show Rigid where+ show (RigidId s) = "RigidId " ++ show s +instance Pretty Rigid where+ pretty = text . rigidId+ -- | Size meta variables @X@ to solve for. newtype Flex = FlexId { flexId :: String } deriving (Eq, Ord) -instance Show Flex where show = flexId+instance Show Flex where+ show (FlexId s) = "FlexId " ++ show s +instance Pretty Flex where+ pretty = text . flexId+ -- | Size expressions appearing in constraints. data SizeExpr' rigid flex = Const { offset :: Offset } -- ^ Constant number @n@. | Rigid { rigid :: rigid, offset :: Offset } -- ^ Variable plus offset @i + n@. | Infty -- ^ Infinity @∞@. | Flex { flex :: flex, offset :: Offset } -- ^ Meta variable @X + n@.- deriving (Eq, Ord, Functor, Foldable, Traversable)+ deriving (Show, Eq, Ord, Functor, Foldable, Traversable) type SizeExpr = SizeExpr' Rigid Flex @@ -56,7 +75,7 @@ data Cmp = Lt -- ^ @<@. | Le -- ^ @≤@.- deriving (Eq, Bounded, Enum)+ deriving (Show, Eq, Bounded, Enum) instance Dioid Cmp where compose = min@@ -81,7 +100,7 @@ , cmp :: Cmp , rightExpr :: SizeExpr' rigid flex }- deriving (Functor, Foldable, Traversable)+ deriving (Show, Functor, Foldable, Traversable) type Constraint = Constraint' Rigid Flex @@ -112,18 +131,24 @@ ------------------------------------------------------------------------ -- | Partial substitution from flexible variables to size expression.-type Solution rigid flex = Map flex (SizeExpr' rigid flex)+newtype Solution rigid flex = Solution { theSolution :: Map flex (SizeExpr' rigid flex) }+ deriving (Show, Null) --- emptySolution = Map.empty+instance (Pretty r, Pretty f) => Pretty (Solution r f) where+ pretty (Solution sol) = prettyList $ for (Map.toList sol) $ \ (x, e) ->+ pretty x <+> text ":=" <+> pretty e +emptySolution :: Solution r f+emptySolution = Solution Map.empty+ -- | Executing a substitution. class Substitute r f a where subst :: Solution r f -> a -> a instance Ord f => Substitute r f (SizeExpr' r f) where- subst sol e =+ subst (Solution sol) e = case e of- Flex x n -> Map.findWithDefault e x sol `plus` n+ Flex x n -> maybe e (`plus` n) $ Map.lookup x sol _ -> e instance Ord f => Substitute r f (Constraint' r f) where@@ -135,6 +160,9 @@ instance Substitute r f a => Substitute r f (Map k a) where subst = fmap . subst +instance Ord f => Substitute r f (Solution r f) where+ subst s = Solution . subst s . theSolution+ -- | Add offset to size expression. instance Plus (SizeExpr' r f) Offset (SizeExpr' r f) where plus e m =@@ -149,9 +177,9 @@ type CTrans r f = Constraint' r f -> Either String [Constraint' r f] -- | Returns an error message if we have a contradictory constraint.-simplify1 :: (Show f, Show r, Eq r) => CTrans r f -> CTrans r f+simplify1 :: (Pretty f, Pretty r, Eq r) => CTrans r f -> CTrans r f simplify1 test c = do- let err = Left $ "size constraint " ++ show c ++ " is inconsistent"+ let err = Left $ "size constraint " ++ prettyShow c ++ " is inconsistent" case c of -- rhs is Infty Constraint a Le Infty -> return []@@ -212,27 +240,27 @@ -- * Printing -instance (Show r, Show f) => Show (SizeExpr' r f) where- show (Const n) = show n- show (Infty) = "∞"- show (Rigid i 0) = show i- show (Rigid i n) = show i ++ "+" ++ show n- show (Flex x 0) = show x- show (Flex x n) = show x ++ "+" ++ show n+instance (Pretty r, Pretty f) => Pretty (SizeExpr' r f) where+ pretty (Const n) = pretty n+ pretty (Infty) = text "∞"+ pretty (Rigid i 0) = pretty i+ pretty (Rigid i n) = pretty i <> text ("+" ++ show n)+ pretty (Flex x 0) = pretty x+ pretty (Flex x n) = pretty x <> text ("+" ++ show n) -instance Show Polarity where- show Least = "-"- show Greatest = "+"+instance Pretty Polarity where+ pretty Least = text "-"+ pretty Greatest = text "+" -instance Show flex => Show (PolarityAssignment flex) where- show (PolarityAssignment pol flex) = show pol ++ show flex+instance Pretty flex => Pretty (PolarityAssignment flex) where+ pretty (PolarityAssignment pol flex) = pretty pol <> pretty flex -instance Show Cmp where- show Le = "≤"- show Lt = "<"+instance Pretty Cmp where+ pretty Le = text "≤"+ pretty Lt = text "<" -instance (Show r, Show f) => Show (Constraint' r f) where- show (Constraint a cmp b) = show a ++ " " ++ show cmp ++ " " ++ show b+instance (Pretty r, Pretty f) => Pretty (Constraint' r f) where+ pretty (Constraint a cmp b) = pretty a <+> pretty cmp <+> pretty b -- * Wellformedness
src/full/Agda/TypeChecking/SizedTypes/Utils.hs view
@@ -2,14 +2,21 @@ module Agda.TypeChecking.SizedTypes.Utils where import Control.Applicative+import Data.IORef import qualified Debug.Trace as Debug+import System.IO.Unsafe+ import Agda.Utils.Function -debug :: Bool-debug = False+{-# NOINLINE debug #-}+debug :: IORef Bool+debug = unsafePerformIO $ newIORef False +setDebugging :: Bool -> IO ()+setDebugging = writeIORef debug+ trace :: String -> a -> a-trace s = applyWhen debug $ Debug.trace s+trace s = applyWhen (unsafePerformIO $ readIORef debug) $ Debug.trace s traceM :: Applicative f => String -> f () traceM s = trace s $ pure ()
src/full/Agda/TypeChecking/SizedTypes/WarshallSolver.hs view
@@ -1,22 +1,20 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE NoMonomorphismRestriction #-}-{-# LANGUAGE ScopedTypeVariables #-} module Agda.TypeChecking.SizedTypes.WarshallSolver where -import Prelude hiding (truncate)+import Prelude hiding (null, truncate) -import Control.Applicative hiding (Const)+import Control.Applicative hiding (Const, empty) import Control.Monad import Data.Function (on)-import Data.List as List+import qualified Data.List as List import Data.Maybe import Data.Set (Set) import qualified Data.Set as Set import Data.Map (Map) import qualified Data.Map as Map-import Data.Traversable (for) import Agda.TypeChecking.SizedTypes.Syntax import Agda.TypeChecking.SizedTypes.Utils@@ -26,6 +24,10 @@ -- (Edge'(..), allNodes, emptyGraph, insertEdge, graphToList, graphFromList, nodes, lookupEdge, outgoing, incoming, diagonal, transClos) import qualified Agda.Utils.Graph.AdjacencyMap.Unidirectional as Graph +import Agda.Utils.Functor+import Agda.Utils.Null+import Agda.Utils.Pretty+ #include "undefined.h" import Agda.Utils.Impossible @@ -93,11 +95,11 @@ data Weight = Offset Offset | Infinity- deriving (Eq)+ deriving (Eq, Show) -instance Show Weight where- show (Offset x) = show x- show Infinity = "∞"+instance Pretty Weight where+ pretty (Offset x) = pretty x+ pretty Infinity = text "∞" instance Ord Weight where x <= Infinity = True@@ -167,6 +169,7 @@ data Label = Label { lcmp :: Cmp, loffset :: Offset } | LInf -- ^ Nodes not connected.+ deriving (Show) -- | Convert a label to a weight, decrementing in case of 'Lt'.@@ -191,9 +194,9 @@ _ <= LInf = True LInf{} <= Label{} = False -instance Show Label where- show (Label cmp w) = show cmp ++ show w- show LInf = "∞"+instance Pretty Label where+ pretty (Label cmp w) = pretty cmp <> pretty w+ pretty LInf = text "∞" instance MeetSemiLattice Label where -- one label is neutral@@ -232,13 +235,13 @@ | NodeInfty | NodeRigid rigid | NodeFlex flex- deriving (Eq, Ord)+ deriving (Show, Eq, Ord) -instance (Show rigid, Show flex) => Show (Node rigid flex) where- show NodeZero = "0"- show NodeInfty = "∞"- show (NodeRigid x) = show x- show (NodeFlex x) = show x+instance (Pretty rigid, Pretty flex) => Pretty (Node rigid flex) where+ pretty NodeZero = text "0"+ pretty NodeInfty = text "∞"+ pretty (NodeRigid x) = pretty x+ pretty (NodeFlex x) = pretty x isFlexNode :: Node rigid flex -> Maybe flex isFlexNode (NodeFlex x) = Just x@@ -300,7 +303,7 @@ mentions NodeZero gs = ([], gs) mentions NodeInfty gs = ([], gs) mentions NodeRigid{} gs = ([], gs)-mentions n gs = partition (Set.member n . nodes) gs+mentions n gs = List.partition (Set.member n . nodes) gs -- | Add an edge to a graph forest. -- Graphs that share a node with the edge are joined.@@ -327,7 +330,7 @@ -- UNUSED -- -- | Reflexive-transitive closure.--- complete :: (Show a, Dioid a) => Graph r f a -> Graph r f a+-- complete :: (Pretty a, Dioid a) => Graph r f a -> Graph r f a -- complete = transClos . reflClos -- | A graph is 'negative' if it contains a negative loop (diagonal edge).@@ -344,7 +347,7 @@ -- -- Application: Constraint implication: Constraints are compatible -- with hypotheses.-implies :: (Ord r, Ord f, Show r, Show f, Show a, Top a, Ord a, Negative a)+implies :: (Ord r, Ord f, Pretty r, Pretty f, Pretty a, Top a, Ord a, Negative a) => Graph r f a -> Graph r f a -> Bool -- iterate 'test' over all edges in g implies h g = and $ map test $ graphToList g@@ -361,7 +364,7 @@ | otherwise = case lookupEdge h src dest of Nothing -> False Just l' -> if l' <= l then True else- trace ("edge " ++ show (l <$ k) ++ " not implied by " ++ show (l' <$ k)) $+ trace ("edge " ++ prettyShow (l <$ k) ++ " not implied by " ++ prettyShow (l' <$ k)) $ False -- implies h g = Map.foldlWithKey (\ b k l -> test k l && b) True g -- -- NB: doing the @test k l@ before the recursive @b@ gives@@ -410,7 +413,7 @@ -- get all the flexibles mentioned in constraints xs = Set.toList $ flexs cs -- for each flexible X, add edges 0 <= X and X <= oo- fedges = concat $ for xs $ \ x ->+ fedges = concat $ forM xs $ \ x -> [ Edge NodeZero (NodeFlex x) (Label Le 0) , Edge (NodeFlex x) NodeInfty (Label Le 0) ]@@ -424,7 +427,7 @@ type Hyp' = Constraint' type HypGraph r f = Graph r f Label -hypGraph :: (Ord rigid, Ord flex, Show rigid, Show flex) =>+hypGraph :: (Ord rigid, Ord flex, Pretty rigid, Pretty flex) => Set rigid -> [Hyp' rigid flex] -> Either String (HypGraph rigid flex) hypGraph is hyps0 = do -- get a list of hypothesis from a list of constraints@@ -443,7 +446,7 @@ | Just l <- lookupEdge hg n1 n2 = l | otherwise = top -simplifyWithHypotheses :: (Ord rigid, Ord flex, Show rigid, Show flex) =>+simplifyWithHypotheses :: (Ord rigid, Ord flex, Pretty rigid, Pretty flex) => HypGraph rigid flex -> [Constraint' rigid flex] -> Either String [Constraint' rigid flex] simplifyWithHypotheses hg cons = concat <$> mapM (simplify1 test) cons where@@ -455,7 +458,7 @@ l' = hypConn hg n1 n2 -- l' <- lookupEdge hg n1 n2 unless (l' <= l) $ Left $- "size constraint " ++ show c ++ " not consistent with size hypotheses"+ "size constraint " ++ prettyShow c ++ " not consistent with size hypotheses" return [c] -- if (l' <= l) then Just [c] else Nothing @@ -464,13 +467,16 @@ type ConGraph r f = Graph r f Label -constraintGraph :: (Ord r, Ord f, Show r, Show f) => [Constraint' r f] -> HypGraph r f -> Either String (ConGraph r f)+constraintGraph :: (Ord r, Ord f, Pretty r, Pretty f) => [Constraint' r f] -> HypGraph r f -> Either String (ConGraph r f) constraintGraph cons0 hg = do+ traceM $ "original constraints cons0 = " ++ prettyShow cons0 -- Simplify constraints, ensure they are locally consistent with -- hypotheses. cons <- simplifyWithHypotheses hg cons0+ traceM $ "simplified constraints cons = " ++ prettyShow cons -- Build a transitive graph from constraints. let g = transClos $ graphFromConstraints cons+ traceM $ "transitive graph g = " ++ prettyShow (graphToList g) -- Ensure it has no negative loops. when (negative g) $ Left $ "size constraint graph has negative loops"@@ -481,24 +487,24 @@ type ConGraphs r f = Graphs r f Label -constraintGraphs :: (Ord r, Ord f, Show r, Show f) => [Constraint' r f] -> HypGraph r f -> Either String ([f], ConGraphs r f)+constraintGraphs :: (Ord r, Ord f, Pretty r, Pretty f) => [Constraint' r f] -> HypGraph r f -> Either String ([f], ConGraphs r f) constraintGraphs cons0 hg = do- traceM $ "original constraints cons0 = " ++ show cons0+ traceM $ "original constraints cons0 = " ++ prettyShow cons0 -- Simplify constraints, ensure they are locally consistent with -- hypotheses. cons <- simplifyWithHypotheses hg cons0- traceM $ "simplified constraints cons = " ++ show cons+ traceM $ "simplified constraints cons = " ++ prettyShow cons -- Build a transitive graph forest from constraints. let gs0 = graphsFromConstraints cons- traceM $ "constraint forest gs0 = " ++ show (map graphToList gs0)+ traceM $ "constraint forest gs0 = " ++ prettyShow (map graphToList gs0) let gs1 = map transClos gs0- traceM $ "transitive forest gs1 = " ++ show (map graphToList gs1)+ traceM $ "transitive forest gs1 = " ++ prettyShow (map graphToList gs1) -- Check for flexibles to be set to infinity let (xss,gs) = unzip $ map infinityFlexs gs1 xs = concat xss unless (null xs) $ do- traceM $ "flexibles to set to oo = " ++ show xs- traceM $ "forest after oo-subst = " ++ show (map graphToList gs)+ traceM $ "flexibles to set to oo = " ++ prettyShow xs+ traceM $ "forest after oo-subst = " ++ prettyShow (map graphToList gs) -- Ensure none has negative loops. when (negative gs) $ Left $ "size constraint graph has negative loop" traceM $ "we are free of negative loops"@@ -664,24 +670,33 @@ intersectAll (m:ms) = foldl (Map.intersectionWith (++)) m ms -- | Compute the sup of two different rigids or a rigid and a constant.-lub' :: forall r f . (Ord r, Ord f, Show r, Show f) =>- HypGraph r f -> (Node r f, Offset) -> (Node r f, Offset) -> Maybe (SizeExpr' r f)+lub'+ :: forall r f . (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f)+ => HypGraph r f+ -> (Node r f, Offset)+ -> (Node r f, Offset)+ -> Maybe (SizeExpr' r f) lub' hg (node1, n) (node2, m) = do let sucs = commonSuccs hg [node1, node2] sucNodes = smallest hg $ Map.keys sucs- traceM ("lub': sucs = " ++ show sucs)+ traceM ("lub': sucs = " ++ show sucs) -- FIXME: prettyShow case sucNodes of -- there is a unique smallest common successor n0 of node1 and node2- [n0] ->+ [n0] -> do -- then there are exactly two edges node1 --l1--> n0 and node2 --l2--> n0- -- with non-positive weigths l1, l2- case Map.lookup n0 sucs of- Just [ Edge node1' n1 l1- , Edge node2' n2 l2- ] | node1 == node1', node2 == node2'- , n0 == n1, n0 == n2- , toWeight l1 <= 0- , toWeight l2 <= 0 -> do+ -- Andreas, 2017-04-28, issue #2558: The following invariant does not hold always+ -- -- with non-positive weights l1, l2+ let es = fromMaybe __IMPOSSIBLE__ $ Map.lookup n0 sucs+ case es of+ [ Edge node1x n1 l1 ,+ Edge node2x n2 l2 ] -> do+ unless (n0 == n1) __IMPOSSIBLE__+ unless (n0 == n2) __IMPOSSIBLE__+ unless (node1 == node1x) __IMPOSSIBLE__+ unless (node2 == node2x) __IMPOSSIBLE__+ -- Andreas, 2017-04-28, issue #2558: The following invariant does not hold always+ -- unless (toWeight l1 <= 0) __IMPOSSIBLE__+ -- unless (toWeight l2 <= 0) __IMPOSSIBLE__ let o :: Weight o = max (n `plus` toWeight l1) (m `plus` toWeight l2) return $ nodeToSizeExpr n0 `plus` o@@ -690,27 +705,37 @@ _ -> do let a1 :: SizeExpr' r f = nodeToSizeExpr node1 `plus` n let a2 :: SizeExpr' r f = nodeToSizeExpr node2 `plus` m- traceM ("cannot compute lub of " ++ show a1 ++ " and " ++ show a2 ++ " because sucNodes = " ++ show sucNodes)+ traceM ("cannot compute lub of " ++ prettyShow a1 ++ " and " ++ prettyShow a2 ++ " because sucNodes = " ++ prettyShow sucNodes) Nothing -- | Compute the inf of two different rigids or a rigid and a constant.-glb' :: forall r f . (Ord r, Ord f, Show r, Show f) => HypGraph r f -> (Node r f, Offset) -> (Node r f, Offset) -> Maybe (SizeExpr' r f)+glb'+ :: forall r f . (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f)+ => HypGraph r f+ -> (Node r f, Offset)+ -> (Node r f, Offset)+ -> Maybe (SizeExpr' r f) glb' hg (node1, n) (node2, m) = do let preds = commonPreds hg [node1, node2] predNodes = largest hg $ Map.keys preds- traceM ("glb': preds = " ++ show preds)+ traceM ("glb': preds = " ++ show preds) -- FIXME: prettyShow case predNodes of -- there is a unique greatest common predecessor n0 of node1 and node2- [n0] ->+ [n0] -> do -- then there are exactly two edges n0 --l1--> node1 and n0 --l2--> node2- -- with non-positive weigths l1, l2- case Map.lookup n0 preds of- Just [ Edge n1 node1' l1- , Edge n2 node2' l2- ] | node1 == node1', node2 == node2'- , n0 == n1, n0 == n2- , toWeight l1 <= 0- , toWeight l2 <= 0 -> do+ -- Andreas, 2017-04-28, issue #2558: The following invariant may not hold always+ -- -- with non-positive weigths l1, l2+ let es = fromMaybe __IMPOSSIBLE__ $ Map.lookup n0 preds+ case es of+ [ Edge n1 node1x l1 ,+ Edge n2 node2x l2] -> do+ unless (n0 == n1) __IMPOSSIBLE__+ unless (n0 == n2) __IMPOSSIBLE__+ unless (node1 == node1x) __IMPOSSIBLE__+ unless (node2 == node2x) __IMPOSSIBLE__+ -- Andreas, 2017-04-28, issue #2558: The following invariant may not hold always+ -- unless (toWeight l1 <= 0) __IMPOSSIBLE__+ -- unless (toWeight l2 <= 0) __IMPOSSIBLE__ let o :: Weight o = max (n `plus` toWeight l1) (m `plus` toWeight l2) return $ nodeToSizeExpr n0 `plus` o@@ -719,11 +744,16 @@ _ -> do let a1 :: SizeExpr' r f = nodeToSizeExpr node1 `plus` n let a2 :: SizeExpr' r f = nodeToSizeExpr node2 `plus` m- traceM ("cannot compute glb of " ++ show a1 ++ " and " ++ show a2 ++ " because predNodes = " ++ show predNodes)+ traceM ("cannot compute glb of " ++ prettyShow a1 ++ " and " ++ prettyShow a2 ++ " because predNodes = " ++ prettyShow predNodes) Nothing -- | Compute the least upper bound (sup).-lub :: (Ord r, Ord f, Show r, Show f) => HypGraph r f -> (SizeExpr' r f) -> (SizeExpr' r f) -> Maybe (SizeExpr' r f)+lub+ :: (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f)+ => HypGraph r f+ -> SizeExpr' r f+ -> SizeExpr' r f+ -> Maybe (SizeExpr' r f) lub hg a1 a2 = case (a1, a2) of (Flex{}, _) -> __IMPOSSIBLE__@@ -754,7 +784,12 @@ -- | Compute the greatest lower bound (inf) of size expressions relative -- to a hypotheses graph.-glb :: (Ord r, Ord f, Show r, Show f) => HypGraph r f -> (SizeExpr' r f) -> (SizeExpr' r f) -> Maybe (SizeExpr' r f)+glb+ :: (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f)+ => HypGraph r f+ -> SizeExpr' r f+ -> SizeExpr' r f+ -> Maybe (SizeExpr' r f) glb hg a1 a2 = case (a1, a2) of (Flex{}, _) -> __IMPOSSIBLE__@@ -791,7 +826,7 @@ srcj = Set.fromList $ map src lbj srcs = Set.intersection srci srcj -}- _ -> trace ("cannot compute glb of " ++ show a1 ++ " and " ++ show a2) $+ _ -> trace ("cannot compute glb of " ++ prettyShow a1 ++ " and " ++ prettyShow a2) $ Nothing -- TODO! -} @@ -805,23 +840,28 @@ Infinity -> Nothing Offset o -> if o <= m then Just (n, o) else Nothing | otherwise = __IMPOSSIBLE__- -- error $ "findRigidBelow: impossible: " ++ show e+ -- error $ "findRigidBelow: impossible: " ++ prettyShow e cands = mapMaybe filt preds (n, o) <- do case cands of [] -> Nothing [c] -> return c _ -> return $- maximumBy (compare `on` snd) $+ List.maximumBy (compare `on` snd) $ filter ((NodeZero /=) . fst) cands let offset = m - o unless (offset >= 0) __IMPOSSIBLE__ return $ nodeToSizeExpr n `plus` offset findRigidBelow hg e = __IMPOSSIBLE__- -- error $ "findRigidBelow: impossible: " ++ show e+ -- error $ "findRigidBelow: impossible: " ++ prettyShow e -solveGraph :: (Ord r, Ord f, Show r, Show f) => Polarities f -> HypGraph r f -> ConGraph r f -> Either String (Solution r f)+solveGraph+ :: (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f)+ => Polarities f+ -> HypGraph r f+ -> ConGraph r f+ -> Either String (Solution r f) solveGraph pols hg g = do let (Bounds lbs ubs fs) = bounds g -- flexibles to solve for@@ -832,15 +872,15 @@ -- get lower and upper bounds for flexible x let lx = Set.toList $ Map.findWithDefault Set.empty x lbs ux = Set.toList $ Map.findWithDefault Set.empty x ubs- traceM ("lower bounds for " ++ show x ++ ": " ++ show lx)- traceM ("upper bounds for " ++ show x ++ ": " ++ show ux)+ traceM ("lower bounds for " ++ prettyShow x ++ ": " ++ prettyShow lx)+ traceM ("upper bounds for " ++ prettyShow x ++ ": " ++ prettyShow ux) -- compute maximum of lower bounds lb <- do case lx of [] -> return $ Nothing (a:as) -> do case foldM (lub hg) a as of- Nothing -> Left $ "inconsistent lower bound for " ++ show x+ Nothing -> Left $ "inconsistent lower bound for " ++ prettyShow x Just l -> return $ Just $ truncateOffset l -- compute minimum of upper bounds ub <- do@@ -850,35 +890,46 @@ case foldM (glb hg) a as of Just l | validOffset l -> return $ Just l | Just l' <- findRigidBelow hg l -> return $ Just l'- _ -> Left $ "inconsistent upper bound for " ++ show x+ _ -> Left $ "inconsistent upper bound for " ++ prettyShow x case (lb, ub) of (Just l, Nothing) -> return $ Just (x, l) -- solve x = lower bound (Nothing, Just u) -> return $ Just (x, u) -- solve x = upper bound (Just l, Just u) -> do- traceM ("lower bound for " ++ show x ++ ": " ++ show l)- traceM ("upper bound for " ++ show x ++ ": " ++ show u)+ traceM ("lower bound for " ++ prettyShow x ++ ": " ++ prettyShow l)+ traceM ("upper bound for " ++ prettyShow x ++ ": " ++ prettyShow u) case getPolarity pols x of Least -> return $ Just (x, l) Greatest -> return $ Just (x, u) _ -> return Nothing- return $ Map.fromList xas+ return $ Solution $ Map.fromList xas -- | Solve a forest of constraint graphs relative to a hypotheses graph. -- Concatenate individual solutions.-solveGraphs :: (Ord r, Ord f, Show r, Show f) => Polarities f -> HypGraph r f -> ConGraphs r f -> Either String (Solution r f)-solveGraphs pols hg gs = Map.unions <$> mapM (solveGraph pols hg) gs+solveGraphs+ :: (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f)+ => Polarities f+ -> HypGraph r f+ -> ConGraphs r f+ -> Either String (Solution r f)+solveGraphs pols hg gs =+ Solution . Map.unions <$> mapM (theSolution <.> solveGraph pols hg) gs -- * Verify solution -- | Check that after substitution of the solution, -- constraints are implied by hypotheses.-verifySolution :: (Ord r, Ord f, Show r, Show f) => HypGraph r f -> [Constraint' r f] -> Solution r f -> Either String ()+verifySolution+ :: (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f)+ => HypGraph r f+ -> [Constraint' r f]+ -> Solution r f+ -> Either String () verifySolution hg cs sol = do cs <- return $ subst sol cs- traceM $ "substituted constraints " ++ show cs+ traceM $ "substituted constraints " ++ prettyShow cs cs <- -- maybe (Left "solution produces inconsistency") Right $ concat <$> mapM (simplify1 $ \ c -> return [c]) cs- traceM $ "simplified substituted constraints " ++ show cs+ traceM $ "simplified substituted constraints " ++ prettyShow cs -- cs <- maybe (Left "solution produces inconsistency") Right $ -- simplifyWithHypotheses hg cs let g = graphFromConstraints cs@@ -888,7 +939,7 @@ case simplifyWithHypotheses hg $ subst sol cs of Nothing -> Left "solution produces inconsistency" Just [] -> Right ()- Just cs -> Left $ "solution leaves constraints " ++ show cs+ Just cs -> Left $ "solution leaves constraints " ++ prettyShow cs -} -- | Iterate solver until no more metas can be solved.@@ -897,7 +948,7 @@ -- which would otherwise go unnoticed. iterateSolver- :: (Ord r, Ord f, Show r, Show f)+ :: (Ord r, Ord f, Pretty r, Pretty f, Show r, Show f) => Polarities f -- ^ Meta variable polarities (prefer lower or upper solution?). -> HypGraph r f@@ -912,8 +963,11 @@ iterateSolver pols hg cs sol0 = do g <- constraintGraph cs hg sol <- solveGraph pols hg g- if Map.null sol then return sol0 else- iterateSolver pols hg (subst sol cs) (Map.unionWith __IMPOSSIBLE__ sol $ subst sol sol0)+ traceM $ "(partial) solution " ++ prettyShow sol+ if null sol then return sol0 else+ iterateSolver pols hg (subst sol cs) $ Solution $+ Map.unionWith __IMPOSSIBLE__ (theSolution sol) $+ theSolution $ subst sol sol0 -- * Tests @@ -935,7 +989,7 @@ ] -- testLub = smallest hg $ Map.keys $ commonSuccs hg [n1,n2] ---testLub :: (Show f, Ord f) => Maybe (SizeExpr' [Char] f)+testLub :: (Pretty f, Ord f, Show f) => Maybe (SizeExpr' [Char] f) testLub = lub hg (Rigid "i" 0) (Rigid "j" 2) where n1 = NodeRigid "i"
src/full/Agda/TypeChecking/Substitute.hs view
@@ -1,7 +1,6 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE UndecidableInstances #-} #if __GLASGOW_HASKELL__ <= 708 {-# LANGUAGE OverlappingInstances #-}@@ -9,6 +8,13 @@ {-# OPTIONS_GHC -fno-warn-orphans #-} +-- | This module contains the definition of hereditary substitution+-- and application operating on internal syntax which is in β-normal+-- form (β including projection reductions).+--+-- Further, it contains auxiliary functions which rely on substitution+-- but not on reduction.+ module Agda.TypeChecking.Substitute ( module Agda.TypeChecking.Substitute , module Agda.TypeChecking.Substitute.Class@@ -19,7 +25,6 @@ import Control.Applicative import Data.Function import Data.Functor-import Data.List hiding (sort, drop) import qualified Data.List as List import Data.Map (Map) import Data.Maybe@@ -78,7 +83,7 @@ canProject f v = case ignoreSharing v of (Con (ConHead _ _ fs) _ vs) -> do- i <- elemIndex f fs+ i <- List.elemIndex f fs headMaybe (drop i vs) _ -> Nothing @@ -91,7 +96,7 @@ "conApp: constructor " ++ show c ++ " with fields " ++ show fs ++ " projected by " ++ show f- i = maybe failure id $ elemIndex f fs+ i = maybe failure id $ List.elemIndex f fs v = maybe failure argToDontCare $ headMaybe $ drop i args in applyE v es @@ -178,19 +183,22 @@ apply (ExtendTel _ tel) (t : ts) = lazyAbsApp tel (unArg t) `apply` ts instance Apply Definition where- apply (Defn info x t pol occ df m c inst copy ma d) args =- Defn info x (piApply t args) (apply pol args) (apply occ args) df m c inst copy ma (apply d args)+ apply (Defn info x t pol occ df m c inst copy ma inj d) args =+ Defn info x (piApply t args) (apply pol args) (apply occ args) df m c inst copy ma inj (apply d args) instance Apply RewriteRule where- apply r args = RewriteRule- { rewName = rewName r- , rewContext = apply (rewContext r) args- , rewHead = rewHead r- , rewPats = applySubst sub (rewPats r)- , rewRHS = applySubst sub (rewRHS r)- , rewType = applySubst sub (rewType r)- }- where sub = parallelS (map unArg args)+ apply r args =+ let newContext = apply (rewContext r) args+ sub = liftS (size newContext) $ parallelS $+ reverse $ map (PTerm . unArg) args+ in RewriteRule+ { rewName = rewName r+ , rewContext = newContext+ , rewHead = rewHead r+ , rewPats = applySubst sub (rewPats r)+ , rewRHS = applyNLPatSubst sub (rewRHS r)+ , rewType = applyNLPatSubst sub (rewType r)+ } #if __GLASGOW_HASKELL__ >= 710 instance {-# OVERLAPPING #-} Apply [Occ.Occurrence] where@@ -221,6 +229,7 @@ in case namedArg p of VarP{} -> recurse DotP{} -> __IMPOSSIBLE__+ AbsurdP{} -> __IMPOSSIBLE__ LitP{} -> __IMPOSSIBLE__ ConP{} -> __IMPOSSIBLE__ ProjP{} -> __IMPOSSIBLE__@@ -238,7 +247,7 @@ apply d [] = d apply d args = case d of Axiom{} -> d- AbstractDefn -> d+ AbstractDefn d -> AbstractDefn $ apply d args Function{ funClauses = cs, funCompiled = cc, funInv = inv , funProjection = Nothing } -> d { funClauses = apply cs args@@ -305,15 +314,16 @@ -- It is assumed that we only apply a clause to "parameters", i.e. -- arguments introduced by lambda lifting. The problem is that these aren't -- necessarily the first elements of the clause telescope.- apply cls@(Clause r tel ps b t catchall) args+ apply cls@(Clause rl rf tel ps b t catchall unreachable) args | length args > length ps = __IMPOSSIBLE__ | otherwise =- Clause r+ Clause rl rf tel' (applySubst rhoP $ drop (length args) ps) (applySubst rho b) (applySubst rho t) catchall+ unreachable where -- We have -- Γ ⊢ args, for some outer context Γ@@ -354,29 +364,35 @@ VarP (DBPatVar _ i) -> mkSub tm (n - 1) (substP i v' ps) vs `composeS` singletonS i (tm v') where v' = raise (n - 1) v DotP{} -> mkSub tm n ps vs+ AbsurdP p' -> mkSub tm n (setNamedArg p p' : ps) (v : vs)+ ConP c _ ps' -> mkSub tm n (ps' ++ ps) (projections c v ++ vs) LitP{} -> __IMPOSSIBLE__- ConP{} -> __IMPOSSIBLE__ ProjP{} -> __IMPOSSIBLE__ mkSub _ _ _ _ = __IMPOSSIBLE__ - -- The parameter patterns 'ps' are all variables or dot patterns. If they- -- are variables they can appear anywhere in the clause telescope. This- -- function constructs the new telescope with 'vs' substituted for 'ps'.+ -- The parameter patterns 'ps' are all variables or dot patterns, or eta+ -- expanded record patterns (issue #2550). If they are variables they+ -- can appear anywhere in the clause telescope. This function+ -- constructs the new telescope with 'vs' substituted for 'ps'. -- Example: -- tel = (x : A) (y : B) (z : C) (w : D) -- ps = y@3 w@0 -- vs = u v -- newTel tel ps vs = (x : A) (z : C[u/y])+ newTel :: Nat -> Telescope -> [NamedArg DeBruijnPattern] -> [Term] -> Telescope newTel n tel [] [] = tel newTel n tel (p : ps) (v : vs) = case namedArg p of VarP (DBPatVar _ i) -> newTel (n - 1) (subTel (size tel - 1 - i) v tel) (substP i (raise (n - 1) v) ps) vs DotP{} -> newTel n tel ps vs+ AbsurdP{} -> __IMPOSSIBLE__+ ConP c _ ps' -> newTel n tel (ps' ++ ps) (projections c v ++ vs) LitP{} -> __IMPOSSIBLE__- ConP{} -> __IMPOSSIBLE__ ProjP{} -> __IMPOSSIBLE__ newTel _ tel _ _ = __IMPOSSIBLE__ + projections c v = [ applyE v [Proj ProjSystem f] | f <- conFields c ]+ -- subTel i v (Δ₁ (xᵢ : A) Δ₂) = Δ₁ Δ₂[xᵢ = v] subTel i v EmptyTel = __IMPOSSIBLE__ subTel 0 v (ExtendTel _ tel) = absApp tel v@@ -465,7 +481,7 @@ instance Apply Permutation where -- The permutation must start with [0..m - 1] -- NB: section (- m) not possible (unary minus), hence (flip (-) m)- apply (Perm n xs) args = Perm (n - m) $ map (flip (-) m) $ genericDrop m xs+ apply (Perm n xs) args = Perm (n - m) $ map (flip (-) m) $ drop m xs where m = size args @@ -506,8 +522,8 @@ ExtendTel arg xtel `abstract` tel = ExtendTel arg $ xtel <&> (`abstract` tel) instance Abstract Definition where- abstract tel (Defn info x t pol occ df m c inst copy ma d) =- Defn info x (abstract tel t) (abstract tel pol) (abstract tel occ) df m c inst copy ma (abstract tel d)+ abstract tel (Defn info x t pol occ df m c inst copy ma inj d) =+ Defn info x (abstract tel t) (abstract tel pol) (abstract tel occ) df m c inst copy ma inj (abstract tel d) -- | @tel ⊢ (Γ ⊢ lhs ↦ rhs : t)@ becomes @tel, Γ ⊢ lhs ↦ rhs : t)@ -- we do not need to change lhs, rhs, and t since they live in Γ.@@ -545,7 +561,7 @@ instance Abstract Defn where abstract tel d = case d of Axiom{} -> d- AbstractDefn -> d+ AbstractDefn d -> AbstractDefn $ abstract tel d Function{ funClauses = cs, funCompiled = cc, funInv = inv , funProjection = Nothing } -> d { funClauses = abstract tel cs@@ -582,23 +598,24 @@ d { primClauses = abstract tel cs } instance Abstract PrimFun where- abstract tel (PrimFun x ar def) = PrimFun x (ar + n) $ \ts -> def $ genericDrop n ts+ abstract tel (PrimFun x ar def) = PrimFun x (ar + n) $ \ts -> def $ drop n ts where n = size tel instance Abstract Clause where- abstract tel (Clause r tel' ps b t catchall) =- Clause r (abstract tel tel')+ abstract tel (Clause rl rf tel' ps b t catchall unreachable) =+ Clause rl rf (abstract tel tel') (namedTelVars m tel ++ ps) b t -- nothing to do for t, since it lives under the telescope catchall+ unreachable where m = size tel + size tel' instance Abstract CompiledClauses where abstract tel Fail = Fail abstract tel (Done xs t) = Done (map (argFromDom . fmap fst) (telToList tel) ++ xs) t abstract tel (Case n bs) =- Case (n <&> \ i -> i + fromIntegral (size tel)) (abstract tel bs)+ Case (n <&> \ i -> i + size tel) (abstract tel bs) instance Abstract a => Abstract (WithArity a) where abstract tel (WithArity n a) = WithArity n $ abstract tel a@@ -728,28 +745,65 @@ ConP c mt ps -> ConP c (applySubst rho mt) $ applySubst rho ps DotP t -> DotP $ applySubst rho t VarP s -> p+ AbsurdP p -> AbsurdP $ applySubst rho p LitP l -> p ProjP{} -> p -instance Subst Term NLPat where+instance DeBruijn NLPat where+ deBruijnVar i = PVar i []+ deBruijnView p = case p of+ PVar i [] -> Just i+ PVar{} -> Nothing+ PWild{} -> Nothing+ PDef{} -> Nothing+ PLam{} -> Nothing+ PPi{} -> Nothing+ PBoundVar{} -> Nothing -- or... ?+ PTerm{} -> Nothing -- or... ?++applyNLPatSubst :: (Subst Term a) => Substitution' NLPat -> a -> a+applyNLPatSubst = applySubst . fmap nlPatToTerm+ where+ nlPatToTerm :: NLPat -> Term+ nlPatToTerm p = case p of+ PVar i xs -> Var i $ map (Apply . fmap var) xs+ PTerm u -> u+ PWild -> __IMPOSSIBLE__+ PDef f es -> __IMPOSSIBLE__+ PLam i u -> __IMPOSSIBLE__+ PPi a b -> __IMPOSSIBLE__+ PBoundVar i es -> __IMPOSSIBLE__++instance Subst NLPat NLPat where applySubst rho p = case p of- PVar id i bvs -> p+ PVar i bvs -> lookupS rho i `applyBV` bvs PWild -> p PDef f es -> PDef f $ applySubst rho es PLam i u -> PLam i $ applySubst rho u PPi a b -> PPi (applySubst rho a) (applySubst rho b) PBoundVar i es -> PBoundVar i $ applySubst rho es- PTerm u -> PTerm $ applySubst rho u+ PTerm u -> PTerm $ applyNLPatSubst rho u -instance Subst Term NLPType where+ where+ applyBV :: NLPat -> [Arg Int] -> NLPat+ applyBV p ys = case p of+ PVar i xs -> PVar i (xs ++ ys)+ PTerm u -> PTerm $ u `apply` map (fmap var) ys+ PWild -> __IMPOSSIBLE__+ PDef f es -> __IMPOSSIBLE__+ PLam i u -> __IMPOSSIBLE__+ PPi a b -> __IMPOSSIBLE__+ PBoundVar i es -> __IMPOSSIBLE__++instance Subst NLPat NLPType where applySubst rho (NLPType s a) = NLPType (applySubst rho s) (applySubst rho a) -instance Subst Term RewriteRule where+instance Subst NLPat RewriteRule where applySubst rho (RewriteRule q gamma f ps rhs t) =- RewriteRule q (applySubst rho gamma)+ RewriteRule q (applyNLPatSubst rho gamma) f (applySubst (liftS n rho) ps)- (applySubst (liftS n rho) rhs)- (applySubst (liftS n rho) t)+ (applyNLPatSubst (liftS n rho) rhs)+ (applyNLPatSubst (liftS n rho) t) where n = size gamma instance Subst t a => Subst t (Blocked a) where@@ -793,6 +847,9 @@ instance Subst Term A.NamedDotPattern where applySubst rho (A.NamedDot x v a) = A.NamedDot x (applySubst rho v) (applySubst rho a) +instance Subst Term A.StrippedDotPattern where+ applySubst rho (A.StrippedDot e v a) = A.StrippedDot e (applySubst rho v) (applySubst rho a)+ instance Subst t a => Subst t (Elim' a) where applySubst rho e = case e of Apply v -> Apply $ applySubst rho v@@ -841,7 +898,7 @@ applySubst rho (EqualityType s eq l t a b) = EqualityType (applySubst rho s) eq- (applySubst rho l)+ (map (applySubst rho) l) (applySubst rho t) (applySubst rho a) (applySubst rho b)@@ -863,6 +920,7 @@ VarP x -> useName (dbPatVarName x) $ lookupS rho $ dbPatVarIndex x DotP u -> DotP $ applyPatSubst rho u ConP c ci ps -> ConP c ci $ applySubst rho ps+ AbsurdP p -> AbsurdP $ applySubst rho p LitP x -> p ProjP{} -> p where@@ -879,7 +937,7 @@ -- This function is an optimization, saving us from construction lambdas we -- immediately remove through application. projDropParsApply :: Projection -> ProjOrigin -> Args -> Term-projDropParsApply (Projection proper d r _ lams) o args =+projDropParsApply (Projection prop d r _ lams) o args = case initLast $ getProjLams lams of -- If we have no more abstractions, we must be a record field -- (projection applied already to record value).@@ -892,11 +950,14 @@ -- We only have to abstract over the parameters that exceed the arguments. -- We only have to apply to the arguments that exceed the parameters. in List.foldr (\ (Arg ai x) -> Lam ai . NoAbs x) (core `apply` args') pars'+ where proper = isJust prop --------------------------------------------------------------------------- -- * Telescopes --------------------------------------------------------------------------- +-- ** Telescope view of a type+ type TelView = TelV Type data TelV a = TelV { theTel :: Tele (Dom a), theCore :: a } deriving (Typeable, Show, Functor)@@ -904,25 +965,23 @@ deriving instance (Subst t a, Eq a) => Eq (TelV a) deriving instance (Subst t a, Ord a) => Ord (TelV a) -type ListTel' a = [Dom (a, Type)]-type ListTel = ListTel' ArgName+-- | Takes off all exposed function domains from the given type.+-- This means that it does not reduce to expose @Pi@-types.+telView' :: Type -> TelView+telView' = telView'UpTo (-1) -telFromList' :: (a -> ArgName) -> ListTel' a -> Telescope-telFromList' f = foldr extTel EmptyTel+-- | @telView'UpTo n t@ takes off the first @n@ exposed function types of @t@.+-- Takes off all (exposed ones) if @n < 0@.+telView'UpTo :: Int -> Type -> TelView+telView'UpTo 0 t = TelV EmptyTel t+telView'UpTo n t = case ignoreSharing $ unEl t of+ Pi a b -> absV a (absName b) $ telView'UpTo (n - 1) (absBody b)+ _ -> TelV EmptyTel t where- extTel (Dom info (x, a)) = ExtendTel (Dom info a) . Abs (f x)+ absV a x (TelV tel t) = TelV (ExtendTel a (Abs x tel)) t -telFromList :: ListTel -> Telescope-telFromList = telFromList' id -telToList :: Telescope -> ListTel-telToList EmptyTel = []-telToList (ExtendTel arg tel) = fmap (absName tel,) arg : telToList (absBody tel)- -- Andreas, 2013-12-14: This would work also for 'NoAbs',- -- since 'absBody' raises.--telToArgs :: Telescope -> [Arg ArgName]-telToArgs tel = [ Arg (domInfo d) (fst $ unDom d) | d <- telToList tel ]+-- ** Creating telescopes from lists of types -- | Turn a typed binding @(x1 .. xn : A)@ into a telescope. bindsToTel' :: (Name -> a) -> [Name] -> Dom Type -> ListTel' a@@ -941,20 +1000,8 @@ bindsWithHidingToTel :: [WithHiding Name] -> Dom Type -> ListTel bindsWithHidingToTel = bindsWithHidingToTel' nameToArgName --- | Takes off all exposed function domains from the given type.--- This means that it does not reduce to expose @Pi@-types.-telView' :: Type -> TelView-telView' = telView'UpTo (-1) --- | @telView'UpTo n t@ takes off the first @n@ exposed function types of @t@.--- Takes off all (exposed ones) if @n < 0@.-telView'UpTo :: Int -> Type -> TelView-telView'UpTo 0 t = TelV EmptyTel t-telView'UpTo n t = case ignoreSharing $ unEl t of- Pi a b -> absV a (absName b) $ telView'UpTo (n - 1) (absBody b)- _ -> TelV EmptyTel t- where- absV a x (TelV tel t) = TelV (ExtendTel a (Abs x tel)) t+-- ** Abstracting in terms and types -- | @mkPi dom t = telePi (telFromList [dom]) t@ mkPi :: Dom (ArgName, Type) -> Type -> Type@@ -975,11 +1022,11 @@ s2 = getSort <$> b el = El $ dLub s1 s2 --- | Uses free variable analysis to introduce 'noAbs' bindings.+-- | Uses free variable analysis to introduce 'NoAbs' bindings. telePi :: Telescope -> Type -> Type telePi = telePi' reAbs --- | Everything will be a 'Abs'.+-- | Everything will be an 'Abs'. telePi_ :: Telescope -> Type -> Type telePi_ = telePi' id @@ -994,6 +1041,10 @@ s2 = fmap getSort b -} +-- | Abstract over a telescope in a term, producing lambdas.+-- Dumb abstraction: Always produces 'Abs', never 'NoAbs'.+--+-- The implementation is sound because 'Telescope' does not use 'NoAbs'. teleLam :: Telescope -> Term -> Term teleLam EmptyTel t = t teleLam (ExtendTel u tel) t = Lam (domInfo u) $ flip teleLam t <$> tel@@ -1008,6 +1059,21 @@ instance TeleNoAbs Telescope where teleNoAbs tel = teleNoAbs $ telToList tel ++-- ** Telescope typing++-- | Given arguments @vs : tel@ (vector typing), extract their individual types.+-- Returns @Nothing@ is @tel@ is not long enough.++typeArgsWithTel :: Telescope -> [Term] -> Maybe [Dom Type]+typeArgsWithTel _ [] = return []+typeArgsWithTel (ExtendTel dom tel) (v : vs) = (dom :) <$> typeArgsWithTel (absApp tel v) vs+typeArgsWithTel EmptyTel{} (_:_) = Nothing++---------------------------------------------------------------------------+-- * Clauses+---------------------------------------------------------------------------+ -- | In compiled clauses, the variables in the clause body are relative to the -- pattern variables (including dot patterns) instead of the clause telescope. compiledClauseBody :: Clause -> Maybe Term@@ -1016,6 +1082,8 @@ --------------------------------------------------------------------------- -- * Syntactic equality and order+--+-- Needs weakening. --------------------------------------------------------------------------- deriving instance Eq Substitution@@ -1106,6 +1174,9 @@ _ `compare` MetaV{} = GT DontCare{} `compare` DontCare{} = EQ +-- | Equality of binders relies on weakening+-- which is a specical case of renaming+-- which is a specical case of substitution. instance (Subst t a, Eq a) => Eq (Abs a) where NoAbs _ a == NoAbs _ b = a == b Abs _ a == Abs _ b = a == b@@ -1163,6 +1234,19 @@ dLub s1 (NoAbs _ s2) = sLub s1 s2 dLub s1 b@(Abs _ s2) = case occurrence 0 s2 of Flexible _ -> DLub s1 b+ -- Andreas, 2017-01-18, issue #2408:+ -- The sort of @.(a : A) → Set (f a)@ in context @f : .A → Level@+ -- is @dLub Set λ a → Set (lsuc (f a))@, but @DLub@s are not serialized.+ -- Alternatives:+ -- 1. -- Irrelevantly -> sLub s1 (absApp b $ DontCare $ Sort Prop)+ -- We cheat here by simplifying the sort to @Set (lsuc (f *))@+ -- where * is a dummy value. The rationale is that @f * = f a@ (irrelevance!)+ -- and that if we already have a neutral level @f a@+ -- it should not hurt to have @f *@ even if type @A@ is empty.+ -- However: sorts are printed in error messages when sorts do not match.+ -- Also, sorts with a dummy like Prop would be ill-typed.+ -- 2. We keep the DLub, and serialize it.+ -- That's clean and principled, even though DLubs make level solving harder. Irrelevantly -> DLub s1 b NoOccurrence -> sLub s1 (noabsApp __IMPOSSIBLE__ b) -- Free.Unused -> sLub s1 (absApp b __IMPOSSIBLE__) -- triggers Issue784
src/full/Agda/TypeChecking/Substitute/Class.hs view
@@ -54,9 +54,9 @@ -- For terms: -- -- Γ ⊢ ρ : Δ--- Δ ⊢ t : σ+-- Δ ⊢ t : A -- -------------- Γ ⊢ tρ : σρ+-- Γ ⊢ tρ : Aρ class DeBruijn t => Subst t a | a -> t where applySubst :: Substitution' t -> a -> a@@ -79,6 +79,11 @@ substUnder :: Subst t a => Nat -> t -> a -> a substUnder n u = applySubst (liftS n (singletonS 0 u)) +-- ** Identity instances++instance Subst Term QName where+ applySubst _ q = q+ --------------------------------------------------------------------------- -- * Explicit substitutions ---------------------------------------------------------------------------@@ -91,7 +96,7 @@ wkS :: Int -> Substitution' a -> Substitution' a wkS 0 rho = rho wkS n (Wk m rho) = Wk (n + m) rho-wkS n EmptyS = EmptyS+wkS n (EmptyS err) = EmptyS err wkS n rho = Wk n rho raiseS :: Int -> Substitution' a@@ -104,6 +109,11 @@ consS u rho = seq u (u :# rho) -- | To replace index @n@ by term @u@, do @applySubst (singletonS n u)@.+-- @+-- Γ, Δ ⊢ u : A+-- ---------------------------------+-- Γ, Δ ⊢ singletonS |Δ| u : Γ, A, Δ+-- @ singletonS :: DeBruijn a => Int -> a -> Substitution' a singletonS n u = map deBruijnVar [0..n-1] ++# consS u (raiseS n) -- ALT: foldl (\ s i -> deBruijnVar i `consS` s) (consS u $ raiseS n) $ downFrom n@@ -112,7 +122,8 @@ -- @ -- Γ, A, Δ ⊢ u : A -- ------------------------------------ @Γ, A, Δ ⊢ inplace |Δ| u : Γ, A, Δ+-- Γ, A, Δ ⊢ inplace |Δ| u : Γ, A, Δ+-- @ inplaceS :: Subst a a => Int -> a -> Substitution' a inplaceS k u = singletonS k u `composeS` liftS (k + 1) (raiseS 1) @@ -123,6 +134,11 @@ liftS k (Lift n rho) = Lift (n + k) rho liftS k rho = Lift k rho +-- | @+-- Γ ⊢ ρ : Δ, Ψ+-- -------------------+-- Γ ⊢ dropS |Ψ| ρ : Δ+-- @ dropS :: Int -> Substitution' a -> Substitution' a dropS 0 rho = rho dropS n IdS = raiseS n@@ -131,13 +147,13 @@ dropS n (Strengthen _ rho) = dropS (n - 1) rho dropS n (Lift 0 rho) = __IMPOSSIBLE__ dropS n (Lift m rho) = wkS 1 $ dropS (n - 1) $ liftS (m - 1) rho-dropS n EmptyS = __IMPOSSIBLE__+dropS n (EmptyS err) = __IMPOSSIBLE__ -- | @applySubst (ρ `composeS` σ) v == applySubst ρ (applySubst σ v)@ composeS :: Subst a a => Substitution' a -> Substitution' a -> Substitution' a composeS rho IdS = rho composeS IdS sgm = sgm-composeS rho EmptyS = EmptyS+composeS rho (EmptyS err) = EmptyS err composeS rho (Wk n sgm) = composeS (dropS n rho) sgm composeS rho (u :# sgm) = applySubst rho u :# composeS rho sgm composeS rho (Strengthen err sgm) = Strengthen err (composeS rho sgm)@@ -149,20 +165,25 @@ -- Γ ⊢ σ : Δ -- Γ ⊢ δ : Θσ splitS :: Int -> Substitution' a -> (Substitution' a, Substitution' a)-splitS 0 rho = (rho, EmptyS)+splitS 0 rho = (rho, EmptyS __IMPOSSIBLE__) splitS n (u :# rho) = second (u :#) $ splitS (n - 1) rho splitS n (Strengthen err rho) = second (Strengthen err) $ splitS (n - 1) rho splitS n (Lift 0 _) = __IMPOSSIBLE__ splitS n (Wk m rho) = wkS m *** wkS m $ splitS n rho-splitS n IdS = (raiseS n, liftS n EmptyS)+splitS n IdS = (raiseS n, liftS n $ EmptyS __IMPOSSIBLE__) splitS n (Lift m rho) = wkS 1 *** liftS 1 $ splitS (n - 1) (liftS (m - 1) rho)-splitS n EmptyS = __IMPOSSIBLE__+splitS n (EmptyS err) = __IMPOSSIBLE__ infixr 4 ++# (++#) :: DeBruijn a => [a] -> Substitution' a -> Substitution' a us ++# rho = foldr consS rho us +-- | @+-- Γ ⊢ ρ : Δ Γ ⊢ reverse vs : Θ+-- ----------------------------- (treating Nothing as having any type)+-- Γ ⊢ prependS vs ρ : Δ, Θ+-- @ prependS :: DeBruijn a => Empty -> [Maybe a] -> Substitution' a -> Substitution' a prependS err us rho = foldr f rho us where@@ -196,7 +217,7 @@ | otherwise -> lookupS rho (i - 1) Lift n rho | i < n -> deBruijnVar i | otherwise -> raise n $ lookupS rho (i - n)- EmptyS -> __IMPOSSIBLE__+ EmptyS err -> absurd err --------------------------------------------------------------------------- -- * Functions on abstractions@@ -253,4 +274,3 @@ loop n a v = case ignoreSharing v of Lam h b -> Lam h $ underAbs (loop $ n-1) a b _ -> __IMPOSSIBLE__-
src/full/Agda/TypeChecking/SyntacticEquality.hs view
@@ -193,6 +193,6 @@ synEq (Dom ai a) (Dom ai' a') = Dom <$$> synEq ai ai' <**> synEq a a' instance SynEq ArgInfo where- synEq ai@(ArgInfo h r o v) ai'@(ArgInfo h' r' o' v')- | h == h', r == r', v == v' = pure2 ai- | otherwise = inequal (ai, ai')+ synEq ai@(ArgInfo h r o) ai'@(ArgInfo h' r' o')+ | h == h', r == r' = pure2 ai+ | otherwise = inequal (ai, ai')
src/full/Agda/TypeChecking/Telescope.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-} module Agda.TypeChecking.Telescope where @@ -11,7 +10,7 @@ import Data.Foldable (forM_) import Data.IntSet (IntSet) import qualified Data.IntSet as IntSet-import Data.List hiding (null)+import qualified Data.List as List import Data.Maybe import Agda.Syntax.Common@@ -36,32 +35,6 @@ #include "undefined.h" import Agda.Utils.Impossible -data OutputTypeName- = OutputTypeName QName- | OutputTypeVar- | OutputTypeNameNotYetKnown- | NoOutputTypeName---- | Strips all Pi's and return the head definition name, if possible.-getOutputTypeName :: Type -> TCM OutputTypeName-getOutputTypeName t = do- TelV tel t' <- telView t- ifBlocked (unEl t') (\ _ _ -> return OutputTypeNameNotYetKnown) $ \ v ->- case ignoreSharing v of- -- Possible base types:- Def n _ -> return $ OutputTypeName n- Sort{} -> return NoOutputTypeName- Var n _ -> return OutputTypeVar- -- Not base types:- Con{} -> __IMPOSSIBLE__- Lam{} -> __IMPOSSIBLE__- Lit{} -> __IMPOSSIBLE__- Level{} -> __IMPOSSIBLE__- MetaV{} -> __IMPOSSIBLE__- Pi{} -> __IMPOSSIBLE__- Shared{} -> __IMPOSSIBLE__- DontCare{} -> __IMPOSSIBLE__- -- | Flatten telescope: (Γ : Tel) -> [Type Γ] flattenTel :: Telescope -> [Dom Type] flattenTel EmptyTel = []@@ -225,7 +198,7 @@ ok = all (<n) is && checkDependencies IntSet.empty is - isC = downFrom n \\ is+ isC = downFrom n List.\\ is perm = Perm n $ map (n-1-) $ is ++ isC @@ -269,7 +242,7 @@ rho = reverseP perm -- works on de Bruijn levels u1 = renameP __IMPOSSIBLE__ perm u -- Γ' ⊢ u1 : A'- us = map (\i -> fromMaybe (DotP u1) (deBruijnVar <$> findIndex (i ==) is)) [ 0 .. n-1 ]+ us = map (\i -> fromMaybe (DotP u1) (deBruijnVar <$> List.findIndex (i ==) is)) [ 0 .. n-1 ] sigma = us ++# raiseS (n-1) ts1 = permute rho $ applyPatSubst sigma ts0@@ -303,7 +276,7 @@ tel' = gamma1 `abstract` (delta `abstract` gamma2') -+-- | Gather leading Πs of a type in a telescope. telView :: Type -> TCM TelView telView = telViewUpTo (-1) @@ -367,17 +340,41 @@ (_, b) <- mustBePi t return $ absApp b v --- | Given a function type, introduce its domain into--- the context and continue with its codomain.--intro1 :: (MonadTCM tcm) => Type -> (Type -> tcm a) -> tcm a-intro1 t cont = do- (a, b) <- mustBePi t- underAbstraction a b cont+-- | Compute type arity+typeArity :: Type -> TCM Nat+typeArity t = do+ TelV tel _ <- telView t+ return (size tel) --------------------------------------------------------------------------- -- * Instance definitions ---------------------------------------------------------------------------++data OutputTypeName+ = OutputTypeName QName+ | OutputTypeVar+ | OutputTypeNameNotYetKnown+ | NoOutputTypeName++-- | Strips all Pi's and return the head definition name, if possible.+getOutputTypeName :: Type -> TCM OutputTypeName+getOutputTypeName t = do+ TelV tel t' <- telView t+ ifBlocked (unEl t') (\ _ _ -> return OutputTypeNameNotYetKnown) $ \ v ->+ case ignoreSharing v of+ -- Possible base types:+ Def n _ -> return $ OutputTypeName n+ Sort{} -> return NoOutputTypeName+ Var n _ -> return OutputTypeVar+ -- Not base types:+ Con{} -> __IMPOSSIBLE__+ Lam{} -> __IMPOSSIBLE__+ Lit{} -> __IMPOSSIBLE__+ Level{} -> __IMPOSSIBLE__+ MetaV{} -> __IMPOSSIBLE__+ Pi{} -> __IMPOSSIBLE__+ Shared{} -> __IMPOSSIBLE__+ DontCare{} -> __IMPOSSIBLE__ addTypedInstance :: QName -> Type -> TCM () addTypedInstance x t = do
src/full/Agda/TypeChecking/Unquote.hs view
@@ -27,13 +27,11 @@ import Agda.Syntax.Translation.ReflectedToAbstract import Agda.TypeChecking.CompiledClause-import Agda.TypeChecking.Datatypes ( getConHead ) import Agda.TypeChecking.DropArgs import Agda.TypeChecking.Free import Agda.TypeChecking.Level import Agda.TypeChecking.Monad import Agda.TypeChecking.Monad.Builtin-import Agda.TypeChecking.Monad.Exception import Agda.TypeChecking.Pretty import Agda.TypeChecking.Reduce import Agda.TypeChecking.Reduce.Monad@@ -49,18 +47,25 @@ import {-# SOURCE #-} Agda.TypeChecking.Rules.Def import Agda.Utils.Except-import Agda.Utils.Impossible+ ( mkExceptT+ , MonadError(catchError, throwError)+ , ExceptT+ , runExceptT+ )+import Agda.Utils.Either+import Agda.Utils.FileName+import Agda.Utils.Lens import Agda.Utils.Maybe+import Agda.Utils.Maybe.Strict (toLazy) import Agda.Utils.Monad import Agda.Utils.Permutation ( Permutation(Perm), compactP )+import Agda.Utils.Pretty (prettyShow) import Agda.Utils.String ( Str(Str), unStr ) import Agda.Utils.VarSet (VarSet) import qualified Agda.Utils.VarSet as Set-import Agda.Utils.Maybe.Strict (toLazy)-import Agda.Utils.FileName-import Agda.Utils.Lens #include "undefined.h"+import Agda.Utils.Impossible agdaTermType :: TCM Type agdaTermType = El (mkType 0) <$> primAgdaTerm@@ -78,15 +83,15 @@ -- definitions. Also state snapshot from last commit and whether the state is -- dirty (definitions have been added). type UnquoteState = (Dirty, TCState)-type UnquoteM = ReaderT Context (StateT UnquoteState (WriterT [QName] (ExceptionT UnquoteError TCM)))+type UnquoteM = ReaderT Context (StateT UnquoteState (WriterT [QName] (ExceptT UnquoteError TCM))) type UnquoteRes a = Either UnquoteError ((a, UnquoteState), [QName]) unpackUnquoteM :: UnquoteM a -> Context -> UnquoteState -> TCM (UnquoteRes a)-unpackUnquoteM m cxt s = runExceptionT $ runWriterT $ runStateT (runReaderT m cxt) s+unpackUnquoteM m cxt s = runExceptT $ runWriterT $ runStateT (runReaderT m cxt) s packUnquoteM :: (Context -> UnquoteState -> TCM (UnquoteRes a)) -> UnquoteM a-packUnquoteM f = ReaderT $ \ cxt -> StateT $ \ s -> WriterT $ ExceptionT $ f cxt s+packUnquoteM f = ReaderT $ \ cxt -> StateT $ \ s -> WriterT $ mkExceptT $ f cxt s runUnquoteM :: UnquoteM a -> TCM (Either UnquoteError (a, [QName])) runUnquoteM m = do@@ -100,7 +105,7 @@ isDefined x = do def <- theDef <$> getConstInfo x case def of- Function{funClauses = []} -> genericError $ "Missing definition for " ++ show x+ Function{funClauses = []} -> genericError $ "Missing definition for " ++ prettyShow x _ -> return () liftU :: TCM a -> UnquoteM a@@ -135,16 +140,16 @@ b <- liftU $ ifBlocked t (\ m _ -> pure $ Left m) (\ t -> pure $ Right t) case b of- Left m -> do s <- gets snd; throwException $ BlockedOnMeta s m+ Left m -> do s <- gets snd; throwError $ BlockedOnMeta s m Right t -> return t class Unquote a where unquote :: I.Term -> UnquoteM a unquoteN :: Unquote a => Arg Term -> UnquoteM a-unquoteN a | notHidden a && isRelevant a =+unquoteN a | visible a && isRelevant a = unquote $ unArg a-unquoteN a = throwException $ BadVisibility "visible" a+unquoteN a = throwError $ BadVisibility "visible" a choice :: Monad m => [(m Bool, m a)] -> m a -> m a choice [] dflt = dflt@@ -152,23 +157,23 @@ ensureDef :: QName -> UnquoteM QName ensureDef x = do- i <- liftU $ (theDef <$> getConstInfo x) `catchError` \_ -> return Axiom -- for recursive unquoteDecl+ i <- liftU $ either (const Axiom) theDef <$> getConstInfo' x -- for recursive unquoteDecl case i of Constructor{} -> do def <- liftU $ prettyTCM =<< primAgdaTermDef con <- liftU $ prettyTCM =<< primAgdaTermCon- throwException $ ConInsteadOfDef x (show def) (show con)+ throwError $ ConInsteadOfDef x (show def) (show con) _ -> return x ensureCon :: QName -> UnquoteM QName ensureCon x = do- i <- liftU $ (theDef <$> getConstInfo x) `catchError` \_ -> return Axiom -- for recursive unquoteDecl+ i <- liftU $ either (const Axiom) theDef <$> getConstInfo' x -- for recursive unquoteDecl case i of Constructor{} -> return x _ -> do def <- liftU $ prettyTCM =<< primAgdaTermDef con <- liftU $ prettyTCM =<< primAgdaTermCon- throwException $ DefInsteadOfCon x (show def) (show con)+ throwError $ DefInsteadOfCon x (show def) (show con) pickName :: R.Type -> String pickName a =@@ -185,10 +190,10 @@ case ignoreSharing t of Con c _ [h,r] -> do choice- [(c `isCon` primArgArgInfo, ArgInfo <$> unquoteN h <*> unquoteN r <*> pure Reflected <*> pure False)]+ [(c `isCon` primArgArgInfo, ArgInfo <$> unquoteN h <*> unquoteN r <*> pure Reflected)] __IMPOSSIBLE__ Con c _ _ -> __IMPOSSIBLE__- _ -> throwException $ NonCanonical "arg info" t+ _ -> throwError $ NonCanonical "arg info" t instance Unquote a => Unquote (Arg a) where unquote t = do@@ -199,7 +204,7 @@ [(c `isCon` primArgArg, Arg <$> unquoteN info <*> unquoteN x)] __IMPOSSIBLE__ Con c _ _ -> __IMPOSSIBLE__- _ -> throwException $ NonCanonical "arg" t+ _ -> throwError $ NonCanonical "arg" t -- Andreas, 2013-10-20: currently, post-fix projections are not part of the -- quoted syntax.@@ -214,35 +219,35 @@ choice [ (c `isCon` primTrue, pure True) , (c `isCon` primFalse, pure False) ] __IMPOSSIBLE__- _ -> throwException $ NonCanonical "boolean" t+ _ -> throwError $ NonCanonical "boolean" t instance Unquote Integer where unquote t = do t <- reduceQuotedTerm t case ignoreSharing t of Lit (LitNat _ n) -> return n- _ -> throwException $ NonCanonical "integer" t+ _ -> throwError $ NonCanonical "integer" t instance Unquote Double where unquote t = do t <- reduceQuotedTerm t case ignoreSharing t of Lit (LitFloat _ x) -> return x- _ -> throwException $ NonCanonical "float" t+ _ -> throwError $ NonCanonical "float" t instance Unquote Char where unquote t = do t <- reduceQuotedTerm t case ignoreSharing t of Lit (LitChar _ x) -> return x- _ -> throwException $ NonCanonical "char" t+ _ -> throwError $ NonCanonical "char" t instance Unquote Str where unquote t = do t <- reduceQuotedTerm t case ignoreSharing t of Lit (LitString _ x) -> return (Str x)- _ -> throwException $ NonCanonical "string" t+ _ -> throwError $ NonCanonical "string" t unquoteString :: Term -> UnquoteM String unquoteString x = unStr <$> unquote x@@ -266,7 +271,7 @@ , (c `isCon` primAgdaErrorPartTerm, TermPart <$> unquoteN x) , (c `isCon` primAgdaErrorPartName, NamePart <$> unquoteN x) ] __IMPOSSIBLE__- _ -> throwException $ NonCanonical "error part" t+ _ -> throwError $ NonCanonical "error part" t instance Unquote a => Unquote [a] where unquote t = do@@ -281,7 +286,7 @@ [(c `isCon` primNil, return [])] __IMPOSSIBLE__ Con c _ _ -> __IMPOSSIBLE__- _ -> throwException $ NonCanonical "list" t+ _ -> throwError $ NonCanonical "list" t instance Unquote Hiding where unquote t = do@@ -290,11 +295,11 @@ Con c _ [] -> do choice [(c `isCon` primHidden, return Hidden)- ,(c `isCon` primInstance, return Instance)+ ,(c `isCon` primInstance, return (Instance NoOverlap)) ,(c `isCon` primVisible, return NotHidden)] __IMPOSSIBLE__ Con c _ vs -> __IMPOSSIBLE__- _ -> throwException $ NonCanonical "visibility" t+ _ -> throwError $ NonCanonical "visibility" t instance Unquote Relevance where unquote t = do@@ -306,14 +311,14 @@ ,(c `isCon` primIrrelevant, return Irrelevant)] __IMPOSSIBLE__ Con c _ vs -> __IMPOSSIBLE__- _ -> throwException $ NonCanonical "relevance" t+ _ -> throwError $ NonCanonical "relevance" t instance Unquote QName where unquote t = do t <- reduceQuotedTerm t case ignoreSharing t of Lit (LitQName _ x) -> return x- _ -> throwException $ NonCanonical "name" t+ _ -> throwError $ NonCanonical "name" t instance Unquote a => Unquote (R.Abs a) where unquote t = do@@ -324,7 +329,7 @@ [(c `isCon` primAbsAbs, R.Abs <$> (hint <$> unquoteNString x) <*> unquoteN y)] __IMPOSSIBLE__ Con c _ _ -> __IMPOSSIBLE__- _ -> throwException $ NonCanonical "abstraction" t+ _ -> throwError $ NonCanonical "abstraction" t where hint x | not (null x) = x | otherwise = "_"@@ -344,7 +349,7 @@ sep [ text "Can't unquote stale metavariable" , pretty m <> text "." <> pretty x ] return x- _ -> throwException $ NonCanonical "meta variable" t+ _ -> throwError $ NonCanonical "meta variable" t instance Unquote a => Unquote (Dom a) where unquote t = domFromArg <$> unquote t@@ -363,7 +368,7 @@ ,(c `isCon` primAgdaSortLit, R.LitS <$> unquoteN u)] __IMPOSSIBLE__ Con c _ _ -> __IMPOSSIBLE__- _ -> throwException $ NonCanonical "sort" t+ _ -> throwError $ NonCanonical "sort" t instance Unquote Literal where unquote t = do@@ -382,7 +387,7 @@ , (c `isCon` primAgdaLitMeta, litMeta noRange =<< unquoteN x) ] __IMPOSSIBLE__ Con c _ _ -> __IMPOSSIBLE__- _ -> throwException $ NonCanonical "literal" t+ _ -> throwError $ NonCanonical "literal" t instance Unquote R.Term where unquote t = do@@ -420,7 +425,7 @@ Con{} -> __IMPOSSIBLE__ Lit{} -> __IMPOSSIBLE__- _ -> throwException $ NonCanonical "term" t+ _ -> throwError $ NonCanonical "term" t instance Unquote R.Pattern where unquote t = do@@ -442,7 +447,7 @@ [ (c `isCon` primAgdaPatCon, R.ConP <$> unquoteN x <*> unquoteN y) ] __IMPOSSIBLE__ Con c _ _ -> __IMPOSSIBLE__- _ -> throwException $ NonCanonical "pattern" t+ _ -> throwError $ NonCanonical "pattern" t instance Unquote R.Clause where unquote t = do@@ -457,7 +462,7 @@ [ (c `isCon` primAgdaClauseClause, R.Clause <$> unquoteN x <*> unquoteN y) ] __IMPOSSIBLE__ Con c _ _ -> __IMPOSSIBLE__- _ -> throwException $ NonCanonical "clause" t+ _ -> throwError $ NonCanonical "clause" t -- Unquoting TCM computations --------------------------------------------- @@ -474,7 +479,7 @@ evalTCM v = do v <- reduceQuotedTerm v liftU $ reportSDoc "tc.unquote.eval" 90 $ text "evalTCM" <+> prettyTCM v- let failEval = throwException $ NonCanonical "type checking computation" v+ let failEval = throwError $ NonCanonical "type checking computation" v case ignoreSharing v of I.Def f [] ->@@ -501,7 +506,9 @@ , (f `isDef` primAgdaTCMTypeError, tcFun1 tcTypeError u) , (f `isDef` primAgdaTCMQuoteTerm, tcQuoteTerm (unElim u)) , (f `isDef` primAgdaTCMUnquoteTerm, tcFun1 (tcUnquoteTerm (mkT (unElim l) (unElim a))) u)- , (f `isDef` primAgdaTCMBlockOnMeta, uqFun1 tcBlockOnMeta u) ]+ , (f `isDef` primAgdaTCMBlockOnMeta, uqFun1 tcBlockOnMeta u)+ , (f `isDef` primAgdaTCMDebugPrint, tcFun3 tcDebugPrint l a u)+ ] failEval I.Def f [_, _, u, v] -> choice [ (f `isDef` primAgdaTCMCatchError, tcCatchError (unElim u) (unElim v))@@ -550,9 +557,19 @@ b <- unquote (unElim b) fun a b + uqFun3 :: (Unquote a, Unquote b, Unquote c) => (a -> b -> c -> UnquoteM d) -> Elim -> Elim -> Elim -> UnquoteM d+ uqFun3 fun a b c = do+ a <- unquote (unElim a)+ b <- unquote (unElim b)+ c <- unquote (unElim c)+ fun a b c+ tcFun2 :: (Unquote a, Unquote b) => (a -> b -> TCM c) -> Elim -> Elim -> UnquoteM c tcFun2 fun = uqFun2 (\ x y -> liftU (fun x y)) + tcFun3 :: (Unquote a, Unquote b, Unquote c) => (a -> b -> c -> TCM d) -> Elim -> Elim -> Elim -> UnquoteM d+ tcFun3 fun = uqFun3 (\ x y z -> liftU (fun x y z))+ tcFreshName :: Str -> TCM Term tcFreshName s = do m <- currentModule@@ -568,7 +585,7 @@ tcBlockOnMeta :: MetaId -> UnquoteM Term tcBlockOnMeta x = do s <- gets snd- throwException (BlockedOnMeta s x)+ throwError (BlockedOnMeta s x) tcCommit :: UnquoteM Term tcCommit = do@@ -582,6 +599,11 @@ tcTypeError :: [ErrorPart] -> TCM a tcTypeError err = typeError . GenericDocError =<< fsep (map prettyTCM err) + tcDebugPrint :: Str -> Integer -> [ErrorPart] -> TCM Term+ tcDebugPrint (Str s) n msg = do+ reportSDoc s (fromIntegral n) $ fsep (map prettyTCM msg)+ primUnitUnit+ tcInferType :: R.Term -> TCM Term tcInferType v = do (_, a) <- inferExpr =<< toAbstract_ v@@ -622,7 +644,7 @@ extendCxt :: Arg R.Type -> UnquoteM a -> UnquoteM a extendCxt a m = do a <- liftU $ traverse (isType_ <=< toAbstract_) a- liftU1 (addContext (domFromArg a :: Dom Type)) m+ liftU1 (addContext' (domFromArg a :: Dom Type)) m tcExtendContext :: Term -> Term -> UnquoteM Term tcExtendContext a m = do@@ -639,8 +661,8 @@ go (a : as) m = extendCxt a $ go as m constInfo :: QName -> TCM Definition- constInfo x = getConstInfo x `catchError` \ _ ->- genericError $ "Unbound name: " ++ show x+ constInfo x = either err return =<< getConstInfo' x+ where err _ = genericError $ "Unbound name: " ++ prettyShow x tcGetType :: QName -> TCM Term tcGetType x = quoteType . defType =<< constInfo x@@ -662,24 +684,26 @@ tcDeclareDef :: Arg QName -> R.Type -> UnquoteM Term tcDeclareDef (Arg i x) a = inOriginalContext $ do setDirty- let h = getHiding i- r = getRelevance i- when (h == Hidden) $ liftU $ typeError . GenericDocError =<< text "Cannot declare hidden function" <+> prettyTCM x+ let r = getRelevance i+ when (hidden i) $ liftU $ typeError . GenericDocError =<<+ text "Cannot declare hidden function" <+> prettyTCM x tell [x] liftU $ do- reportSDoc "tc.unquote.decl" 10 $ sep [ text "declare" <+> prettyTCM x <+> text ":"- , nest 2 $ prettyTCM a ]+ reportSDoc "tc.unquote.decl" 10 $ sep+ [ text "declare" <+> prettyTCM x <+> text ":"+ , nest 2 $ prettyTCM a+ ] a <- isType_ =<< toAbstract_ a- alreadyDefined <- isJust <$> tryMaybe (getConstInfo x)- when alreadyDefined $ genericError $ "Multiple declarations of " ++ show x+ alreadyDefined <- isRight <$> getConstInfo' x+ when alreadyDefined $ genericError $ "Multiple declarations of " ++ prettyShow x addConstant x $ defaultDefn i x a emptyFunction- when (h == Instance) $ addTypedInstance x a+ when (isInstance i) $ addTypedInstance x a primUnitUnit tcDefineFun :: QName -> [R.Clause] -> UnquoteM Term tcDefineFun x cs = inOriginalContext $ (setDirty >>) $ liftU $ do- _ <- getConstInfo x `catchError` \ _ ->- genericError $ "Missing declaration for " ++ show x+ whenM (isLeft <$> getConstInfo' x) $+ genericError $ "Missing declaration for " ++ prettyShow x cs <- mapM (toAbstract_ . QNamed x) cs reportSDoc "tc.unquote.def" 10 $ vcat $ map prettyA cs let i = mkDefInfo (nameConcrete $ qnameName x) noFixity' PublicAccess ConcreteDef noRange
+ src/full/Agda/TypeChecking/Warnings.hs view
@@ -0,0 +1,114 @@+{-# LANGUAGE CPP #-}++module Agda.TypeChecking.Warnings where++import qualified Data.List as List++import Agda.TypeChecking.Monad.Base+import {-# SOURCE #-} Agda.TypeChecking.Errors+import {-# SOURCE #-} Agda.TypeChecking.Pretty++import Agda.Syntax.Position+import Agda.Syntax.Parser++import Agda.Interaction.Options++import Agda.Utils.Lens+import qualified Agda.Utils.Pretty as P+import Agda.Utils.Except++#if __GLASGOW_HASKELL__ <= 708+import Control.Applicative ((<$>))+#endif++++{-# SPECIALIZE genericWarning :: P.Doc -> TCM () #-}+genericWarning :: MonadTCM tcm => P.Doc -> tcm ()+genericWarning = warning . GenericWarning++{-# SPECIALIZE genericNonFatalError :: P.Doc -> TCM () #-}+genericNonFatalError :: MonadTCM tcm => P.Doc -> tcm ()+genericNonFatalError = warning . GenericNonFatalError++{-# SPECIALIZE warning_ :: Warning -> TCM TCWarning #-}+warning_ :: MonadTCM tcm => Warning -> tcm TCWarning+warning_ w = do+ r <- view eRange+ c <- view eCall+ -- NicifierIssues print their own error locations in their list of+ -- issues (but we might need to keep the overall range `r` for+ -- comparing ranges)+ let r' = case w of { NicifierIssue{} -> NoRange ; _ -> r }+ p <- liftTCM $ sayWhen r' c $ prettyWarning w+ liftTCM $ return $ TCWarning r w p++{-# SPECIALIZE warning :: Warning -> TCM () #-}+warning :: MonadTCM tcm => Warning -> tcm ()+warning w = do+ tcwarn <- warning_ w+ wmode <- optWarningMode <$> pragmaOptions+ case wmode of+ IgnoreAllWarnings -> case classifyWarning w of+ -- not allowed to ignore non-fatal errors+ ErrorWarnings -> raiseWarning tcwarn+ AllWarnings -> return ()+ TurnIntoErrors -> typeError $ NonFatalErrors [tcwarn]+ LeaveAlone -> raiseWarning tcwarn+ where raiseWarning tcw = stTCWarnings %= (tcw :)++-- | Classifying warnings: some are benign, others are (non-fatal) errors++data WhichWarnings =+ ErrorWarnings -- ^ warnings that will be turned into errors+ | AllWarnings -- ^ all warnings, including errors and benign ones+ -- Note: order of constructors is important for the derived Ord instance+ deriving (Eq, Ord)++isUnsolvedWarning :: Warning -> Bool+isUnsolvedWarning w = case w of+ UnsolvedMetaVariables{} -> True+ UnsolvedInteractionMetas{} -> True+ UnsolvedConstraints{} -> True+ -- rest+ _ -> False++classifyWarning :: Warning -> WhichWarnings+classifyWarning w = case w of+ OldBuiltin{} -> AllWarnings+ EmptyRewritePragma -> AllWarnings+ UselessPublic -> AllWarnings+ UnreachableClauses{} -> AllWarnings+ UselessInline{} -> AllWarnings+ GenericWarning{} -> AllWarnings+ DeprecationWarning{} -> AllWarnings+ NicifierIssue{} -> AllWarnings+ TerminationIssue{} -> ErrorWarnings+ CoverageIssue{} -> ErrorWarnings+ CoverageNoExactSplit{} -> ErrorWarnings+ NotStrictlyPositive{} -> ErrorWarnings+ UnsolvedMetaVariables{} -> ErrorWarnings+ UnsolvedInteractionMetas{} -> ErrorWarnings+ UnsolvedConstraints{} -> ErrorWarnings+ GenericNonFatalError{} -> ErrorWarnings+ SafeFlagPostulate{} -> ErrorWarnings+ SafeFlagPragma{} -> ErrorWarnings+ SafeFlagNonTerminating -> ErrorWarnings+ SafeFlagTerminating -> ErrorWarnings+ SafeFlagPrimTrustMe -> ErrorWarnings+ SafeFlagNoPositivityCheck -> ErrorWarnings+ SafeFlagPolarity -> ErrorWarnings+ ParseWarning{} -> ErrorWarnings++classifyWarnings :: [TCWarning] -> ([TCWarning], [TCWarning])+classifyWarnings = List.partition $ (< AllWarnings) . classifyWarning . tcWarning++-- | running the Parse monad++runPM :: PM a -> TCM a+runPM m = do+ (res, ws) <- runPMIO m+ mapM_ (warning . ParseWarning) ws+ case res of+ Left e -> throwError (Exception (getRange e) (P.pretty e))+ Right a -> return a
src/full/Agda/TypeChecking/With.hs view
@@ -8,7 +8,8 @@ import Control.Monad import Control.Monad.Writer (WriterT, runWriterT, tell) -import Data.List+import Data.Either+import qualified Data.List as List import Data.Maybe import Data.Monoid import Data.Traversable (traverse)@@ -33,6 +34,7 @@ import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope import Agda.TypeChecking.ReconstructParameters+import Agda.TypeChecking.Rules.Term import Agda.TypeChecking.Abstract import Agda.TypeChecking.Rules.LHS.Implicit@@ -45,6 +47,7 @@ import Agda.Utils.Null (empty) import Agda.Utils.Permutation import Agda.Utils.Pretty (prettyShow)+import qualified Agda.Utils.Pretty as P import Agda.Utils.Size #include "undefined.h"@@ -66,9 +69,9 @@ -- -- Output: ----- [@Δ₁@] part of context not needed for with arguments and their types.+-- [@Δ₁@] part of context needed for with arguments and their types. ----- [@Δ₂@] part of context needed for with arguments and their types.+-- [@Δ₂@] part of context not needed for with arguments and their types. -- -- [@π@] permutation from Δ to Δ₁Δ₂ as returned by 'splitTelescope'. --@@ -189,7 +192,7 @@ withArguments :: [Term] -> [EqualityView] -> [Term] withArguments vs as = concat $ for (zip vs as) $ \case (v, OtherType a) -> [v]- (prf, eqt@(EqualityType s _eq _l t v _v')) -> [unArg v, prf]+ (prf, eqt@(EqualityType s _eq _pars _t v _v')) -> [unArg v, prf] -- | Compute the clauses for the with-function given the original patterns.@@ -198,6 +201,7 @@ -> QName -- ^ Name of the parent function. -> QName -- ^ Name of the with-function. -> Type -- ^ Types of the parent function.+ -> Telescope -- ^ Context of parent patterns. -> [NamedArg DeBruijnPattern] -- ^ Parent patterns. -> Nat -- ^ Number of module parameters in parent patterns -> Substitution -- ^ Substitution from parent lhs to with function lhs@@ -206,18 +210,22 @@ -> Nat -- ^ Number of with expressions. -> [A.SpineClause] -- ^ With-clauses. -> TCM [A.SpineClause] -- ^ With-clauses flattened wrt. parent patterns.-buildWithFunction cxtNames f aux t qs npars withSub perm n1 n cs = mapM buildWithClause cs+buildWithFunction cxtNames f aux t delta qs npars withSub perm n1 n cs = mapM buildWithClause cs where -- Nested with-functions will iterate this function once for each parent clause.- buildWithClause (A.Clause (A.SpineLHS i _ ps wps) inheritedDots rhs wh catchall) = do- let (wps0, wps1) = genericSplitAt n wps+ buildWithClause (A.Clause (A.SpineLHS i _ ps wps) inheritedDots inhStrippedDots rhs wh catchall) = do+ let (wps0, wps1) = splitAt n wps ps0 = map defaultNamedArg wps0 reportSDoc "tc.with" 50 $ text "inheritedDots:" <+> vcat [ prettyTCM x <+> text "=" <+> prettyTCM v <+> text ":" <+> prettyTCM a | A.NamedDot x v a <- inheritedDots ] rhs <- buildRHS rhs- (namedDots, ps') <- stripWithClausePatterns cxtNames f aux t qs npars perm ps- let (ps1, ps2) = genericSplitAt n1 ps'- let result = A.Clause (A.SpineLHS i aux (ps1 ++ ps0 ++ ps2) wps1) (inheritedDots ++ namedDots) rhs wh catchall+ (namedDots, strippedDots, ps') <- stripWithClausePatterns cxtNames f aux t delta qs npars perm ps+ reportSDoc "tc.with" 50 $ hang (text "strippedDots:") 2 $+ vcat [ prettyTCM e <+> text "==" <+> prettyTCM v <+> (text ":" <+> prettyTCM t)+ | A.StrippedDot e v t <- strippedDots ]+ let (ps1, ps2) = splitAt n1 ps'+ let result = A.Clause (A.SpineLHS i aux (ps1 ++ ps0 ++ ps2) wps1) (inheritedDots ++ namedDots)+ (inhStrippedDots ++ strippedDots) rhs wh catchall reportSDoc "tc.with" 20 $ vcat [ text "buildWithClause returns" <+> prettyA result ]@@ -235,14 +243,15 @@ -- of the innermost parent clause. Note that this makes them live in the -- context of the with-function arguments before any pattern matching. We -- need to update again once the with-clause patterns have been checked.- -- This happens in Rules.Def.checkClause before calling checkRHS.+ -- This happens in Rules.Def.checkClause before calling checkRHS. The same+ -- goes for stripped dots. permuteNamedDots :: A.SpineClause -> A.SpineClause- permuteNamedDots (A.Clause lhs dots rhs wh catchall) =- A.Clause lhs (applySubst withSub dots) rhs wh catchall+ permuteNamedDots (A.Clause lhs dots sdots rhs wh catchall) =+ A.Clause lhs (applySubst withSub dots) (applySubst withSub sdots) rhs wh catchall -{-| @stripWithClausePatterns cxtNames parent f t qs np π ps = ps'@+{-| @stripWithClausePatterns cxtNames parent f t Δ qs np π ps = ps'@ -[@Δ@] context bound by lhs of original function (not an argument).+[@Δ@] context bound by lhs of original function. [@f@] name of @with@-function. @@ -312,12 +321,13 @@ -> QName -- ^ Name of the parent function. -> QName -- ^ Name of with-function. -> Type -- ^ __@t@__ top-level type of the original function.+ -> Telescope -- ^ __@Δ@__ context of patterns of parent function. -> [NamedArg DeBruijnPattern] -- ^ __@qs@__ internal patterns for original function. -> Nat -- ^ __@npars@__ number of module parameters is @qs@. -> Permutation -- ^ __@π@__ permutation taking @vars(qs)@ to @support(Δ)@. -> [NamedArg A.Pattern] -- ^ __@ps@__ patterns in with clause (eliminating type @t@).- -> TCM ([A.NamedDotPattern], [NamedArg A.Pattern]) -- ^ __@ps'@__ patterns for with function (presumably of type @Δ@).-stripWithClausePatterns cxtNames parent f t qs npars perm ps = do+ -> TCM ([A.NamedDotPattern], [A.StrippedDotPattern], [NamedArg A.Pattern]) -- ^ __@ps'@__ patterns for with function (presumably of type @Δ@).+stripWithClausePatterns cxtNames parent f t delta qs npars perm ps = do -- Andreas, 2014-03-05 expand away pattern synoyms (issue 1074) ps <- expandPatternSynonyms ps -- Ulf, 2016-11-16 Issue 2303: We need the module parameter@@ -338,7 +348,8 @@ ] -- Andreas, 2015-11-09 Issue 1710: self starts with parent-function, not with-function!- (ps', namedDots) <- runWriterT $ strip (Def parent []) t psi qs+ (ps', out) <- runWriterT $ strip (Def parent []) t psi qs+ let (strippedDots, namedDots) = partitionEithers out reportSDoc "tc.with.strip" 50 $ nest 2 $ text "namedDots:" <+> vcat [ prettyTCM x <+> text "=" <+> prettyTCM v <+> text ":" <+> prettyTCM a | A.NamedDot x v a <- namedDots ] let psp = permute perm ps'@@ -349,7 +360,7 @@ -- Andreas, 2014-03-05 Issue 142: -- In some cases, permute throws away some dot patterns of ps' -- which are then never checked.- if True then return (namedDots, psp) else do+ if True then return (namedDots, strippedDots, psp) else do -- Andreas, 2014-03-05 Disabled the fix for issue 142, the following is dead code: forM_ (permute (droppedP perm) ps') $ \ p -> setCurrentRange p $ do reportSDoc "tc.with.strip" 10 $ text "warning: dropped pattern " <+> prettyA p@@ -361,7 +372,7 @@ "This inaccessible pattern is never checked, so only _ allowed here" _ -> return () _ -> return ()- return (namedDots, psp)+ return (namedDots, strippedDots, psp) where strip@@ -369,7 +380,7 @@ -> Type -- ^ The type to be eliminated. -> [NamedArg A.Pattern] -- ^ With-clause patterns. -> [NamedArg DeBruijnPattern] -- ^ Parent-clause patterns with de Bruijn indices relative to Δ.- -> WriterT [A.NamedDotPattern] TCM [NamedArg A.Pattern]+ -> WriterT [Either A.StrippedDotPattern A.NamedDotPattern] TCM [NamedArg A.Pattern] -- ^ With-clause patterns decomposed by parent-clause patterns. -- Also outputs named dot patterns from the parent clause that -- we need to add let-bindings for.@@ -407,7 +418,7 @@ | A.AsP _ x p <- namedArg p0 = do (a, _) <- mustBePi t let v = patternToTerm (namedArg q)- tell [A.NamedDot x v (unDom a)]+ tell [Right $ A.NamedDot x v (unDom a)] strip self t (fmap (p <$) p0 : ps) qs strip self t ps0@(p0 : ps) qs0@(q : qs) = do p <- liftTCM $ expandLitPattern p0@@ -429,13 +440,14 @@ case namedArg q of ProjP o d -> case A.maybePostfixProjP p of Just (o', AmbQ ds) -> do- let d' = head ds- when (length ds /= 1) __IMPOSSIBLE__+ -- Andreas, 2016-12-28, issue #2360:+ -- We disambiguate the projection in the with clause+ -- to the projection in the parent clause. d <- liftTCM $ getOriginalProjection d- d' <- liftTCM $ getOriginalProjection d'+ found <- anyM ds ((d ==) <.> (liftTCM . getOriginalProjection)) -- We assume here that neither @o@ nor @o'@ can be @ProjSystem@. if o /= o' then liftTCM $ mismatchOrigin o o' else do- if d /= d' then mismatch else do+ if not found then mismatch else do (self1, t1, ps) <- liftTCM $ do t <- reduce t (_, self1, t1) <- fromMaybe __IMPOSSIBLE__ <$> projectTyped self t o d@@ -447,14 +459,15 @@ strip self1 t1 ps qs Nothing -> mismatch - VarP x -> do- let v = var (dbPatVarIndex x)- t <- piApply1 t v- ps <- strip (self `apply1` v) t ps qs- return $ p : ps+ VarP x -> (p :) <$> recurse (var (dbPatVarIndex x)) + AbsurdP p -> __IMPOSSIBLE__+ DotP v -> case namedArg p of- A.DotP r o _ -> ok p+ A.DotP r o e -> do+ (a, _) <- mustBePi t+ tell [Left $ A.StrippedDot e v (unDom a)]+ ok p A.WildP _ -> ok p -- Ulf, 2016-05-30: dot patterns are no longer mandatory so a parent -- dot pattern can appear as a variable in the child clause. Indeed@@ -463,7 +476,7 @@ -- insert a let for it. A.VarP x -> do (a, _) <- mustBePi t- tell [A.NamedDot x v (unDom a)]+ tell [Right $ A.NamedDot x v (unDom a)] ok p -- Andreas, 2013-03-21 in case the implicit A.pattern has already been eta-expanded -- we just fold it back. This fixes issues 665 and 824.@@ -480,9 +493,7 @@ _ -> failDotPat where okFlex = ok . makeImplicitP- ok p = do- t' <- piApply1 t v- (p :) <$> strip (self `apply1` v) t' ps qs+ ok p = (p :) <$> recurse v q'@(ConP c ci qs') -> do reportSDoc "tc.with.strip" 60 $@@ -492,7 +503,7 @@ Def d es <- liftTCM $ ignoreSharing <$> normalise (unEl $ unDom a) let us = fromMaybe __IMPOSSIBLE__ $ allApplyElims es -- Get the original constructor and field names.- c <- (`withRangeOf` c) <$> do liftTCM $ getConForm $ conName c+ c <- either __IMPOSSIBLE__ (`withRangeOf` c) <$> do liftTCM $ getConForm $ conName c case namedArg p of @@ -503,20 +514,17 @@ maybe __IMPOSSIBLE__ (\ p -> strip self t (p : ps) qs0) =<< do liftTCM $ expandImplicitPattern' (unDom a) $ makeImplicitP p - -- Andreas, 2013-03-21 if we encounter an implicit pattern- -- in the with-clause, we expand it and restart- -- Andreas, 2015-07-07 Issue 1606 do this whenever the parent- -- is a record pattern, regardless of whether it came from an implicit- -- or not. This allows to drop hidden flexible record patterns from- -- the with clauses even when they were present in the parent clause.- A.WildP{} | Just _ <- conPRecord ci -> do- maybe __IMPOSSIBLE__ (\ p -> strip self t (p : ps) qs0) =<< do- liftTCM $ expandImplicitPattern' (unDom a) p+ -- Andreas, 2016-12-29, issue #2363.+ -- Allow _ to stand for the corresponding parent pattern.+ A.WildP{} -> do+ let ps' = map (updateNamedArg $ const $ A.WildP empty) qs'+ stripConP d us b c ConOCon qs' ps' A.ConP _ (A.AmbQ cs') ps' -> do -- Check whether the with-clause constructor can be (possibly trivially) -- disambiguated to be equal to the parent-clause constructor.- cs' <- liftTCM $ mapM getConForm cs'+ -- Andreas, 2017-08-13, herein, ignore abstract constructors.+ cs' <- liftTCM $ do snd . partitionEithers <$> mapM getConForm cs' unless (elem c cs') mismatch -- Strip the subpatterns ps' and then continue. stripConP d us b c ConOCon qs' ps'@@ -536,10 +544,8 @@ mismatch LitP lit -> case namedArg p of- A.LitP lit' | lit == lit' -> do- (a, b) <- mustBePi t- let v = Lit lit- strip (self `apply1` v) (b `absApp` v) ps qs+ A.LitP lit' | lit == lit' -> recurse $ Lit lit+ A.WildP{} -> recurse $ Lit lit p@(A.PatternSynP pi' c' [ps']) -> do reportSDoc "impossible" 10 $@@ -548,13 +554,17 @@ _ -> mismatch where- mismatch = typeError $- WithClausePatternMismatch (namedArg p0) (dbPatVarName <$> namedArg q)- mismatchOrigin o o' = typeError . GenericDocError =<< fsep+ recurse v = do+ t' <- piApply1 t v+ strip (self `apply1` v) t' ps qs++ mismatch = addContext delta $ typeError $+ WithClausePatternMismatch (namedArg p0) q+ mismatchOrigin o o' = addContext delta . typeError . GenericDocError =<< fsep [ text "With clause pattern" , prettyA p0 , text "is not an instance of its parent pattern"- , prettyTCM $ dbPatVarName <$> namedArg q+ , P.fsep <$> prettyTCMPatterns [q] , text $ "since the parent pattern is " ++ prettyProjOrigin o ++ " and the with clause pattern is " ++ prettyProjOrigin o' ]@@ -582,14 +592,14 @@ -- ^ Argument patterns (parent clause). -> [NamedArg A.Pattern] -- ^ Argument patterns (with clause).- -> WriterT [A.NamedDotPattern] TCM [NamedArg A.Pattern]+ -> WriterT [Either A.StrippedDotPattern A.NamedDotPattern] TCM [NamedArg A.Pattern] -- ^ Stripped patterns. stripConP d us b c ci qs' ps' = do -- Get the type and number of parameters of the constructor. Defn {defType = ct, theDef = Constructor{conPars = np}} <- getConInfo c -- Compute the argument telescope for the constructor- let ct' = ct `piApply` genericTake np us+ let ct' = ct `piApply` take np us TelV tel' _ <- liftTCM $ telView ct' reportSDoc "tc.with.strip" 20 $@@ -597,7 +607,7 @@ , text "ct' = " <+> prettyTCM ct' , text "np = " <+> text (show np) , text "us = " <+> prettyList (map prettyTCM us)- , text "us' = " <+> prettyList (map prettyTCM $ genericTake np us)+ , text "us' = " <+> prettyList (map prettyTCM $ take np us) ] -- Compute the new type@@ -638,14 +648,22 @@ -- f (suc a) (suc b) | c -- @ withDisplayForm- :: QName -- ^ The name of parent function.- -> QName -- ^ The name of the @with@-function.- -> Telescope -- ^ __@Δ₁@__ The arguments of the @with@ function before the @with@ expressions.- -> Telescope -- ^ __@Δ₂@__ The arguments of the @with@ function after the @with@ expressions.- -> Nat -- ^ __@n@__ The number of @with@ expressions.- -> [NamedArg DeBruijnPattern] -- ^ __@qs@__ The parent patterns.- -> Permutation -- ^ __@perm@__ Permutation to split into needed and unneeded vars.- -> Permutation -- ^ __@lhsPerm@__ Permutation reordering the variables in parent patterns.+ :: QName+ -- ^ The name of parent function.+ -> QName+ -- ^ The name of the @with@-function.+ -> Telescope+ -- ^ __@Δ₁@__ The arguments of the @with@ function before the @with@ expressions.+ -> Telescope+ -- ^ __@Δ₂@__ The arguments of the @with@ function after the @with@ expressions.+ -> Nat+ -- ^ __@n@__ The number of @with@ expressions.+ -> [NamedArg DeBruijnPattern]+ -- ^ __@qs@__ The parent patterns.+ -> Permutation+ -- ^ __@perm@__ Permutation to split into needed and unneeded vars.+ -> Permutation+ -- ^ __@lhsPerm@__ Permutation reordering the variables in parent patterns. -> TCM DisplayForm withDisplayForm f aux delta1 delta2 n qs perm@(Perm m _) lhsPerm = do @@ -683,14 +701,14 @@ reportSDoc "tc.with.display" 20 $ vcat [ text "withDisplayForm" , nest 2 $ vcat- [ text "f =" <+> text (show f)- , text "aux =" <+> text (show aux)+ [ text "f =" <+> text (prettyShow f)+ , text "aux =" <+> text (prettyShow aux) , text "delta1 =" <+> prettyTCM delta1 , text "delta2 =" <+> do addContext delta1 $ prettyTCM delta2 , text "n =" <+> text (show n) , text "perm =" <+> text (show perm) , text "top =" <+> do addFullCtx $ prettyTCM topArgs- , text "qs =" <+> sep (map (prettyTCM . namedArg) qs)+ , text "qs =" <+> prettyList (map pretty qs) , text "qsToTm =" <+> prettyTCM tqs0 -- ctx would be permuted form of delta1 ++ delta2 , text "ys =" <+> text (show ys) , text "rho =" <+> text (prettyShow rho)@@ -709,7 +727,7 @@ -- Andreas, 2015-10-28: Yes, but properly! (Issue 1407) sub top ys wild = parallelS $ map term [0 .. m + top - 1] where- term i = maybe wild var $ findIndex (Just i ==) ys+ term i = maybe wild var $ List.findIndex (Just i ==) ys -- -- OLD -- sub top rho wild = parallelS $ map term [0 .. m - 1] ++ topTerms -- where@@ -741,5 +759,6 @@ ProjP _ d -> DDef d [] -- WRONG. TODO: convert spine to non-spine ... DDef d . defaultArg VarP x -> DTerm $ var $ dbPatVarIndex x DotP t -> DDot $ t+ AbsurdP p -> toTerm p ConP c cpi ps -> DCon c (fromConPatternInfo cpi) $ toTerms ps LitP l -> DTerm $ Lit l
src/full/Agda/Utils/Bag.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} -- | A simple overlay over Data.Map to manage unordered sets with duplicates. @@ -26,13 +25,17 @@ -- | A set with duplicates. -- Faithfully stores elements which are equal with regard to (==).-newtype Bag a = Bag { bag :: Map a [a] }+newtype Bag a = Bag+ { bag :: Map a [a]+ -- ^ The list contains all occurrences of @a@ (not just the duplicates!).+ -- Hence, the invariant: the list is never empty.+ } deriving (Eq, Ord) -- The list contains all occurrences of @a@ (not just the duplicates!).- -- Hence the invariant: the list is never empty!+ -- Hence the invariant: the list is never empty. -- -- This is slightly wasteful, but much easier to implement- -- in terms of Map as the alternative, which is to store+ -- in terms of @Map@ as the alternative, which is to store -- only the duplicates in the list. -- See, e.g., implementation of 'union' which would be impossible -- to do in the other representation. We would need a@@ -44,23 +47,28 @@ -- * Query ------------------------------------------------------------------------ +-- | Is the bag empty? null :: Bag a -> Bool null = Map.null . bag +-- | Number of elements in the bag. Duplicates count. O(n). size :: Bag a -> Int size = getSum . foldMap (Sum . length) . bag --- | @bag ! a@ finds all elements equal to @a@.+-- | @(bag ! a)@ finds all elements equal to @a@. O(log n).+-- Total function, returns @[]@ if none are. (!) :: Ord a => Bag a -> a -> [a] Bag b ! a = Map.findWithDefault [] a b +-- | O(log n). member :: Ord a => a -> Bag a -> Bool member a = not . notMember a +-- | O(log n). notMember :: Ord a => a -> Bag a -> Bool notMember a b = List.null (b ! a) --- | Return the multiplicity of the given element.+-- | Return the multiplicity of the given element. O(log n + count _ _). count :: Ord a => a -> Bag a -> Int count a b = length (b ! a) @@ -68,9 +76,11 @@ -- * Construction ------------------------------------------------------------------------ +-- | O(1) empty :: Bag a empty = Bag $ Map.empty +-- | O(1) singleton :: a -> Bag a singleton a = Bag $ Map.singleton a [a] @@ -134,7 +144,7 @@ trav [] = __IMPOSSIBLE__ --------------------------------------------------------------------------- * Instances+-- Instances ------------------------------------------------------------------------ instance Show a => Show (Bag a) where
src/full/Agda/Utils/Benchmark.hs view
@@ -14,8 +14,10 @@ import Data.Foldable (foldMap) import Data.Functor+import Data.Function import qualified Data.List as List import Data.Monoid+import Data.Maybe import qualified Text.PrettyPrint.Boxes as Boxes @@ -38,10 +40,17 @@ type Timings a = Trie a CPUTime +data BenchmarkOn a = BenchmarkOff | BenchmarkOn | BenchmarkSome (Account a -> Bool)++isBenchmarkOn :: Account a -> BenchmarkOn a -> Bool+isBenchmarkOn _ BenchmarkOff = False+isBenchmarkOn _ BenchmarkOn = True+isBenchmarkOn a (BenchmarkSome p) = p a+ -- | Benchmark structure is a trie, mapping accounts (phases and subphases) -- to CPU time spent on their performance. data Benchmark a = Benchmark- { benchmarkOn :: !Bool+ { benchmarkOn :: !(BenchmarkOn a) -- ^ Are we benchmarking at all? , currentAccount :: !(CurrentAccount a) -- ^ What are we billing to currently?@@ -52,14 +61,14 @@ -- | Initial benchmark structure (empty). instance Null (Benchmark a) where empty = Benchmark- { benchmarkOn = False+ { benchmarkOn = BenchmarkOff , currentAccount = Strict.Nothing , timings = empty } null = null . timings -- | Semantic editor combinator.-mapBenchmarkOn :: (Bool -> Bool) -> Benchmark a -> Benchmark a+mapBenchmarkOn :: (BenchmarkOn a -> BenchmarkOn a) -> Benchmark a -> Benchmark a mapBenchmarkOn f b = b { benchmarkOn = f $ benchmarkOn b } -- | Semantic editor combinator.@@ -80,17 +89,16 @@ pretty b = text $ Boxes.render table where trie = timings b- (accounts, times) = unzip $ Trie.toList trie- aggrTimes = do- a <- accounts- let t = Trie.lookupTrie a trie- hasChildren =- case foldMap (:[]) t of- _:_:_ -> True- _ -> False- return $ if not (null a) && hasChildren- then Boxes.text $ "(" ++ prettyShow (getSum $ foldMap Sum t) ++ ")"- else Boxes.text ""+ (accounts, times0) = unzip $ Trie.toListOrderedBy (flip compare `on` snd)+ $ Trie.filter ((> fromMilliseconds 10) . snd)+ $ Trie.mapSubTries (Just . aggr) trie+ times = map fst times0+ aggr t = (fromMaybe 0 $ Trie.lookup [] t, getSum $ foldMap Sum t)+ aggrTimes = do+ (a, (t, aggrT)) <- zip accounts times0+ return $ if t == aggrT || null a+ then Boxes.text ""+ else Boxes.text $ "(" ++ prettyShow aggrT ++ ")" -- Generate a table. table = Boxes.hsep 1 Boxes.left [col1, col2, col3]@@ -149,7 +157,7 @@ -- | Turn benchmarking on/off. -setBenchmarking :: MonadBench a m => Bool -> m ()+setBenchmarking :: MonadBench a m => BenchmarkOn a -> m () setBenchmarking b = modifyBenchmark $ mapBenchmarkOn $ const b -- | Bill current account with time up to now.@@ -180,7 +188,7 @@ -- Works even if the computation is aborted by an exception. billTo :: MonadBench a m => Account a -> m c -> m c-billTo account m = ifNotM (getsBenchmark benchmarkOn) m $ do+billTo account m = ifNotM (isBenchmarkOn account <$> getsBenchmark benchmarkOn) m $ do -- Switch to new account. old <- switchBenchmarking $ Strict.Just account -- Compute and switch back to old account.@@ -188,7 +196,7 @@ -- | Bill a CPS function to an account. Can't handle exceptions. billToCPS :: MonadBench a m => Account a -> ((b -> m c) -> m c) -> (b -> m c) -> m c-billToCPS account f k = ifNotM (getsBenchmark benchmarkOn) (f k) $ do+billToCPS account f k = ifNotM (isBenchmarkOn account <$> getsBenchmark benchmarkOn) (f k) $ do -- Switch to new account. old <- switchBenchmarking $ Strict.Just account f $ \ x -> x `seq` do
src/full/Agda/Utils/BiMap.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} --- | Finite bijections (implemented as a pair of maps).+-- | Finite bijections (implemented as a pair of tree maps). module Agda.Utils.BiMap where @@ -40,7 +40,7 @@ singleton :: a -> b -> BiMap a b singleton a b = BiMap (Map.singleton a b) (Map.singleton b a) --- | Insert. Overwrites existing value if present.+-- | Insert. Overwrites existing value if present. O(Map.insert). insert :: (Ord a, Ord b) => a -> b -> BiMap a b -> BiMap a b insert a b (BiMap t u) = BiMap (Map.insert a b t) (Map.insert b a u) @@ -50,16 +50,16 @@ -- | Construct from a list of pairs. ----- Does not check for actual bijectivity of constructed finite map.+-- Does not check for actual bijectivity of constructed finite map. O(n log n) fromList :: (Ord a, Ord b) => [(a,b)] -> BiMap a b fromList = List.foldl' (flip (uncurry insert)) empty --- | Turn into list, sorted ascendingly by first value.+-- | Turn into list, sorted ascendingly by first value. O(Map.toList) toList :: BiMap a b -> [(a,b)] toList = Map.toAscList . biMapThere --------------------------------------------------------------------------- * Instances+-- Instances ------------------------------------------------------------------------ instance (Ord a, Ord b) => Eq (BiMap a b) where@@ -70,4 +70,3 @@ instance (Show a, Show b) => Show (BiMap a b) where show bimap = "Agda.Utils.BiMap.fromList " ++ show (toList bimap)-
src/full/Agda/Utils/Char.hs view
@@ -27,7 +27,7 @@ -- punctuation, symbols, separators (including spaces) and others -- (including control characters). ----- These are the tests that 'Data.Char' offers+-- These are the tests that 'Data.Char' offers: data UnicodeTest = IsControl | IsSpace | IsLower | IsUpper | IsAlpha | IsAlphaNum | IsPrint@@ -51,4 +51,3 @@ -- | Find out which tests a character satisfies. testChar :: Char -> [UnicodeTest] testChar c = map fst $ filter (($ c) . snd) unicodeTests-
src/full/Agda/Utils/Cluster.hs view
@@ -15,7 +15,6 @@ import Data.Char import Data.Functor import qualified Data.IntMap as IntMap-import Data.List -- | Characteristic identifiers. type C = Int@@ -28,7 +27,7 @@ cluster f as = cluster' $ map (\ a -> (a, f a)) as -- | Partition a list of @a@s paired with a non-empty list of--- characteristics $C$ into groups+-- characteristics @C@ into groups -- such that each element in a group shares at least one characteristic -- with at least one other element of the group. cluster' :: [(a,(C,[C]))] -> [[a]]
src/full/Agda/Utils/Either.hs view
@@ -1,17 +1,8 @@ --------------------------------------------------------------------------- | Utilities for the 'Either' type+-- | Utilities for the 'Either' type. ------------------------------------------------------------------------ -module Agda.Utils.Either- ( whileLeft, caseEitherM- , mapEither, mapLeft, mapRight- , traverseEither- , isLeft, isRight- , fromLeft, fromRight- , maybeLeft, maybeRight- , allLeft, allRight- , maybeToEither- ) where+module Agda.Utils.Either where -- | Loop while we have an exception. @@ -48,12 +39,14 @@ traverseEither f g = either (fmap Left . f) (fmap Right . g) -- | Returns 'True' iff the argument is @'Right' x@ for some @x@.+-- -- Note: from @base >= 4.7.0.0@ already present in @Data.Either@. isRight :: Either a b -> Bool isRight (Right _) = True isRight (Left _) = False -- | Returns 'True' iff the argument is @'Left' x@ for some @x@.+-- -- Note: from @base >= 4.7.0.0@ already present in @Data.Either@. isLeft :: Either a b -> Bool isLeft (Right _) = False@@ -67,28 +60,36 @@ fromRight :: (a -> b) -> Either a b -> b fromRight f = either f id +-- | Analogue of 'Agda.Utils.Maybe.fromMaybeM'.+fromLeftM :: Monad m => (b -> m a) -> Either a b -> m a+fromLeftM = either return++-- | Analogue of 'Agda.Utils.Maybe.fromMaybeM'.+fromRightM :: Monad m => (a -> m b) -> Either a b -> m b+fromRightM f = either f return+ -- | Safe projection from 'Left'.--- @--- maybeLeft (Left a) = Just a--- maybeLeft Right{} = Nothing--- @+--+-- > maybeLeft (Left a) = Just a+-- > maybeLeft Right{} = Nothing+-- maybeLeft :: Either a b -> Maybe a maybeLeft = either Just (const Nothing) -- | Safe projection from 'Right'.--- @--- maybeRight (Right b) = Just b--- maybeRight Left{} = Nothing--- @+--+-- > maybeRight (Right b) = Just b+-- > maybeRight Left{} = Nothing+-- maybeRight :: Either a b -> Maybe b maybeRight = either (const Nothing) Just --- | Returns @'Just' <input with tags stripped>@ if all elements are+-- | Returns @'Just' input_with_tags_stripped@ if all elements are -- to the 'Left', and otherwise 'Nothing'. allLeft :: [Either a b] -> Maybe [a] allLeft = mapM maybeLeft --- | Returns @'Just' <input with tags stripped>@ if all elements are+-- | Returns @'Just' input_with_tags_stripped@ if all elements are -- to the right, and otherwise 'Nothing'. -- -- @@@ -102,6 +103,6 @@ allRight :: [Either a b] -> Maybe [b] allRight = mapM maybeRight --- | Convert 'Maybe' to @'Either' ()'@+-- | Convert 'Maybe' to @'Either' ()@. maybeToEither :: Maybe a -> Either () a maybeToEither = maybe (Left ()) Right
src/full/Agda/Utils/Empty.hs view
@@ -1,13 +1,31 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-} +#if __GLASGOW_HASKELL__ <= 708+{-# LANGUAGE DeriveDataTypeable #-}+#endif+ -- | An empty type with some useful instances. module Agda.Utils.Empty where +import Control.Exception (evaluate)++import Data.Functor ((<$))+import Data.Data (Data)++#if __GLASGOW_HASKELL__ <= 708+import Data.Typeable ( Typeable )+#endif+ import Agda.Utils.Impossible #include "undefined.h" data Empty+#if __GLASGOW_HASKELL__ <= 708+ deriving Typeable+#endif+deriving instance Data Empty instance Eq Empty where _ == _ = True@@ -21,3 +39,17 @@ absurd :: Empty -> a absurd e = seq e __IMPOSSIBLE__ ++-- | @toImpossible e@ extracts the @Impossible@ value raised via+-- @__IMPOSSIBLE__@ to create the element @e@ of type @Empty@.+-- It proceeds by evaluating @e@ to weak head normal form and+-- catching the exception.+-- We are forced to wrap things in a @Maybe@ because of+-- @catchImpossible@'s type.++toImpossible :: Empty -> IO Impossible+toImpossible e = do+ s <- catchImpossible (Nothing <$ evaluate e) (return . Just)+ case s of+ Just i -> return i+ Nothing -> absurd e -- this should never happen
src/full/Agda/Utils/Except.hs view
@@ -1,39 +1,29 @@-{-# LANGUAGE CPP #-} -#if !(MIN_VERSION_mtl(2,2,1))-{-# OPTIONS_GHC -fno-warn-orphans #-}-#endif- --------------------------------------------------------------------------------- | Wrapper for Control.Monad.Except from the mtl package+-- | Wrapper for Control.Monad.Except from the mtl library (>= 2.2.1) ------------------------------------------------------------------------------ module Agda.Utils.Except ( Error(noMsg, strMsg) , ExceptT+ , mapExceptT , mkExceptT , MonadError(catchError, throwError) , runExceptT- , mapExceptT ) where -#include "undefined.h"-import Agda.Utils.Impossible+import Control.Monad.Except -------------------------------------------------------------------------#if MIN_VERSION_mtl(2,2,1)--- New mtl, reexport ExceptT, define class Error for backward compat.------------------------------------------------------------------------- -import Control.Monad.Except- -- | We cannot define data constructors synonymous, so we define the -- @mkExceptT@ function to be used instead of the data constructor -- @ExceptT@. mkExceptT :: m (Either e a) -> ExceptT e m a mkExceptT = ExceptT --- From Control.Monad.Trans.Error of transformers 0.3.0.0.+-- | Error class for backward compatibility (from+-- Control.Monad.Trans.Error in transformers 0.3.0.0). class Error a where noMsg :: a@@ -45,40 +35,3 @@ -- | A string can be thrown as an error. instance Error String where strMsg = id---------------------------------------------------------------------------#else--- Old mtl, need to define ExceptT from ErrorT---------------------------------------------------------------------------import Control.Monad.Error-import Text.PrettyPrint--type ExceptT = ErrorT---- | We cannot define data constructors synonymous, so we define the--- @mkExceptT@ function to be used instead of the data constructor--- @ErrorT@.-mkExceptT :: m (Either e a) -> ExceptT e m a-mkExceptT = ErrorT---- | 'runExcept' function using mtl 2.1.*.-runExceptT :: ExceptT e m a -> m (Either e a)-runExceptT = runErrorT--mapExceptT :: (m (Either e a) -> m' (Either e' a')) -> ExceptT e m a -> ExceptT e' m' a'-mapExceptT = mapErrorT--instance Error Doc where- noMsg = empty- strMsg = text---- | To simulate @MaybeT@ by @ExceptT@.-instance Error () where- noMsg = ()---- Stupid ErrorT!-instance Error (a, b, c) where- noMsg = __IMPOSSIBLE__--#endif
src/full/Agda/Utils/FileName.hs view
@@ -17,7 +17,7 @@ import System.Directory import System.FilePath -#if mingw32_HOST_OS+#ifdef mingw32_HOST_OS import Control.Exception (bracket) import System.Win32 (findFirstFile, findClose, getFindDataFileName) #endif@@ -25,7 +25,8 @@ import Data.Text (Text) import qualified Data.Text as Text import Data.Function-import Data.Hashable+import Data.Hashable (Hashable)+import Data.Data (Data) import Data.Typeable (Typeable) import Agda.Utils.Monad@@ -40,7 +41,7 @@ -- paths point to the same files or directories. newtype AbsolutePath = AbsolutePath { byteStringPath :: Text }- deriving (Eq, Ord, Typeable, Hashable)+ deriving (Eq, Ord, Typeable, Data, Hashable) -- | Extract the 'AbsolutePath' to be used as 'FilePath'. filePath :: AbsolutePath -> FilePath@@ -67,7 +68,7 @@ | otherwise = __IMPOSSIBLE__ rootPath :: FilePath-#if mingw32_HOST_OS+#ifdef mingw32_HOST_OS rootPath = joinDrive "C:" [pathSeparator] #else rootPath = [pathSeparator]@@ -113,7 +114,7 @@ -- case insensitively.) doesFileExistCaseSensitive :: FilePath -> IO Bool-#if mingw32_HOST_OS+#ifdef mingw32_HOST_OS doesFileExistCaseSensitive f = do doesFileExist f `and2M` do bracket (findFirstFile f) (findClose . fst) $
src/full/Agda/Utils/Functor.hs view
@@ -15,14 +15,6 @@ import Data.Functor.Compose import Data.Functor.Classes --- Andreas, 2015-05-06, see issue 1501.--- This instance can be obtained from transformers-compat.--- -- ASR (15 October 2014): See issue 1304.--- #if !MIN_VERSION_transformers(0,4,1)--- instance Eq a => Eq (Identity a) where--- Identity x == Identity x' = x == x'--- #endif- infixr 4 $> ($>) :: Functor f => f a -> b -> f b
src/full/Agda/Utils/Graph/AdjacencyMap/Unidirectional.hs view
@@ -1,7 +1,6 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE CPP #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE ScopedTypeVariables #-} -- | Directed graphs (can of course simulate undirected graphs). --@@ -90,6 +89,7 @@ import Agda.Utils.List (headMaybe) import Agda.Utils.Null (Null(null)) import qualified Agda.Utils.Null as Null+import Agda.Utils.Pretty import Agda.Utils.SemiRing import Agda.Utils.Singleton (Singleton) import qualified Agda.Utils.Singleton as Singleton@@ -118,11 +118,17 @@ } deriving (Eq, Functor, Show) +instance (Pretty s, Pretty t, Pretty e) => Pretty (Graph s t e) where+ pretty = vcat . map pretty . edges+ data Edge s t e = Edge { source :: s -- ^ Outgoing node. , target :: t -- ^ Incoming node. , label :: e -- ^ Edge label (weight). } deriving (Eq, Ord, Functor, Show)++instance (Pretty s, Pretty t, Pretty e) => Pretty (Edge s t e) where+ pretty (Edge s t e) = pretty s <+> text "--(" <> pretty t <> text ")-->" <+> pretty t -- | Reverse an edge.
src/full/Agda/Utils/Haskell/Syntax.hs view
@@ -1,25 +1,30 @@+-- | ASTs for subset of GHC Haskell syntax. module Agda.Utils.Haskell.Syntax where --- Modules --+-- * Modules data Module = Module ModuleName [ModulePragma] [ImportDecl] [Decl] -data ModulePragma = LanguagePragma [Name]+data ModulePragma+ = LanguagePragma [Name]+ | OtherPragma String -- ^ Unstructured pragma (Andreas, 2017-08-23, issue #2712). data ImportDecl = ImportDecl- { importModule :: ModuleName- , importQualified :: Bool- , importSpecs :: Maybe (Bool, [ImportSpec]) }+ { importModule :: ModuleName+ , importQualified :: Bool+ , importSpecs :: Maybe (Bool, [ImportSpec])+ } data ImportSpec = IVar Name --- Declarations --+-- * Declarations data Decl = TypeDecl Name [TyVarBind] Type | DataDecl DataOrNew Name [TyVarBind] [ConDecl] [Deriving] | TypeSig [Name] Type | FunBind [Match]+ | PatSyn Pat Pat | FakeDecl String deriving (Eq) @@ -44,7 +49,7 @@ data Match = Match Name [Pat] Rhs (Maybe Binds) deriving (Eq) --- Expressions --+-- * Expressions data Type = TyForall [TyVarBind] Type | TyFun Type Type@@ -89,7 +94,7 @@ data Literal = Int Integer | Frac Rational | Char Char | String String deriving (Eq) --- Names --+-- * Names data ModuleName = ModuleName String deriving (Eq, Ord)
+ src/full/Agda/Utils/IO.hs view
@@ -0,0 +1,21 @@+-- | Auxiliary functions for the IO monad.++module Agda.Utils.IO where++import Control.Exception+import Control.Monad.Writer++-- | Catch 'IOException's.+--+class CatchIO m where+ catchIO :: m a -> (IOException -> m a) -> m a++-- | Alias of 'catch' for the IO monad.+--+instance CatchIO IO where+ catchIO = catch++-- | Upon exception, the written output is lost.+--+instance CatchIO m => CatchIO (WriterT w m) where+ catchIO m h = WriterT $ runWriterT m `catchIO` \ e -> runWriterT (h e)
src/full/Agda/Utils/IO/Directory.hs view
@@ -4,24 +4,61 @@ where import Control.Monad+import Control.Monad.Writer+ import System.Directory import System.FilePath import Data.ByteString as BS import Paths_Agda +import Agda.Utils.Functor++-- | @copyDirContent src dest@ recursively copies directory @src@ onto @dest@.+--+-- First, a to-do list of copy actions is created.+-- Then, the to-do list is carried out.+--+-- This avoids copying files we have just created again, which can happen+-- if @src@ and @dest@ are not disjoint.+-- (See issue #2705.)+-- copyDirContent :: FilePath -> FilePath -> IO ()-copyDirContent src dest = do- createDirectoryIfMissing True dest- chlds <- getDirectoryContents src- mapM_ (\x -> do- isDir <- doesDirectoryExist (src </> x)+copyDirContent src dest = mapM_ performAction =<< do+ (`appEndo` []) <$> execWriterT (copyDirContentDryRun src dest)++-- | Action to be carried out for copying a directory recursively.+--+data CopyDirAction+ = MkDir FilePath+ -- ^ Create directory if missing.+ | CopyFile FilePath FilePath+ -- ^ Copy file if changed.++-- | Perform scheduled 'CopyDirAction'.+--+performAction :: CopyDirAction -> IO ()+performAction = \case+ MkDir d -> createDirectoryIfMissing True d+ CopyFile src dest -> copyIfChanged src dest++-- | @copyDirContentDryRun src dest@ creates a to-do list+-- for recursively copying directory @src@ onto @dest@.+--+copyDirContentDryRun :: FilePath -> FilePath -> WriterT (Endo [CopyDirAction]) IO ()+copyDirContentDryRun src dest = do+ tell $ Endo (MkDir dest :)+ chlds <- lift $ getDirectoryContents src+ forM_ chlds $ \ x -> do+ isDir <- lift $ doesDirectoryExist (src </> x) case isDir of _ | x == "." || x == ".." -> return ()- True -> copyDirContent (src </> x) (dest </> x)- False -> copyIfChanged (src </> x) (dest </> x)- ) chlds+ True -> copyDirContentDryRun (src </> x) (dest </> x)+ False -> tell $ Endo (CopyFile (src </> x) (dest </> x) :) +-- | @copyIfChanged src dst@ makes sure that @dst@ exists+-- and has the same content as @dst@.+-- copyIfChanged :: FilePath -> FilePath -> IO () copyIfChanged src dst = do exist <- doesFileExist dst@@ -29,4 +66,3 @@ new <- BS.readFile src old <- BS.readFile dst unless (old == new) $ copyFile src dst-
src/full/Agda/Utils/IO/UTF8.hs view
@@ -4,8 +4,11 @@ ( readTextFile , Agda.Utils.IO.UTF8.hPutStr , Agda.Utils.IO.UTF8.writeFile+ , writeTextToFile ) where +import Data.Text.Lazy (Text)+import qualified Data.Text.Lazy.IO as T import qualified System.IO as IO import Control.Applicative @@ -54,3 +57,11 @@ writeFile :: FilePath -> String -> IO () writeFile file s = IO.withFile file IO.WriteMode $ \h -> do hPutStr h s++-- | Writes a UTF8-encoded text file. The native convention for line+-- endings is used.++writeTextToFile :: FilePath -> Text -> IO ()+writeTextToFile file s = IO.withFile file IO.WriteMode $ \h -> do+ IO.hSetEncoding h IO.utf8+ T.hPutStr h s
src/full/Agda/Utils/Impossible.hs view
@@ -12,11 +12,25 @@ -- | \"Impossible\" errors, annotated with a file name and a line -- number corresponding to the source code location of the error. -data Impossible = Impossible String Integer deriving Typeable+data Impossible + = Impossible String Integer+ -- ^ We reached a program point which should be unreachable.++ | Unreachable String Integer+ -- ^ @Impossible@ with a different error message.+ -- Used when we reach a program point which can in principle+ -- be reached, but not for a certain run.++ deriving Typeable+ instance Show Impossible where show (Impossible file line) = unlines [ "An internal error has occurred. Please report this as a bug."+ , "Location of the error: " ++ file ++ ":" ++ show line+ ]+ show (Unreachable file line) = unlines+ [ "We reached a program point we did not want to reach." , "Location of the error: " ++ file ++ ":" ++ show line ]
+ src/full/Agda/Utils/IndexedList.hs view
@@ -0,0 +1,74 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE TypeOperators #-}++module Agda.Utils.IndexedList where++import Agda.Utils.Lens++-- | Existential wrapper for indexed types.+data Some :: (k -> *) -> * where+ Some :: f i -> Some f++-- | Unpacking a wrapped value.+withSome :: Some b -> (forall i. b i -> a) -> a+withSome (Some x) f = f x++-- | Lists indexed by a type-level list. A value of type @All p [x₁..xₙ]@ is a+-- sequence of values of types @p x₁@, .., @p xₙ@.+data All :: (x -> *) -> [x] -> * where+ Nil :: All p '[]+ Cons :: p x -> All p xs -> All p (x ': xs)++-- | Constructing an indexed list from a plain list.+makeAll :: (a -> Some b) -> [a] -> Some (All b)+makeAll f [] = Some Nil+makeAll f (x : xs) =+ case (f x, makeAll f xs) of+ (Some y, Some ys) -> Some (Cons y ys)++-- | Turning an indexed list back into a plain list.+forgetAll :: (forall x. b x -> a) -> All b xs -> [a]+forgetAll f Nil = []+forgetAll f (Cons x xs) = f x : forgetAll f xs++-- | An index into a type-level list.+data Index :: [x] -> x -> * where+ Zero :: Index (x ': xs) x+ Suc :: Index xs x -> Index (y ': xs) x++-- | Indices are just natural numbers.+forgetIndex :: Index xs x -> Int+forgetIndex Zero = 0+forgetIndex (Suc i) = 1 + forgetIndex i++-- | Mapping over an indexed list.+mapWithIndex :: (forall x. Index xs x -> p x -> q x) -> All p xs -> All q xs+mapWithIndex f Nil = Nil+mapWithIndex f (Cons p ps) = Cons (f Zero p) $ mapWithIndex (f . Suc) ps++-- | If you have an index you can get a lens for the given element.+lIndex :: Index xs x -> Lens' (p x) (All p xs)+lIndex Zero f (Cons x xs) = f x <&> \ x -> Cons x xs+lIndex (Suc i) f (Cons x xs) = lIndex i f xs <&> \ xs -> Cons x xs+#if __GLASGOW_HASKELL__ < 800+lIndex _ _ Nil = error "-fwarn-incomplete-pattern deficiency"+#endif++-- | Looking up an element in an indexed list.+lookupIndex :: All p xs -> Index xs x -> p x+lookupIndex = flip ix+ where+ -- -Wincomplete-patterns fails for the other argument order!+ ix :: Index xs x -> All p xs -> p x+ ix Zero (Cons x xs) = x+ ix (Suc i) (Cons x xs) = ix i xs+#if __GLASGOW_HASKELL__ < 800+ ix _ Nil = error "-fwarn-incomplete-pattern deficiency"+#endif++-- | All indices into an indexed list.+allIndices :: All p xs -> All (Index xs) xs+allIndices = mapWithIndex const+
src/full/Agda/Utils/Lens.hs view
@@ -9,7 +9,7 @@ , (<&>) -- reexported from Agda.Utils.Functor ) where -import Control.Applicative ( Const(Const), getConst )+import Control.Applicative import Control.Monad.State import Control.Monad.Reader import Control.Monad.Writer@@ -27,6 +27,13 @@ -- Mnemoic: "Lens inner outer". type Lens' i o = forall f. Functor f => (i -> f i) -> o -> f o +-- * Some simple lenses.++lFst :: Lens' a (a, b)+lFst f (x, y) = (, y) <$> f x++lSnd :: Lens' b (a, b)+lSnd f (x, y) = (x,) <$> f y -- * Elementary lens operations.
src/full/Agda/Utils/List.hs view
@@ -1,14 +1,12 @@-{-# LANGUAGE CPP #-}+-- | Utility functions for lists. -{-| Utitlity functions on lists.--} module Agda.Utils.List where import Control.Arrow (first) import Data.Functor ((<$>)) import Data.Function-import Data.List+import qualified Data.List as List import Data.Maybe import qualified Data.Map as Map import qualified Data.Set as Set@@ -19,9 +17,6 @@ import Agda.Utils.Tuple -#include "undefined.h"-import Agda.Utils.Impossible- -- | Case distinction for lists, with list first. -- Cf. 'Agda.Utils.Null.ifNull'. caseList :: [a] -> b -> (a -> [a] -> b) -> b@@ -49,6 +44,14 @@ lastMaybe [] = Nothing lastMaybe xs = Just $ last xs +-- | Last two elements (safe).+last2 :: [a] -> Maybe (a, a)+last2 (x : y : xs) = Just $ loop x y xs+ where+ loop x y [] = (x, y)+ loop x y (z:xs) = loop y z xs+last2 _ = Nothing+ -- | Opposite of cons @(:)@, safe. uncons :: [a] -> Maybe (a, [a]) uncons [] = Nothing@@ -60,11 +63,10 @@ -- | 'init' and 'last' in one go, safe. initLast :: [a] -> Maybe ([a],a)-initLast [] = Nothing-initLast as = Just $ loop as where- loop [] = __IMPOSSIBLE__- loop [a] = ([], a)- loop (a : as) = mapFst (a:) $ loop as+initLast [] = Nothing+initLast (a:as) = Just $ loop a as where+ loop a [] = ([], a)+ loop a (b : bs) = mapFst (a:) $ loop b bs -- | Lookup function (partially safe). (!!!) :: [a] -> Int -> Maybe a@@ -261,7 +263,7 @@ dup (a : _ : _) = Just a dup _ = Nothing --- | A variant of 'groupBy' which applies the predicate to consecutive+-- | A variant of 'List.groupBy' which applies the predicate to consecutive -- pairs. groupBy' :: (a -> a -> Bool) -> [a] -> [[a]]@@ -274,10 +276,10 @@ [] -> [] ((_, z) : zs) -> grp z zs --- | @'groupOn' f = 'groupBy' (('==') \`on\` f) '.' 'sortBy' ('compare' \`on\` f)@.+-- | @'groupOn' f = 'groupBy' (('==') \`on\` f) '.' 'List.sortBy' ('compare' \`on\` f)@. groupOn :: Ord b => (a -> b) -> [a] -> [[a]]-groupOn f = groupBy ((==) `on` f) . sortBy (compare `on` f)+groupOn f = List.groupBy ((==) `on` f) . List.sortBy (compare `on` f) -- | @splitExactlyAt n xs = Just (ys, zs)@ iff @xs = ys ++ zs@ -- and @genericLength ys = n@.@@ -297,24 +299,28 @@ map (== x) xs -- | Requires both lists to have the same length.+--+-- Otherwise, @Nothing@ is returned. -zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c]-zipWith' f [] [] = []-zipWith' f (x : xs) (y : ys) = f x y : zipWith' f xs ys-zipWith' f [] (_ : _) = {- ' -} __IMPOSSIBLE__-zipWith' f (_ : _) [] = {- ' -} __IMPOSSIBLE__+zipWith' :: (a -> b -> c) -> [a] -> [b] -> Maybe [c]+zipWith' f = loop+ where+ loop [] [] = Just []+ loop (x : xs) (y : ys) = (f x y :) <$> loop xs ys+ loop [] (_ : _) = Nothing+ loop (_ : _) [] = Nothing -{- UNUSED; a better type would be- zipWithTails :: (a -> b -> c) -> [a] -> [b] -> ([c], Either [a] [b])+-- -- UNUSED; a better type would be+-- -- zipWithTails :: (a -> b -> c) -> [a] -> [b] -> ([c], Either [a] [b]) --- | Like zipWith, but returns the leftover elements of the input lists.-zipWithTails :: (a -> b -> c) -> [a] -> [b] -> ([c], [a] , [b])-zipWithTails f xs [] = ([], xs, [])-zipWithTails f [] ys = ([], [] , ys)-zipWithTails f (x : xs) (y : ys) = (f x y : zs , as , bs)- where (zs , as , bs) = zipWithTails f xs ys--}+-- -- | Like zipWith, but returns the leftover elements of the input lists.+-- zipWithTails :: (a -> b -> c) -> [a] -> [b] -> ([c], [a] , [b])+-- zipWithTails f xs [] = ([], xs, [])+-- zipWithTails f [] ys = ([], [] , ys)+-- zipWithTails f (x : xs) (y : ys) = (f x y : zs , as , bs)+-- where (zs , as , bs) = zipWithTails f xs ys + -- | Efficient variant of 'nubBy' for finite lists. -- -- Specification:@@ -323,10 +329,10 @@ nubOn :: Ord b => (a -> b) -> [a] -> [a] nubOn tag = map snd- . sortBy (compare `on` fst)+ . List.sortBy (compare `on` fst) . map (snd . head)- . groupBy ((==) `on` fst)- . sortBy (compare `on` fst)+ . List.groupBy ((==) `on` fst)+ . List.sortBy (compare `on` fst) . map (\p@(_, x) -> (tag x, p)) . zip [1..] @@ -339,7 +345,7 @@ -- -- Furthermore ----- > sortBy (compare `on` f) (uniqOn f xs) == uniqOn f xs.+-- > List.sortBy (compare `on` f) (uniqOn f xs) == uniqOn f xs. uniqOn :: Ord b => (a -> b) -> [a] -> [a] uniqOn key = Map.elems . Map.fromList . map (\ a -> (key a, a)) @@ -366,8 +372,8 @@ editDistance :: Eq a => [a] -> [a] -> Int editDistance xs ys = editD 0 0- where xss = tails xs- yss = tails ys+ where xss = List.tails xs+ yss = List.tails ys tbl = Map.fromList [ ((i, j), editD' i j) | i <- [0..length xss - 1], j <- [0..length yss - 1] ] editD i j = tbl Map.! (i, j) editD' i j =
src/full/Agda/Utils/Maybe.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE CPP #-}- -- | Extend 'Data.Maybe' by common operations for the 'Maybe' type. -- -- Note: since this module is usually imported unqualified,@@ -17,9 +15,12 @@ import Data.Maybe import Data.Functor -#include "undefined.h"-import Agda.Utils.Impossible+-- * Conversion. +-- | Retain object when tag is 'True'.+boolToMaybe :: Bool -> a -> Maybe a+boolToMaybe b x = if b then Just x else Nothing+ -- * Collection operations. -- | @unionWith@ for collections of size <= 1.@@ -59,6 +60,10 @@ caseMaybe :: Maybe a -> b -> (a -> b) -> b caseMaybe m d f = maybe d f m +-- | 'caseMaybe' with flipped branches.+ifJust :: Maybe a -> (a -> b) -> b -> b+ifJust m f d = maybe d f m+ -- * Monads and Maybe. -- | Monadic version of 'maybe'.@@ -105,19 +110,3 @@ -- allJustM [] = return $ Just [] -- allJustM (mm : mms) = caseMaybeM mm (return Nothing) $ \ a -> -- fmap (a:) <$> allJust mms---- | Precondition: list not empty.--- @--- allJustsOrNothings [Nothing, Nothing] = Just Nothing--- allJustsOrNothings [Just 0, Just 1] = Just $ Just [0,1]--- allJustsOrNothings [Just 0, Nothing] = Nothing--- @-allJustsOrNothings :: [Maybe a] -> Maybe (Maybe [a])-allJustsOrNothings [] = __IMPOSSIBLE__-allJustsOrNothings [ma] = return $ (:[]) <$> ma-allJustsOrNothings (ma : mas) = do- res <- allJustsOrNothings mas- case (ma, res) of- (Nothing, Nothing) -> return Nothing- (Just a, Just as) -> return $ Just (a : as)- _ -> mzero
src/full/Agda/Utils/Maybe/Strict.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable #-} -#if __GLASGOW_HASKELL__ >= 706+#if __GLASGOW_HASKELL__ >= 708 {-# LANGUAGE DeriveGeneric #-} #endif @@ -39,14 +39,10 @@ import Data.Semigroup (Semigroup, Monoid, (<>), mempty, mappend) import Data.Foldable (Foldable (..)) import Data.Traversable (Traversable (..))-#if MIN_VERSION_base(4,7,0) import Data.Typeable (Typeable)-#else-import Data.Typeable (Typeable1)-#endif import Data.Strict.Maybe (Maybe (Nothing, Just), fromJust, fromMaybe, isJust, isNothing, maybe)-#if __GLASGOW_HASKELL__ >= 706+#if __GLASGOW_HASKELL__ >= 708 import GHC.Generics (Generic (..)) #endif @@ -61,13 +57,9 @@ toLazy (Just x) = Lazy.Just x deriving instance Data a => Data (Maybe a)-#if MIN_VERSION_base(4,7,0) deriving instance Typeable Maybe-#else-deriving instance Typeable1 Maybe-#endif -#if __GLASGOW_HASKELL__ >= 706+#if __GLASGOW_HASKELL__ >= 708 deriving instance Generic (Maybe a) #endif @@ -77,13 +69,13 @@ -- The monoid instance was fixed in strict-base-types 0.5.0. See -- Issue 1805.-instance Monoid a => Semigroup (Maybe a) where+instance Semigroup a => Semigroup (Maybe a) where Nothing <> m = m m <> Nothing = m- Just x1 <> Just x2 = Just (x1 `mappend` x2)+ Just x1 <> Just x2 = Just (x1 <> x2) -instance Monoid a => Monoid (Maybe a) where- mempty = Nothing+instance Semigroup a => Monoid (Maybe a) where+ mempty = Nothing mappend = (<>) instance Foldable Maybe where
src/full/Agda/Utils/Monad.hs view
@@ -5,9 +5,6 @@ , when, unless, MonadPlus(..) , (<$>), (<*>) , (<$)-#if MIN_VERSION_mtl(2,2,0)- , Control.Monad.State.modify'-#endif ) where @@ -20,6 +17,7 @@ import Data.Foldable as Fold import Data.Maybe +import Agda.Utils.Either import Agda.Utils.Except ( Error(strMsg) , MonadError(catchError, throwError)@@ -36,19 +34,11 @@ -- Conditionals and monads ------------------------------------------------ --- | @when_@ is just @Control.Monad.when@ with a more general type.-when_ :: Monad m => Bool -> m a -> m ()-when_ b m = when b $ m >> return ()---- | @unless_@ is just @Control.Monad.unless@ with a more general type.-unless_ :: Monad m => Bool -> m a -> m ()-unless_ b m = unless b $ m >> return ()--whenM :: Monad m => m Bool -> m a -> m ()-whenM c m = c >>= (`when_` m)+whenM :: Monad m => m Bool -> m () -> m ()+whenM c m = c >>= (`when` m) -unlessM :: Monad m => m Bool -> m a -> m ()-unlessM c m = c >>= (`unless_` m)+unlessM :: Monad m => m Bool -> m () -> m ()+unlessM c m = c >>= (`unless` m) -- | Monadic guard. guardM :: (Monad m, MonadPlus m) => m Bool -> m ()@@ -85,11 +75,19 @@ anyM xs f = orM $ fmap f xs -- | Lazy monadic disjunction with @Either@ truth values.+-- Returns the last error message if all fail. altM1 :: Monad m => (a -> m (Either err b)) -> [a] -> m (Either err b) altM1 f [] = __IMPOSSIBLE__ altM1 f [a] = f a altM1 f (a : as) = either (const $ altM1 f as) (return . Right) =<< f a +-- | Lazy monadic disjunction with accumulation of errors in a monoid.+-- Errors are discarded if we succeed.+orEitherM :: (Monoid e, Monad m, Functor m) => [m (Either e b)] -> m (Either e b)+orEitherM [] = return $ Left mempty+orEitherM (m : ms) = caseEitherM m (\e -> mapLeft (e `mappend`) <$> orEitherM ms)+ (return . Right)+ -- Loops gathering results in a Monoid ------------------------------------ -- | Generalized version of @mapM_ :: Monad m => (a -> m ()) -> [a] -> m ()@@@ -112,20 +110,19 @@ -- Continuation monad ----------------------------------------------------- -type Cont r a = (a -> r) -> r---- | 'Control.Monad.mapM' for the continuation monad. Terribly useful.-thread :: (a -> Cont r b) -> [a] -> Cont r [b]-thread f [] ret = ret []-thread f (x:xs) ret =- f x $ \y -> thread f xs $ \ys -> ret (y:ys)+-- Andreas, 2017-04-11, issue #2543+-- The terribly useful thread function is now UNUSED. [Sadistic laughter :)]+--+-- type Cont r a = (a -> r) -> r+--+-- -- | 'Control.Monad.mapM' for the continuation monad. Terribly useful.+-- thread :: (a -> Cont r b) -> [a] -> Cont r [b]+-- thread f [] ret = ret []+-- thread f (x:xs) ret =+-- f x $ \y -> thread f xs $ \ys -> ret (y:ys) -- Lists and monads ------------------------------------------------------- --- | Requires both lists to have the same lengths.-zipWithM' :: Monad m => (a -> b -> m c) -> [a] -> [b] -> m [c]-zipWithM' f xs ys = sequence (zipWith' f xs ys)- -- | A monadic version of @'mapMaybe' :: (a -> Maybe b) -> [a] -> [b]@. mapMaybeM #if __GLASGOW_HASKELL__ <= 708@@ -163,10 +160,10 @@ -- | Finally for the 'Error' class. Errors in the finally part take -- precedence over prior errors. -finally :: MonadError e m => m a -> m b -> m a+finally :: MonadError e m => m a -> m () -> m a first `finally` after = do r <- catchError (liftM Right first) (return . Left)- _ <- after+ after case r of Left e -> throwError e Right r -> return r@@ -181,25 +178,18 @@ -- | Bracket without failure. Typically used to preserve state. bracket_ :: Monad m => m a -- ^ Acquires resource. Run first.- -> (a -> m c) -- ^ Releases resource. Run last.+ -> (a -> m ()) -- ^ Releases resource. Run last. -> m b -- ^ Computes result. Run in-between. -> m b bracket_ acquire release compute = do resource <- acquire result <- compute- _ <- release resource+ release resource return result -- | Restore state after computation. localState :: MonadState s m => m a -> m a localState = bracket_ get put--#if !MIN_VERSION_mtl(2,2,0)-modify' :: MonadState s m => (s -> s) -> m ()-modify' f = do- x <- get- put $! f x-#endif -- Read -------------------------------------------------------------------
+ src/full/Agda/Utils/Monoid.hs view
@@ -0,0 +1,22 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++-- | More monoids.++module Agda.Utils.Monoid where++import Data.Semigroup (Semigroup(..))+import Data.Monoid (Monoid(..))++-- | Maximum of on-negative (small) natural numbers.++newtype MaxNat = MaxNat { getMaxNat :: Int }+ deriving (Num, Eq, Ord, Show, Enum)++instance Semigroup MaxNat where+ (<>) = max++instance Monoid MaxNat where+ mempty = 0+ mappend = (<>)+ mconcat [] = 0+ mconcat ms = maximum ms
src/full/Agda/Utils/Parser/MemoisedCPS.hs view
@@ -24,13 +24,16 @@ module Agda.Utils.Parser.MemoisedCPS ( ParserClass(..)+ , sat, token, tok, doc+ , DocP, bindP, choiceP, seqP, starP, atomP , Parser , ParserWithGrammar ) where import Control.Applicative import Control.Monad (ap, liftM2)-import Control.Monad.State.Strict (State, evalState, get, put)+import Control.Monad.State.Strict (State, evalState, runState, get, put, modify')+ import Data.Array import Data.Hashable import qualified Data.HashMap.Strict as Map@@ -39,11 +42,13 @@ import Data.HashSet (HashSet) import qualified Data.IntMap.Strict as IntMap import Data.IntMap.Strict (IntMap)-import Data.List+import qualified Data.List as List+import Data.Maybe+ import Text.PrettyPrint.HughesPJ hiding (empty) import qualified Text.PrettyPrint.HughesPJ as PP -import Agda.Utils.Monad (modify')+import Agda.Utils.Pretty ( mparens ) #include "undefined.h" import Agda.Utils.Impossible@@ -95,11 +100,15 @@ p input i $ \j x -> unP (f x) input j k instance Functor (Parser k r tok) where- fmap f p = p >>= return . f+ fmap f (P p) = P $ \input i k ->+ p input i $ \i -> k i . f instance Applicative (Parser k r tok) where- pure x = P $ \_ i k -> k i x- (<*>) = ap+ pure x = P $ \_ i k -> k i x+ P p1 <*> P p2 = P $ \input i k ->+ p1 input i $ \i f ->+ p2 input i $ \i x ->+ k i (f x) instance Alternative (Parser k r tok) where empty = P $ \_ _ _ -> return []@@ -113,20 +122,15 @@ -- | Tries to print the parser, or returns 'PP.empty', depending on -- the implementation. This function might not terminate.- grammar :: p a -> Doc-- -- | Parses a single token.- token :: p tok-- -- | Parses a token satisfying the given predicate.- sat :: (tok -> Bool) -> p tok+ grammar :: Show k => p a -> Doc - -- | Parses a given token.- tok :: (Eq tok, Show tok) => tok -> p tok+ -- | Parses a token satisfying the given predicate. The computed+ -- value is returned.+ sat' :: (tok -> Maybe a) -> p a -- | Uses the given function to modify the printed representation -- (if any) of the given parser.- annotate :: (Doc -> Doc) -> p a -> p a+ annotate :: (DocP -> DocP) -> p a -> p a -- | Memoises the given parser. --@@ -143,27 +147,44 @@ -- inputs.) memoiseIfPrinting :: (Eq k, Hashable k, Show k) => k -> p r -> p r +-- | Uses the given document as the printed representation of the+-- given parser. The document's precedence is taken to be 'atomP'.++doc :: ParserClass p k r tok => Doc -> p a -> p a+doc d = annotate (\_ -> (d, atomP))++-- | Parses a token satisfying the given predicate.++sat :: ParserClass p k r tok => (tok -> Bool) -> p tok+sat p = sat' (\t -> if p t then Just t else Nothing)++-- | Parses a single token.++token :: ParserClass p k r tok => p tok+token = doc (text "·") (sat' Just)++-- | Parses a given token.++tok :: (ParserClass p k r tok, Eq tok, Show tok) => tok -> p tok+tok t = doc (text (show t)) (sat (t ==))+ instance ParserClass (Parser k r tok) k r tok where parse p toks = flip evalState IntMap.empty $ unP p (listArray (0, n - 1) toks) 0 $ \j x -> if j == n then return [x] else return []- where n = genericLength toks+ where n = List.genericLength toks grammar _ = PP.empty - token = P $ \input i k ->+ sat' p = P $ \input i k -> if inRange (bounds input) i then- (k $! (i + 1)) $! (input ! i)+ case p (input ! i) of+ Nothing -> return []+ Just x -> (k $! (i + 1)) $! x else return [] - sat p = do- t <- token- if p t then return t else empty-- tok t = sat (t ==)- annotate _ p = p memoiseIfPrinting _ p = p@@ -171,7 +192,7 @@ memoise key p = P $ \input i k -> do let alter j zero f m =- IntMap.alter (Just . f . maybe zero id) j m+ IntMap.alter (Just . f . fromMaybe zero) j m lookupTable = fmap (\m -> Map.lookup key =<< IntMap.lookup i m) get@@ -200,17 +221,51 @@ -- | An extended parser type, with some support for printing parsers. data ParserWithGrammar k r tok a =- PG (Bool -> Either (Parser k r tok a)- (State (HashSet k) Doc))+ PG (Bool -> Either (Parser k r tok a) (Docs k)) -- ^ Invariant: If the boolean is 'True', then the result must be -- @'Left' something@, and if the boolean is 'False', then the -- result must be @'Right' something@. +-- | Documents paired with precedence levels.++type DocP = (Doc, Int)++-- | Precedence of @>>=@.++bindP :: Int+bindP = 10++-- | Precedence of @<|>@.++choiceP :: Int+choiceP = 20++-- | Precedence of @<*>@.++seqP :: Int+seqP = 30++-- | Precedence of @⋆@ and @+@.++starP :: Int+starP = 40++-- | Precedence of atoms.++atomP :: Int+atomP = 50++-- | The extended parser type computes one top-level document, plus+-- one document per encountered memoisation key.+--+-- 'Nothing' is used to mark that a given memoisation key has been+-- seen, but that no corresponding document has yet been stored.++type Docs k = State (HashMap k (Maybe DocP)) DocP+ -- | A smart constructor. -pg :: Parser k r tok a ->- State (HashSet k) Doc ->- ParserWithGrammar k r tok a+pg :: Parser k r tok a -> Docs k -> ParserWithGrammar k r tok a pg p d = PG $ \b -> if b then Left p else Right d -- | Extracts the parser.@@ -218,56 +273,86 @@ parser :: ParserWithGrammar k r tok a -> Parser k r tok a parser (PG p) = either id __IMPOSSIBLE__ (p True) --- | Extracts the document.+-- | Extracts the documents. -doc :: ParserWithGrammar k r tok a -> State (HashSet k) Doc-doc (PG p) = either __IMPOSSIBLE__ id (p False)+docs :: ParserWithGrammar k r tok a -> Docs k+docs (PG p) = either __IMPOSSIBLE__ id (p False) instance Monad (ParserWithGrammar k r tok) where return = pure- p >>= f = pg (parser p >>= parser . f)- ((\d -> parens (d <+> text ">>= ?")) <$> doc p)+ p >>= f =+ pg (parser p >>= parser . f)+ ((\(d, p) -> (mparens (p < bindP) d <+> text ">>= ?", bindP))+ <$> docs p) instance Functor (ParserWithGrammar k r tok) where- fmap f p = pg (fmap f (parser p)) (doc p)+ fmap f p = pg (fmap f (parser p)) (docs p) instance Applicative (ParserWithGrammar k r tok) where- pure x = pg (pure x) (return (text "ε"))+ pure x = pg (pure x) (return (text "ε", atomP)) p1 <*> p2 = pg (parser p1 <*> parser p2)- (liftM2 (\d1 d2 -> parens (sep [d1, d2])) (doc p1) (doc p2))+ (liftM2 (\(d1, p1) (d2, p2) ->+ (sep [ mparens (p1 < seqP) d1+ , mparens (p2 < seqP) d2+ ], seqP))+ (docs p1) (docs p2)) +-- | A helper function.++starDocs :: String -> ParserWithGrammar k r tok a -> Docs k+starDocs s p =+ (\(d, p) -> (mparens (p < starP) d <+> text s, starP)) <$> docs p+ instance Alternative (ParserWithGrammar k r tok) where- empty = pg empty (return (text "∅"))+ empty = pg empty (return (text "∅", atomP)) p1 <|> p2 = pg (parser p1 <|> parser p2)- (liftM2 (\d1 d2 -> parens (sep [d1, text "|", d2])) (doc p1) (doc p2))+ (liftM2 (\(d1, p1) (d2, p2) ->+ (sep [ mparens (p1 < choiceP) d1+ , text "|"+ , mparens (p2 < choiceP) d2+ ], choiceP))+ (docs p1) (docs p2)) - many p = pg (many (parser p)) ((<+> text "⋆") . parens <$> doc p)- some p = pg (some (parser p)) ((<+> text "+") . parens <$> doc p)+ many p = pg (many (parser p)) (starDocs "⋆" p)+ some p = pg (some (parser p)) (starDocs "+" p) +-- | Pretty-prints a memoisation key.++prettyKey :: Show k => k -> DocP+prettyKey key = (text ("<" ++ show key ++ ">"), atomP)+ -- | A helper function. -memoiseDoc ::+memoiseDocs :: (Eq k, Hashable k, Show k) =>- k -> ParserWithGrammar k r tok r -> State (HashSet k) Doc-memoiseDoc key p = do- s <- get- if Set.member key s then- return (text ("<" ++ show key ++ ">"))- else do- put (Set.insert key s)- (\d -> parens $- text ("μ " ++ show key ++ ".") $+$ nest 2 d) <$>- doc p+ k -> ParserWithGrammar k r tok r -> Docs k+memoiseDocs key p = do+ r <- Map.lookup key <$> get+ case r of+ Just _ -> return ()+ Nothing -> do+ modify' (Map.insert key Nothing)+ d <- docs p+ modify' (Map.insert key (Just d))+ return (prettyKey key) instance ParserClass (ParserWithGrammar k r tok) k r tok where parse p = parse (parser p)- grammar p = evalState (doc p) Set.empty- token = pg token (return (text "·"))- sat p = pg (sat p) (return (text "sat ?"))- tok t = pg (tok t) (return (text (show t)))- annotate f p = pg (parser p) (f <$> doc p)+ sat' p = pg (sat' p) (return (text "<sat ?>", atomP))+ annotate f p = pg (parser p) (f <$> docs p) memoise key p = pg (memoise key (parser p))- (memoiseDoc key p)- memoiseIfPrinting key p = pg (parser p) (memoiseDoc key p)+ (memoiseDocs key p)+ memoiseIfPrinting key p = pg (parser p) (memoiseDocs key p)++ grammar p =+ d+ $+$+ nest 2 (foldr1 ($+$) $+ text "where" :+ map (\(k, d) -> fst (prettyKey k) <+> text "∷=" <+>+ maybe __IMPOSSIBLE__ fst d)+ (Map.toList ds))+ where+ ((d, _), ds) = runState (docs p) Map.empty
src/full/Agda/Utils/PartialOrd.hs view
@@ -3,7 +3,6 @@ import Data.Functor import Data.Maybe-import Data.List import Data.Semigroup import Data.Set (Set) import qualified Data.Set as Set
src/full/Agda/Utils/Permutation.hs view
@@ -7,13 +7,14 @@ import Data.IntMap (IntMap) import qualified Data.IntMap as IntMap-import Data.List hiding (drop, null) import qualified Data.List as List import Data.Maybe import Data.Array import Data.Foldable (Foldable) import Data.Traversable (Traversable)++import Data.Data (Data) import Data.Typeable (Typeable) import Agda.Syntax.Position (KillRange(..))@@ -37,7 +38,7 @@ -- @Perm : {m : Nat}(n : Nat) -> Vec (Fin n) m -> Permutation@ -- @m@ is the 'size' of the permutation. data Permutation = Perm { permRange :: Int, permPicks :: [Int] }- deriving (Eq, Typeable)+ deriving (Eq, Typeable, Data) instance Show Permutation where show (Perm n xs) = showx [0..n - 1] ++ " -> " ++ showx xs@@ -101,7 +102,7 @@ where tabulate m = for [0..n-1] $ \ i -> IntMap.lookup i m instance InversePermute (Int -> a) [Maybe a] where- inversePermute (Perm n xs) f = for [0..n-1] $ \ x -> f <$> findIndex (x ==) xs+ inversePermute (Perm n xs) f = for [0..n-1] $ \ x -> f <$> List.findIndex (x ==) xs -- | Identity permutation. idP :: Int -> Permutation@@ -113,7 +114,7 @@ -- | Pick the elements that are not picked by the permutation. droppedP :: Permutation -> Permutation-droppedP (Perm n xs) = Perm n $ [0..n-1] \\ xs+droppedP (Perm n xs) = Perm n $ [0..n-1] List.\\ xs -- | @liftP k@ takes a @Perm {m} n@ to a @Perm {m+k} (n+k)@. -- Analogous to 'Agda.TypeChecking.Substitution.liftS',@@ -148,9 +149,9 @@ compactP :: Permutation -> Permutation compactP (Perm n xs) = Perm m $ map adjust xs where- m = genericLength xs- missing = [0..n - 1] \\ xs- holesBelow k = genericLength $ filter (< k) missing+ m = List.genericLength xs+ missing = [0..n - 1] List.\\ xs+ holesBelow k = List.genericLength $ filter (< k) missing adjust k = k - holesBelow k -- | @permute (reverseP p) xs ==@@ -222,7 +223,7 @@ { dropN :: Int -- ^ Non-negative number of things to drop. , dropFrom :: a -- ^ Where to drop from. }- deriving (Eq, Ord, Show, Typeable, Functor, Foldable, Traversable)+ deriving (Eq, Ord, Show, Typeable, Data, Functor, Foldable, Traversable) instance KillRange a => KillRange (Drop a) where killRange = fmap killRange
src/full/Agda/Utils/Pointer.hs view
@@ -1,5 +1,7 @@-{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE BangPatterns #-} {-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE StandaloneDeriving #-} module Agda.Utils.Pointer ( Ptr, newPtr, derefPtr, setPtr@@ -15,11 +17,22 @@ import Data.IORef import Data.Traversable import System.IO.Unsafe-import Data.Typeable ( Typeable ) +import Data.Data (Data (..))+import Data.Typeable (Typeable)++#include "undefined.h"+import Agda.Utils.Impossible+ data Ptr a = Ptr { ptrTag :: !Integer , ptrRef :: !(IORef a) }- deriving (Typeable)+ deriving (Typeable, Data)++-- cheating because you shouldn't be digging this far anyway+instance Typeable a => Data (IORef a) where+ gunfold _ _ _ = __IMPOSSIBLE__+ toConstr = __IMPOSSIBLE__+ dataTypeOf = __IMPOSSIBLE__ {-# NOINLINE freshVar #-} freshVar :: MVar Integer
src/full/Agda/Utils/Pretty.hs view
@@ -1,5 +1,9 @@ {-# LANGUAGE CPP #-} +#if __GLASGOW_HASKELL__ <= 708+{-# LANGUAGE DeriveDataTypeable #-}+#endif+ {-| Pretty printing functions. -} module Agda.Utils.Pretty@@ -8,9 +12,17 @@ ) where import Data.Int ( Int32 )+import Data.Data (Data(..)) +#if __GLASGOW_HASKELL__ <= 708+import Data.Typeable ( Typeable )+#endif+ import Text.PrettyPrint hiding (TextDetails(Str), empty) +#include "undefined.h"+import Agda.Utils.Impossible+ -- * Pretty class -- | While 'Show' is for rendering data in Haskell syntax,@@ -23,20 +35,17 @@ class Pretty a where pretty :: a -> Doc prettyPrec :: Int -> a -> Doc+ prettyList :: [a] -> Doc pretty = prettyPrec 0 prettyPrec = const pretty+ prettyList = brackets . prettyList_ -- | Use instead of 'show' when printing to world. prettyShow :: Pretty a => a -> String prettyShow = render . pretty --- | Space separated list of pretty things.--prettyList :: Pretty a => [a] -> Doc-prettyList = sep . map (prettyPrec 10000)- -- * Pretty instances instance Pretty Bool where pretty = text . show@@ -46,13 +55,18 @@ instance Pretty Char where pretty c = text [c]+ prettyList = text instance Pretty Doc where pretty = id -instance Pretty String where- pretty = text+instance Pretty a => Pretty (Maybe a) where+ prettyPrec p Nothing = text "Nothing"+ prettyPrec p (Just x) = mparens (p > 0) $ text "Just" <+> prettyPrec 10 x +instance Pretty a => Pretty [a] where+ pretty = prettyList+ -- * 'Doc' utilities pwords :: String -> [Doc]@@ -61,6 +75,15 @@ fwords :: String -> Doc fwords = fsep . pwords +-- | Comma separated list, without the brackets.+prettyList_ :: Pretty a => [a] -> Doc+prettyList_ = fsep . punctuate comma . map pretty++-- ASR (2016-12-13): In pretty >= 1.1.2.0 the below function 'mparens'+-- is called 'maybeParens'. I didn't use that name due to the issue+-- https://github.com/haskell/pretty/issues/40.++-- | Apply 'parens' to 'Doc' if boolean is true. mparens :: Bool -> Doc -> Doc mparens True = parens mparens False = id@@ -81,3 +104,22 @@ multiLineText :: String -> Doc multiLineText = vcat . map text . lines ++#if __GLASGOW_HASKELL__ <= 708+deriving instance Typeable Doc+#endif++-- cheating because you shouldn't be digging this far anyway+instance Data Doc where+ gunfold _ _ _ = __IMPOSSIBLE__+ toConstr = __IMPOSSIBLE__+ dataTypeOf = __IMPOSSIBLE__++infixl 6 <?>+-- | @a <?> b = hang a 2 b@+(<?>) :: Doc -> Doc -> Doc+a <?> b = hang a 2 b++-- | @pshow = text . pretty@+pshow :: Show a => a -> Doc+pshow = text . show
src/full/Agda/Utils/Size.hs view
@@ -29,35 +29,33 @@ import Agda.Utils.Null -- | The size of a collection (i.e., its length).------ Should fit into an @Int@. TODO: change to @Int@. class Sized a where- size :: Integral n => a -> n+ size :: a -> Int instance Sized [a] where size = List.genericLength instance Sized (IntMap a) where- size = fromIntegral . IntMap.size+ size = IntMap.size instance Sized IntSet where- size = fromIntegral . IntSet.size+ size = IntSet.size instance Sized (Map k a) where- size = fromIntegral . Map.size+ size = Map.size instance Sized (Set a) where- size = fromIntegral . Set.size+ size = Set.size instance Sized (HashMap k a) where- size = fromIntegral . HashMap.size+ size = HashMap.size instance Sized (HashSet a) where- size = fromIntegral . HashSet.size+ size = HashSet.size instance Sized (Seq a) where- size = fromIntegral . Seq.length+ size = Seq.length -- | Thing decorated with its size.@@ -74,7 +72,7 @@ -- | Return the cached size. instance Sized (SizedThing a) where- size = fromIntegral . theSize+ size = theSize instance Null a => Null (SizedThing a) where empty = SizedThing 0 empty
src/full/Agda/Utils/String.hs view
@@ -1,7 +1,7 @@ module Agda.Utils.String where import Data.Char-import Data.List+import qualified Data.List as List import Numeric @@ -30,6 +30,18 @@ escapeChars = "\"\\" +-- | Adds hyphens around the given string+--+-- >>> putStrLn $ delimiter "Title"+-- ———— Title —————————————————————————————————————————————————++delimiter :: String -> String+delimiter s = concat [ replicate 4 '\x2014'+ , " ", s, " "+ , replicate (54 - length s) '\x2014'+ ]++ -- | Shows a non-negative integer using the characters ₀-₉ instead of -- 0-9. @@ -47,7 +59,7 @@ -- | Indents every line the given number of steps. indent :: Integral i => i -> String -> String-indent i = unlines . map (genericReplicate i ' ' ++) . lines+indent i = unlines . map (List.genericReplicate i ' ' ++) . lines newtype Str = Str { unStr :: String } deriving Eq@@ -58,7 +70,7 @@ -- | Show a number using comma to separate powers of 1,000. showThousandSep :: Show a => a -> String-showThousandSep = reverse . intercalate "," . chop 3 . reverse . show+showThousandSep = reverse . List.intercalate "," . chop 3 . reverse . show -- | Remove leading whitespace. ltrim :: String -> String
src/full/Agda/Utils/Suffix.hs view
@@ -81,7 +81,9 @@ :: (String -> Bool) -- ^ Is the given name already taken? -> String -- ^ Name of which we want an available variant. -> String -- ^ Name extended by suffix that is not taken already.-nameVariant taken x = addSuffix x $ trampoline step $ Prime 0+nameVariant taken x+ | taken x = addSuffix x $ trampoline step $ Subscript 1+ | otherwise = x where -- if the current suffix is taken, repeat with next suffix, else done step s = if taken (addSuffix x s) then Right (nextSuffix s) else Left s
+ src/full/Agda/Utils/Three.hs view
@@ -0,0 +1,24 @@+-- | Tools for a 3-element type.++module Agda.Utils.Three where++-- | Enum type with 3 elements.+--+data Three+ = One+ | Two+ | Three+ deriving (Eq, Ord, Show, Bounded, Enum)++-- | Partition a list into 3 groups.+--+-- Preserves the relative order or elements.+--+partition3 :: (a -> Three) -> [a] -> ([a], [a], [a])+partition3 f = loop where+ loop [] = ([], [], [])+ loop (x:xs) = case f x of+ One -> (x:as, bs, cs)+ Two -> (as, x:bs, cs)+ Three -> (as, bs, x:cs)+ where (as, bs, cs) = loop xs
src/full/Agda/Utils/Time.hs view
@@ -12,6 +12,7 @@ , getCPUTime , measureTime , CPUTime(..)+ , fromMilliseconds ) where import Control.Monad.Trans@@ -36,6 +37,9 @@ newtype CPUTime = CPUTime Integer deriving (Eq, Show, Ord, Num, Real, Enum, Integral)++fromMilliseconds :: Integer -> CPUTime+fromMilliseconds n = CPUTime (n * 1000000000) -- | Print CPU time in milli (10^-3) seconds.
src/full/Agda/Utils/Trie.hs view
@@ -2,26 +2,38 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} +#if __GLASGOW_HASKELL__ <= 708+{-# LANGUAGE DeriveDataTypeable #-}+#endif+ -- | Strict tries (based on "Data.Map.Strict" and "Agda.Utils.Maybe.Strict"). module Agda.Utils.Trie- ( Trie+ ( Trie(..) , empty, singleton, everyPrefix, insert, insertWith, union, unionWith , adjust, delete- , toList, toAscList+ , toList, toAscList, toListOrderedBy , lookup, member, lookupPath, lookupTrie+ , mapSubTries, filter ) where -import Prelude hiding (null, lookup)+import Prelude hiding (null, lookup, filter) import qualified Prelude +import Control.Monad import Data.Function import Data.Functor import Data.Foldable (Foldable) import qualified Data.Maybe as Lazy import Data.Map.Strict (Map) import qualified Data.Map.Strict as Map+import Data.Monoid+import qualified Data.List as List +#if __GLASGOW_HASKELL__ <= 708+import Data.Typeable ( Typeable )+#endif+ import qualified Agda.Utils.Maybe.Strict as Strict import Agda.Utils.Null @@ -29,7 +41,14 @@ -- -- With the strict 'Maybe' type, 'Trie' is also strict in 'v'. data Trie k v = Trie !(Strict.Maybe v) !(Map k (Trie k v))- deriving (Show, Eq, Functor, Foldable)+ deriving ( Show+ , Eq+ , Functor+ , Foldable+#if __GLASGOW_HASKELL__ <= 708+ , Typeable+#endif+ ) -- | Empty trie. instance Null (Trie k v) where@@ -103,6 +122,25 @@ , (ks, v) <- toAscList t ] +-- | Convert to list where nodes at the same level are ordered according to the+-- given ordering.+toListOrderedBy :: Ord k => (v -> v -> Ordering) -> Trie k v -> [([k], v)]+toListOrderedBy cmp (Trie mv ts) =+ Strict.maybeToList (([],) <$> mv) +++ [ (k : ks, v) | (k, t) <- List.sortBy (cmp' `on` val . snd) $ Map.toAscList ts,+ (ks, v) <- toListOrderedBy cmp t ]+ where+ cmp' Strict.Nothing Strict.Just{} = LT+ cmp' Strict.Just{} Strict.Nothing = GT+ cmp' Strict.Nothing Strict.Nothing = EQ+ cmp' (Strict.Just x) (Strict.Just y) = cmp x y+ val (Trie mv _) = mv++-- | Create new values based on the entire subtrie. Almost, but not quite+-- comonad extend.+mapSubTries :: Ord k => (Trie k u -> Maybe v) -> Trie k u -> Trie k v+mapSubTries f t@(Trie mv ts) = Trie (Strict.toStrict (f t)) (fmap (mapSubTries f) ts)+ -- | Returns the value associated with the given key, if any. lookup :: Ord k => [k] -> Trie k v -> Maybe v lookup [] (Trie v _) = Strict.toLazy v@@ -125,4 +163,13 @@ lookupTrie :: Ord k => [k] -> Trie k v -> Trie k v lookupTrie [] t = t lookupTrie (k : ks) (Trie _ cs) = maybe empty (lookupTrie ks) (Map.lookup k cs)++-- | Filter a trie.+filter :: Ord k => (v -> Bool) -> Trie k v -> Trie k v+filter p (Trie mv ts) = Trie mv' (Map.filter (not . null) $ filter p <$> ts)+ where+ mv' =+ case mv of+ Strict.Just v | p v -> mv+ _ -> Strict.Nothing
+ src/full/Agda/Utils/TypeLevel.hs view
@@ -0,0 +1,130 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE ScopedTypeVariables #-}+-- We need undecidable instances for the definition of @Foldr@,+-- and @Domains@ and @CoDomain@ using @If@ for instance.+{-# LANGUAGE UndecidableInstances #-}++module Agda.Utils.TypeLevel where++import Data.Proxy+import GHC.Exts (Constraint)++------------------------------------------------------------------+-- CONSTRAINTS+------------------------------------------------------------------++-- | @All p as@ ensures that the constraint @p@ is satisfied by+-- all the 'types' in @as@.+-- (Types is between scare-quotes here because the code is+-- actually kind polymorphic)++type family All (p :: k -> Constraint) (as :: [k]) :: Constraint where+ All p '[] = ()+ All p (a ': as) = (p a, All p as)++------------------------------------------------------------------+-- FUNCTIONS+-- Type-level and Kind polymorphic versions of usual value-level+-- functions.+------------------------------------------------------------------++-- | On Booleans+type family If (b :: Bool) (l :: k) (r :: k) :: k where+ If 'True l r = l+ If 'False l r = r++-- | On Lists+type family Foldr (c :: k -> l -> l) (n :: l) (as :: [k]) :: l where+ Foldr c n '[] = n+ Foldr c n (a ': as) = c a (Foldr c n as)++-- | Version of @Foldr@ taking a defunctionalised argument so+-- that we can use partially applied functions.+type family Foldr' (c :: Function k (Function l l -> *) -> *)+ (n :: l) (as :: [k]) :: l where+ Foldr' c n '[] = n+ Foldr' c n (a ': as) = Apply (Apply c a) (Foldr' c n as)++type family Map (f :: Function k l -> *) (as :: [k]) :: [l] where+ Map f as = Foldr' (ConsMap0 f) '[] as++data ConsMap0 :: (Function k l -> *) -> Function k (Function [l] [l] -> *) -> *+data ConsMap1 :: (Function k l -> *) -> k -> Function [l] [l] -> *+type instance Apply (ConsMap0 f) a = ConsMap1 f a+type instance Apply (ConsMap1 f a) tl = Apply f a ': tl++type family Constant (b :: l) (as :: [k]) :: [l] where+ Constant b as = Map (Constant1 b) as++------------------------------------------------------------------+-- TYPE FORMERS+------------------------------------------------------------------++-- | @Arrows [a1,..,an] r@ corresponds to @a1 -> .. -> an -> r@+-- | @Products [a1,..,an]@ corresponds to @(a1, (..,( an, ())..))@++type Arrows (as :: [*]) (r :: *) = Foldr (->) r as+type Products (as :: [*]) = Foldr (,) () as++-- | @IsBase t@ is @'True@ whenever @t@ is *not* a function space.++type family IsBase (t :: *) :: Bool where+ IsBase (a -> t) = 'False+ IsBase a = 'True++-- | Using @IsBase@ we can define notions of @Domains@ and @CoDomains@+-- which *reduce* under positive information @IsBase t ~ 'True@ even+-- though the shape of @t@ is not formally exposed++type family Domains (t :: *) :: [*] where+ Domains t = If (IsBase t) '[] (Domains' t)+type family Domains' (t :: *) :: [*] where+ Domains' (a -> t) = a ': Domains t++type family CoDomain (t :: *) :: * where+ CoDomain t = If (IsBase t) t (CoDomain' t)+type family CoDomain' (t :: *) :: * where+ CoDomain' (a -> t) = CoDomain t++------------------------------------------------------------------+-- TYPECLASS MAGIC+------------------------------------------------------------------++-- | @Currying as b@ witnesses the isomorphism between @Arrows as b@+-- and @Products as -> b@. It is defined as a type class rather+-- than by recursion on a singleton for @as@ so all of that these+-- conversions are inlined at compile time for concrete arguments.++class Currying as b where+ uncurrys :: Proxy as -> Proxy b -> Arrows as b -> Products as -> b+ currys :: Proxy as -> Proxy b -> (Products as -> b) -> Arrows as b++instance Currying '[] b where+ uncurrys _ _ f = \ () -> f+ currys _ _ f = f ()++instance Currying as b => Currying (a ': as) b where+ uncurrys _ p f = uncurry $ uncurrys (Proxy :: Proxy as) p . f+ currys _ p f = currys (Proxy :: Proxy as) p . curry f++------------------------------------------------------------------+-- DEFUNCTIONALISATION+-- Cf. Eisenberg and Stolarek's paper:+-- Promoting Functions to Type Families in Haskell+------------------------------------------------------------------++data Function :: * -> * -> *++data Constant0 :: Function a (Function b a -> *) -> *+data Constant1 :: * -> Function b a -> *++type family Apply (t :: Function k l -> *) (u :: k) :: l++type instance Apply Constant0 a = Constant1 a+type instance Apply (Constant1 a) b = a
src/full/Agda/Utils/Warshall.hs view
@@ -17,7 +17,7 @@ import Data.Maybe import Data.Array-import Data.List+import qualified Data.List as List import Data.Map (Map) import qualified Data.Map as Map @@ -42,7 +42,7 @@ warshallG :: (SemiRing edge, Ord node) => AdjList node edge -> AdjList node edge warshallG g = fromMatrix $ warshall m where- nodes = zip (nub $ Map.keys g ++ map fst (concat $ Map.elems g))+ nodes = zip (List.nub $ Map.keys g ++ map fst (concat $ Map.elems g)) [0..] len = length nodes b = ((0,0), (len - 1,len - 1))@@ -322,15 +322,15 @@ -- compute the sets of flexible and rigid node numbers ns = Map.keys (nodeMap gr) -- a set of flexible variables- flexs = foldl' (\ l k -> case k of (Flex i) -> i : l- (Rigid _) -> l) [] ns+ flexs = List.foldl' (\ l -> \case (Flex i ) -> i : l+ (Rigid _) -> l) [] ns -- a set of rigid variables- rigids = foldl' (\ l k -> case k of (Flex _) -> l- (Rigid i) -> i : l) [] ns+ rigids = List.foldl' (\ l -> \case (Flex _ ) -> l+ (Rigid i) -> i : l) [] ns -- rigid matrix indices- rInds = foldl' (\ l r -> let Just i = Map.lookup (Rigid r) (nodeMap gr)- in i : l) [] rigids+ rInds = List.foldl' (\ l r -> let Just i = Map.lookup (Rigid r) (nodeMap gr)+ in i : l) [] rigids -- check whether there is a solution -- d = [ m!(i,i) | i <- [0 .. (n-1)] ] -- diagonal@@ -381,7 +381,7 @@ loop1 flxs (r:rgds) subst = let row = fromJust $ Map.lookup (Rigid r) (nodeMap gr) (flxs',subst') =- foldl' (\ (flx,sub) f ->+ List.foldl' (\ (flx,sub) f -> let col = fromJust $ Map.lookup (Flex f) (nodeMap gr) in case (inScope f r, m!(row,col)) of -- Finite z | z <= 0 ->
src/full/Agda/Version.hs view
@@ -1,7 +1,7 @@ module Agda.Version where import Data.Version-import Data.List+import Data.List ( intercalate, map ) import qualified Paths_Agda as PA
src/full/undefined.h view
@@ -1,2 +1,7 @@ #define __IMPOSSIBLE__ (throwImpossible (Impossible __FILE__ __LINE__)) #define __IMPOSSIBLE_TERM__ (impossibleTerm __FILE__ __LINE__)++#define __IMPOSSIBLE_VERBOSE__ (\ s -> do { reportSLn "impossible" 10 s ; __IMPOSSIBLE__ })++#define __UNREACHABLE__ (throwImpossible (Unreachable __FILE__ __LINE__))+#define __CRASH_WHEN__ (\ k n -> whenExactVerbosity k n __UNREACHABLE__)
+ stack-7.10.3.yaml view
@@ -0,0 +1,10 @@+resolver: lts-6.35++extra-deps:+- STMonadTrans-0.4.3+- cpphs-1.20.8+- equivalence-0.3.2++# Local packages, usually specified by relative directory name+packages:+- '.'
stack-7.8.4.yaml view
@@ -1,27 +1,35 @@+resolver: lts-2.22+ flags:- semigroups:- bytestring-builder: false-packages:-- '.'+ QuickCheck:+ base4: true+ base4point8: false+ extra-deps:-- binary-0.8.4.1-- boxes-0.1.4-- data-hash-0.2.0.1 - EdisonAPI-1.3.1 - EdisonCore-1.3.1.1-- equivalence-0.3.1+- QuickCheck-2.8.2+- STMonadTrans-0.4.3+- binary-0.7.2.1+- boxes-0.1.4+- cpphs-1.20.8+- data-hash-0.2.0.1+- equivalence-0.3.2 - fail-4.9.0.0-- geniplate-mirror-0.7.4+- geniplate-mirror-0.7.5 - gitrev-1.2.0-- haskeline-0.7.2.3+- haskeline-0.7.1.3 - ieee754-0.7.8 - monadplus-1.4.2+- mtl-2.2.1 - murmur-hash-0.1.0.9-- QuickCheck-2.9.2 - regex-tdfa-1.2.2 - regex-tdfa-text-1.0.0.3-- semigroups-0.18.2-- STMonadTrans-0.3.3-- tasty-silver-3.1.9+- semigroups-0.18+- transformers-0.4.2.0+- transformers-compat-0.4.0.4 - void-0.7.1-resolver: lts-2.22++# Local packages, usually specified by relative directory name+packages:+- '.'
− stack-8.0.1.yaml
@@ -1,5 +0,0 @@-resolver: lts-7.13--# Local packages, usually specified by relative directory name-packages:-- '.'
+ stack-8.0.2.yaml view
@@ -0,0 +1,5 @@+resolver: lts-9.1++# Local packages, usually specified by relative directory name+packages:+- '.'