ruler-core (empty) → 1.0
raw patch · 37 files changed
+7747/−0 lines, 37 filesdep +arraydep +basedep +containersbuild-type:Customsetup-changed
Dependencies added: array, base, containers, directory, fgl, filepath, haskell98, mtl, uuagc, uulib
Files
- README +66/−0
- Setup.hs +7/−0
- dist/build/ruler-core/ruler-core-tmp/Ast.hs +156/−0
- dist/build/ruler-core/ruler-core-tmp/Errs.hs +484/−0
- dist/build/ruler-core/ruler-core-tmp/Scanner.hs +353/−0
- dist/build/ruler-core/ruler-core-tmp/Transform.hs too large to diff
- examples/Alias.rul +47/−0
- examples/ConMatch.rul +22/−0
- examples/CycRepmin.rul +63/−0
- examples/Eval.rul +56/−0
- examples/EvalAsAg.rul +42/−0
- examples/HelloWorld.rul +23/−0
- examples/Internal.rul +46/−0
- examples/JsMenu.rul +131/−0
- examples/JsMenu2.rul +101/−0
- examples/RenameAttr.rul +40/−0
- examples/Repmin.rul +62/−0
- examples/Sum.rul +40/−0
- examples/TypedEval.rul +27/−0
- examples/Unknown.rul +360/−0
- ruler-core.cabal +20/−0
- src/Ast.ag +10/−0
- src/AstAG.ag +334/−0
- src/Common.hs +134/−0
- src/DepAnalysis.hs +207/−0
- src/Env.hs +130/−0
- src/Errs.ag +207/−0
- src/Main.hs +48/−0
- src/Opts.hs +95/−0
- src/Parser.hs +258/−0
- src/Pretty.hs +187/−0
- src/Scanner.x +140/−0
- src/TargetGraph.ag +104/−0
- src/TargetHaskell.ag +644/−0
- src/TargetJs.ag +425/−0
- src/Transform.ag +2670/−0
- uuagc_options +8/−0
+ README view
@@ -0,0 +1,66 @@+Ruler-core++Ruler-core is an attribute grammar preprocessor, with a number of extensions to deal with (inference)-rule based systems.++How to get it to run:++1) checkout the repository or obtain the sources in another way+2) run cabal-install of ruler-core. This will install the dependencies, but will fail to build ruler-core itself.+3) run the cabal-files manually. The following is a trace:++$ runghc Setup.hs configure --user+Configuring ruler-core-0.9...+++$ runghc Setup.hs build+Preprocessing executables for ruler-core-0.9...+"processing: src/Ast.ag"+"processing: src/Transform.ag"+"processing: src/Errs.ag"+Building ruler-core-0.9...+[ 1 of 11] Compiling Env ( src/Env.hs, dist/build/ruler-core/ruler-core-tmp/Env.o )+[ 2 of 11] Compiling Pretty ( src/Pretty.hs, dist/build/ruler-core/ruler-core-tmp/Pretty.o )+[ 3 of 11] Compiling Common ( src/Common.hs, dist/build/ruler-core/ruler-core-tmp/Common.o )+[ 4 of 11] Compiling Ast ( dist/build/ruler-core/ruler-core-tmp/Ast.hs, dist/build/ruler-core/ruler-core-tmp/Ast.o )+[ 5 of 11] Compiling DepAnalysis ( src/DepAnalysis.hs, dist/build/ruler-core/ruler-core-tmp/DepAnalysis.o )+[ 6 of 11] Compiling Opts ( src/Opts.hs, dist/build/ruler-core/ruler-core-tmp/Opts.o )+[ 7 of 11] Compiling Errs ( dist/build/ruler-core/ruler-core-tmp/Errs.hs, dist/build/ruler-core/ruler-core-tmp/Errs.o )+[ 8 of 11] Compiling Transform ( dist/build/ruler-core/ruler-core-tmp/Transform.hs, dist/build/ruler-core/ruler-core-tmp/Transform.o )+[ 9 of 11] Compiling Parser ( src/Parser.hs, dist/build/ruler-core/ruler-core-tmp/Parser.o )+[10 of 11] Compiling Scanner ( dist/build/ruler-core/ruler-core-tmp/Scanner.hs, dist/build/ruler-core/ruler-core-tmp/Scanner.o )+[11 of 11] Compiling Main ( src/Main.hs, dist/build/ruler-core/ruler-core-tmp/Main.o )+Linking dist/build/ruler-core/ruler-core ...+++To see a list of command-line options:+$ ./dist/build/ruler-core/ruler-core +No AG source file specified.+Usage: imp-visits <OPTION ...> <ag-file> ...+ -o path --output=path output .hs file+ -v --verbose verbose output+ --pretty pp AST to STDOUT+ --tokens print tokens to STDOUT+ --haskell generate Haskell code (default)+ --js generate Javascript code+ -f --force force code generation+ --nodata do not generate data types+ --graph=path output .dot file+ --noline do not generate LINE pragmas+++Try an example:+$ ./dist/build/ruler-core/ruler-core examples/CycRepmin.rul -o test.hs+$ ghci test.hs+GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help+Loading package ghc-prim ... linking ... done.+Loading package integer-gmp ... linking ... done.+Loading package base ... linking ... done.+Loading package ffi-1.0 ... linking ... done.+[1 of 1] Compiling CycRepmin ( test.hs, interpreted )+Ok, modules loaded: CycRepmin.+*CycRepmin> main+Loading package syb-0.1.0.2 ... linking ... done.+Loading package base-3.0.3.2 ... linking ... done.+Loading package mtl-1.1.0.2 ... linking ... done.+Tree_Bin {l_Tree_Bin = Tree_Leaf {x_Tree_Leaf = 1}, r_Tree_Bin = Tree_Bin {l_Tree_Bin = Tree_Leaf {x_Tree_Leaf = 1}, r_Tree_Bin = Tree_Leaf {x_Tree_Leaf = 1}}}+*CycRepmin>
+ Setup.hs view
@@ -0,0 +1,7 @@+module Main where++import Distribution.Simple+import Distribution.Simple.UUAGC++main = defaultMainWithHooks uuagcUserHook+
+ dist/build/ruler-core/ruler-core-tmp/Ast.hs view
@@ -0,0 +1,156 @@+++-- UUAGC 0.9.32 (src/Ast.ag)+module Ast where++{-# LINE 8 "src/Ast.ag" #-}++import Common+{-# LINE 10 "dist/src/sdist.34564/ruler-core-1.0/dist/build/ruler-core/ruler-core-tmp/Ast.hs" #-}+-- AliasType ---------------------------------------------------+data AliasType = AliasType_List !(Ident) + | AliasType_Maybe !(Ident) + | AliasType_Prod !(([Ident])) +-- Attr --------------------------------------------------------+data Attr = Attr_Inh !(Ident) !(String) + | Attr_Syn !(Ident) !(String) +-- AttrTypeCode ------------------------------------------------+data AttrTypeCode = AttrTypeCode_Child + | AttrTypeCode_Lhs + | AttrTypeCode_ProdLocal + | AttrTypeCode_VisLocal + | AttrTypeCode_Visit +-- AttrTypePat -------------------------------------------------+data AttrTypePat = AttrTypePat_Child + | AttrTypePat_Lhs + | AttrTypePat_ProdLocal + | AttrTypePat_VisLocal + | AttrTypePat_Visit +-- Attrs -------------------------------------------------------+type Attrs = [Attr ]+-- Bind --------------------------------------------------------+data Bind = Bind_Fun + | Bind_Monadic +-- Block -------------------------------------------------------+data Block = Block_Data !(Data ) + | Block_DataSem !(DataSem ) + | Block_Item !(Ident) !(Item ) + | Block_Itf !(Itf ) + | Block_Section !(Code ) + | Block_Type !(Type ) +-- Blocks ------------------------------------------------------+type Blocks = [Block ]+-- BlocksTop ---------------------------------------------------+data BlocksTop = BlocksTop_None + | BlocksTop_Top !(Blocks ) +-- BoundCode ---------------------------------------------------+data BoundCode = BoundCode_Code !(Bind ) !(Pos) !(Code ) +-- Clause ------------------------------------------------------+data Clause = Clause_Clause !(Pos) !(Ident) !(Stmts ) !(SemVisit ) +-- Clauses -----------------------------------------------------+type Clauses = [Clause ]+-- ClausesTop --------------------------------------------------+data ClausesTop = ClausesTop_Impl !(Clauses) + | ClausesTop_Top !(Clauses ) +-- Code --------------------------------------------------------+data Code = Code_Code !(Items ) +-- Con ---------------------------------------------------------+data Con = Con_Con !(Pos) !(Ident) !(Vars ) !(Fields ) +-- Cons --------------------------------------------------------+type Cons = [Con ]+-- Data --------------------------------------------------------+data Data = Data_Data !(Pos) !(Ident) !(Vars ) !(Cons ) !(Exts ) +-- DataSem -----------------------------------------------------+data DataSem = DataSem_Sem !(Pos) !(Ident) !(Vars ) !((Maybe String)) !(Bool) !(Stmts) !(ClausesTop ) +-- ExprField ---------------------------------------------------+data ExprField = ExprField_Field !(Ident) !(Code ) +-- ExprFields --------------------------------------------------+type ExprFields = [ExprField ]+-- Ext ---------------------------------------------------------+data Ext = Ext_Ext !(Ident) +-- Exts --------------------------------------------------------+type Exts = [Ext ]+-- Field -------------------------------------------------------+data Field = Field_Field !(Ident) !(FieldType ) +-- FieldType ---------------------------------------------------+data FieldType = FieldType_Nonterm !(Ident) + | FieldType_Term !(String) +-- Fields ------------------------------------------------------+type Fields = [Field ]+-- ImplStmt ----------------------------------------------------+data ImplStmt = ImplStmt_DefaultChild !(Pos) !(Bool) !(Ident) !(Ident) !((Maybe Int)) + | ImplStmt_DefaultSyn !(Pos) !(Bool) !(Ident) !((Maybe Int)) + | ImplStmt_DefaultVisLocal !(Pos) !(Ident) + | ImplStmt_Invoke !(Pos) !(Ident) !(Ident) !(Ident) +-- ImplStmts ---------------------------------------------------+type ImplStmts = [ImplStmt ]+-- Item --------------------------------------------------------+data Item = Item_Attr !(Pos) !(Ident) !(Ident) + | Item_Brackets !(Pos) !(Items ) !(Pos) + | Item_CoSem !(Pos) !(Ident) !(Ident) !(Ident) !(Vars ) !((Maybe String)) !(SemVisit ) + | Item_Construct !(Pos) !(Ident) !(Ident) !(ExprFields ) + | Item_DataSem !(DataSem ) + | Item_Detach !(Pos) !(Ident) !(Ident) + | Item_Plain !(Pos) !(String) + | Item_Sem !(Pos) !(Ident) !(Ident) !(Vars ) !((Maybe String)) !(SemVisit ) +-- Items -------------------------------------------------------+type Items = [Item ]+-- Itf ---------------------------------------------------------+data Itf = Itf_Itf !(Pos) !(Ident) !(Vars ) !(ItfVisits ) +-- ItfVisit ----------------------------------------------------+data ItfVisit = ItfVisit_Visit !(Pos) !(Ident) !(Bool) !(Vars ) !(Attrs ) +-- ItfVisits ---------------------------------------------------+type ItfVisits = [ItfVisit ]+-- MaybeBoundCode ----------------------------------------------+type MaybeBoundCode = Maybe BoundCode +-- Mode --------------------------------------------------------+data Mode = Mode_Assert + | Mode_Match +-- Pat ---------------------------------------------------------+data Pat = Pat_Attr !(Ident) !(Ident) + | Pat_AttrCon !(Ident) !(Ident) !(Ident) + | Pat_Con !(Ident) !(Pats ) + | Pat_Cons !(Pat ) !(Pat ) + | Pat_List !(Pats ) + | Pat_Tup !(Pats ) + | Pat_Underscore !(Pos) +-- Pats --------------------------------------------------------+type Pats = [Pat ]+-- Program -----------------------------------------------------+data Program = Program_Program !(BlocksTop ) +-- Rename ------------------------------------------------------+data Rename = Rename_Rename !(Ident) !(Ident) +-- Renames -----------------------------------------------------+type Renames = [Rename ]+-- SemCon ------------------------------------------------------+data SemCon = SemCon_Con !(Pos) !(Ident) !(SemFields ) +-- SemCons -----------------------------------------------------+type SemCons = [SemCon ]+-- SemField ----------------------------------------------------+data SemField = SemField_Field !(Pos) !(Ident) !((Either Ident String)) +-- SemFields ---------------------------------------------------+type SemFields = [SemField ]+-- SemVisit ----------------------------------------------------+data SemVisit = SemVisit_End + | SemVisit_Impl + | SemVisit_Internal !(Pos) !(Ident) !(Bool) !(Stmts ) !(ClausesTop ) + | SemVisit_Prependable !(Pos) !(Ident) !(SemVisit) + | SemVisit_Visit !(Pos) !(Ident) !(Bool) !(VisitAttrs ) !(Stmts ) !(ClausesTop ) +-- Stmt --------------------------------------------------------+data Stmt = Stmt_Attach !(Pos) !((Maybe Ident)) !(Ident) !(Ident) !(MaybeBoundCode ) + | Stmt_Default !(Bool) !(Pos) !(Ident) !(MaybeBoundCode ) + | Stmt_Eval !(Mode ) !(Pat ) !(BoundCode ) + | Stmt_Invoke !(Pos) !(Ident) !(Ident) !(MaybeBoundCode ) + | Stmt_Rename !(Pos) !(Ident) !(Renames ) +-- Stmts -------------------------------------------------------+type Stmts = [Stmt ]+-- Type --------------------------------------------------------+data Type = Type_Alias !(Pos) !(Ident) !(AliasType ) !(Vars ) +-- Var ---------------------------------------------------------+data Var = Var_Var !(Ident) +-- Vars --------------------------------------------------------+type Vars = [Var ]+-- VisitAttr ---------------------------------------------------+data VisitAttr = VisitAttr_Chn !(Ident) !(String) +-- VisitAttrs --------------------------------------------------+type VisitAttrs = [VisitAttr ]
+ dist/build/ruler-core/ruler-core-tmp/Errs.hs view
@@ -0,0 +1,484 @@+++-- UUAGC 0.9.32 (src/Errs.ag)+module Errs(errsToStr, prettyErrs, Errs, Err(..), debugMsg, nullErrs) where++{-# LINE 6 "src/Errs.ag" #-}++import Common+import Pretty+import UU.Scanner.Position+import Data.Sequence(Seq)+import qualified Data.Sequence as Seq+import Data.Map(Map)+import qualified Data.Map as Map+import Data.Foldable+import Opts+{-# LINE 18 "dist/src/sdist.34564/ruler-core-1.0/dist/build/ruler-core/ruler-core-tmp/Errs.hs" #-}++{-# LINE 20 "src/Errs.ag" #-}++type Errs = Seq Err++prettyErr :: Opts -> Err -> PP_Doc+prettyErr opts e+ = pp_Syn_Err syn+ where+ inh = Inh_Err { opts_Inh_Err = opts }+ syn = wrap_Err sem inh+ sem = sem_Err e++prettyErrs :: Opts -> Errs -> PP_Doc+prettyErrs opts = vlist . map (prettyErr opts) . toList++errsToStr :: Opts -> Errs -> String+errsToStr opts es = disp (prettyErrs opts es) 999999 ""++debugMsg :: String -> Errs+debugMsg = Seq.singleton . Err_General noPos++nullErrs :: Errs -> Bool+nullErrs = Seq.null+{-# LINE 43 "dist/src/sdist.34564/ruler-core-1.0/dist/build/ruler-core/ruler-core-tmp/Errs.hs" #-}++{-# LINE 203 "src/Errs.ag" #-}++locLine :: PP a => Pos -> a -> PP_Doc+locLine (Pos l c f) d+ = pp f >|< ":" >|< pp l >|< "," >|< pp c >|< ":error:" >#< pp d+{-# LINE 50 "dist/src/sdist.34564/ruler-core-1.0/dist/build/ruler-core/ruler-core-tmp/Errs.hs" #-}+-- Err ---------------------------------------------------------+data Err = Err_AmbAttach !(Ident) !(Ident) + | Err_AmbDefault !(Pos) !(Ident) + | Err_ChildSynUnav !(Pos) !(Ident) !(Ident) !(Ident) !(Ident) + | Err_ClausesCyclic !(Pos) !(Ident) !(Int) + | Err_Cyclic !(Pos) !((Map DepItem Pos)) !(([DepItem])) + | Err_Dup !(([Ident])) + | Err_DupAttr !(Bool) !(Ident) !(Ident) + | Err_EffCyclic !(Pos) + | Err_ExpVisit !(Pos) !(Ident) !(Ident) + | Err_General !(Pos) !(String) + | Err_InternalInCyclic !(Pos) !(Ident) + | Err_IterCyclic !(Pos) + | Err_MatchCyclic !(Pos) + | Err_Missing !(([Ident])) + | Err_MissingAttr !(Bool) !(Ident) !(Ident) + | Err_MissingClause !(Ident) !(Ident) + | Err_MissingVisit !(Pos) !(Ident) !(Ident) + | Err_NameClash !(Ident) + | Err_TypeConflict !(Ident) !(Ident) + | Err_UndeclAttr !(Ident) !(Ident) + | Err_UndeclVisit !(Pos) !(Ident) !(Ident) + | Err_UndefVisit !(Ident) !(Ident) !(([Ident])) + | Err_UndetachVisit !(Ident) !(Ident) !(Ident) + | Err_VisExpCyclic !(Ident) !(Ident) + | Err_VisitsNotImpl !(([Ident])) !(([Ident])) +-- cata+sem_Err :: Err ->+ T_Err +sem_Err (Err_AmbAttach _name _visit ) =+ (sem_Err_AmbAttach _name _visit )+sem_Err (Err_AmbDefault _pos _name ) =+ (sem_Err_AmbDefault _pos _name )+sem_Err (Err_ChildSynUnav _pos _child _itf _vis _name ) =+ (sem_Err_ChildSynUnav _pos _child _itf _vis _name )+sem_Err (Err_ClausesCyclic _pos _name _n ) =+ (sem_Err_ClausesCyclic _pos _name _n )+sem_Err (Err_Cyclic _pos _posMap _comps ) =+ (sem_Err_Cyclic _pos _posMap _comps )+sem_Err (Err_Dup _ks ) =+ (sem_Err_Dup _ks )+sem_Err (Err_DupAttr _inherited _child _name ) =+ (sem_Err_DupAttr _inherited _child _name )+sem_Err (Err_EffCyclic _pos ) =+ (sem_Err_EffCyclic _pos )+sem_Err (Err_ExpVisit _pos _found _expect ) =+ (sem_Err_ExpVisit _pos _found _expect )+sem_Err (Err_General _pos _str ) =+ (sem_Err_General _pos _str )+sem_Err (Err_InternalInCyclic _pos _name ) =+ (sem_Err_InternalInCyclic _pos _name )+sem_Err (Err_IterCyclic _pos ) =+ (sem_Err_IterCyclic _pos )+sem_Err (Err_MatchCyclic _pos ) =+ (sem_Err_MatchCyclic _pos )+sem_Err (Err_Missing _ks ) =+ (sem_Err_Missing _ks )+sem_Err (Err_MissingAttr _inherited _child _name ) =+ (sem_Err_MissingAttr _inherited _child _name )+sem_Err (Err_MissingClause _itf _name ) =+ (sem_Err_MissingClause _itf _name )+sem_Err (Err_MissingVisit _pos _child _visit ) =+ (sem_Err_MissingVisit _pos _child _visit )+sem_Err (Err_NameClash _name ) =+ (sem_Err_NameClash _name )+sem_Err (Err_TypeConflict _found _expect ) =+ (sem_Err_TypeConflict _found _expect )+sem_Err (Err_UndeclAttr _child _name ) =+ (sem_Err_UndeclAttr _child _name )+sem_Err (Err_UndeclVisit _pos _name _itf ) =+ (sem_Err_UndeclVisit _pos _name _itf )+sem_Err (Err_UndefVisit _child _visit _visits ) =+ (sem_Err_UndefVisit _child _visit _visits )+sem_Err (Err_UndetachVisit _child _visit _expect ) =+ (sem_Err_UndetachVisit _child _visit _expect )+sem_Err (Err_VisExpCyclic _name _child ) =+ (sem_Err_VisExpCyclic _name _child )+sem_Err (Err_VisitsNotImpl _nonterm _vs ) =+ (sem_Err_VisitsNotImpl _nonterm _vs )+-- semantic domain+type T_Err = Opts ->+ ( PP_Doc)+data Inh_Err = Inh_Err {opts_Inh_Err :: !(Opts)}+data Syn_Err = Syn_Err {pp_Syn_Err :: !(PP_Doc)}+wrap_Err :: T_Err ->+ Inh_Err ->+ Syn_Err +wrap_Err sem (Inh_Err _lhsIopts ) =+ (let ( _lhsOpp) = sem _lhsIopts + in (Syn_Err _lhsOpp ))+sem_Err_AmbAttach :: Ident ->+ Ident ->+ T_Err +sem_Err_AmbAttach name_ visit_ =+ (\ _lhsIopts ->+ (case (({-# LINE 182 "src/Errs.ag" #-}+ identPos name_+ {-# LINE 148 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 144 "src/Errs.ag" #-}+ locLine _pos ("ambiguous attach of child" >#< show name_ >#< "and visit" >#< show visit_)+ {-# LINE 152 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }))+sem_Err_AmbDefault :: Pos ->+ Ident ->+ T_Err +sem_Err_AmbDefault pos_ name_ =+ (\ _lhsIopts ->+ (case (({-# LINE 145 "src/Errs.ag" #-}+ locLine pos_ ("ambiguous default statement for" >#< show name_)+ {-# LINE 162 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }))+sem_Err_ChildSynUnav :: Pos ->+ Ident ->+ Ident ->+ Ident ->+ Ident ->+ T_Err +sem_Err_ChildSynUnav pos_ child_ itf_ vis_ name_ =+ (\ _lhsIopts ->+ (case (({-# LINE 147 "src/Errs.ag" #-}+ locLine pos_ ("default for" >#< show name_ >#< "requires unavailable attribute" >#< show name_ >#< "of" >#< show child_ >|< "'s visit" >#< show vis_)+ {-# LINE 175 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }))+sem_Err_ClausesCyclic :: Pos ->+ Ident ->+ Int ->+ T_Err +sem_Err_ClausesCyclic pos_ name_ n_ =+ (\ _lhsIopts ->+ (case (({-# LINE 150 "src/Errs.ag" #-}+ locLine pos_ ("cyclic visit" >#< show name_ >#< "must have one clause, but has" >#< show n_)+ {-# LINE 186 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }))+sem_Err_Cyclic :: Pos ->+ (Map DepItem Pos) ->+ ([DepItem]) ->+ T_Err +sem_Err_Cyclic pos_ posMap_ comps_ =+ (\ _lhsIopts ->+ (case (({-# LINE 188 "src/Errs.ag" #-}+ \d -> let pos = Map.findWithDefault noPos d posMap_+ in case d of+ DepMatch _ -> "@" >|< show (line pos)+ DepAssert _ -> "@" >|< show (line pos)+ DepDefault o -> "d" >|< show o+ DepAttach n -> "@" >|< show (line pos)+ DepInvoke (visit:name:_) -> show name >|< "." >|< show visit >|< "@" >|< show (line $ identPos name)+ DepInvoke _ -> text "i???"+ DepVisStart (visit:_) -> ">" >|< show visit >|< "@" >|< show (line $ identPos visit)+ DepVisStart _ -> text ">v???"+ DepVisEnd (visit:_) -> show visit >|< "@" >|< show (line $ identPos visit) >|< "<"+ DepVisEnd _ -> text "<v???"+ DepClause (clause:_) -> "|" >|< show clause >|< "@" >|< show (line $ identPos clause)+ DepClause _ -> text "|???"+ {-# LINE 210 "src/Errs.hs" #-})) of+ { _ppDep ->+ (case (({-# LINE 148 "src/Errs.ag" #-}+ locLine pos_ ("cycle:" >#< hlist_sp (map _ppDep comps_) )+ {-# LINE 214 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }))+sem_Err_Dup :: ([Ident]) ->+ T_Err +sem_Err_Dup ks_ =+ (\ _lhsIopts ->+ (case (({-# LINE 158 "src/Errs.ag" #-}+ if null ks_ then ident "<unspecified>" else head ks_+ {-# LINE 223 "src/Errs.hs" #-})) of+ { _main ->+ (case (({-# LINE 160 "src/Errs.ag" #-}+ identPos _main+ {-# LINE 227 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 132 "src/Errs.ag" #-}+ locLine _pos ("duplicate identifier" >#< show _main )+ {-# LINE 231 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }) }))+sem_Err_DupAttr :: Bool ->+ Ident ->+ Ident ->+ T_Err +sem_Err_DupAttr inherited_ child_ name_ =+ (\ _lhsIopts ->+ (case (({-# LINE 178 "src/Errs.ag" #-}+ if inherited_ then text "inh" else text "syn"+ {-# LINE 242 "src/Errs.hs" #-})) of+ { _type ->+ (case (({-# LINE 177 "src/Errs.ag" #-}+ identPos name_+ {-# LINE 246 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 142 "src/Errs.ag" #-}+ locLine _pos ("duplicate" >#< _type >#< "attr" >#< show child_ >|< "." >|< show name_)+ {-# LINE 250 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }) }))+sem_Err_EffCyclic :: Pos ->+ T_Err +sem_Err_EffCyclic pos_ =+ (\ _lhsIopts ->+ (case (({-# LINE 151 "src/Errs.ag" #-}+ locLine pos_ ("effectful code not allowed for cyclic stmt")+ {-# LINE 259 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }))+sem_Err_ExpVisit :: Pos ->+ Ident ->+ Ident ->+ T_Err +sem_Err_ExpVisit pos_ found_ expect_ =+ (\ _lhsIopts ->+ (case (({-# LINE 133 "src/Errs.ag" #-}+ locLine pos_ ("expecting visit" >#< show expect_ >#< "found" >#< show found_)+ {-# LINE 270 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }))+sem_Err_General :: Pos ->+ String ->+ T_Err +sem_Err_General pos_ str_ =+ (\ _lhsIopts ->+ (case (({-# LINE 130 "src/Errs.ag" #-}+ locLine pos_ str_+ {-# LINE 280 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }))+sem_Err_InternalInCyclic :: Pos ->+ Ident ->+ T_Err +sem_Err_InternalInCyclic pos_ name_ =+ (\ _lhsIopts ->+ (case (({-# LINE 154 "src/Errs.ag" #-}+ locLine pos_ ("internal visit" >#< show name_ >#< "may not occur in a fully cyclic visit")+ {-# LINE 290 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }))+sem_Err_IterCyclic :: Pos ->+ T_Err +sem_Err_IterCyclic pos_ =+ (\ _lhsIopts ->+ (case (({-# LINE 153 "src/Errs.ag" #-}+ locLine pos_ ("visit may not be iterated by cyclic stmt")+ {-# LINE 299 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }))+sem_Err_MatchCyclic :: Pos ->+ T_Err +sem_Err_MatchCyclic pos_ =+ (\ _lhsIopts ->+ (case (({-# LINE 149 "src/Errs.ag" #-}+ locLine pos_ ("match statement not allowed in cyclic visit")+ {-# LINE 308 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }))+sem_Err_Missing :: ([Ident]) ->+ T_Err +sem_Err_Missing ks_ =+ (\ _lhsIopts ->+ (case (({-# LINE 158 "src/Errs.ag" #-}+ if null ks_ then ident "<unspecified>" else head ks_+ {-# LINE 317 "src/Errs.hs" #-})) of+ { _main ->+ (case (({-# LINE 160 "src/Errs.ag" #-}+ identPos _main+ {-# LINE 321 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 131 "src/Errs.ag" #-}+ locLine _pos ("undefined identifier" >#< show _main )+ {-# LINE 325 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }) }))+sem_Err_MissingAttr :: Bool ->+ Ident ->+ Ident ->+ T_Err +sem_Err_MissingAttr inherited_ child_ name_ =+ (\ _lhsIopts ->+ (case (({-# LINE 175 "src/Errs.ag" #-}+ if inherited_ then text "inh" else text "syn"+ {-# LINE 336 "src/Errs.hs" #-})) of+ { _type ->+ (case (({-# LINE 174 "src/Errs.ag" #-}+ identPos name_+ {-# LINE 340 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 141 "src/Errs.ag" #-}+ locLine _pos ("undefined" >#< _type >#< "attr" >#< show child_ >|< "." >|< show name_)+ {-# LINE 344 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }) }))+sem_Err_MissingClause :: Ident ->+ Ident ->+ T_Err +sem_Err_MissingClause itf_ name_ =+ (\ _lhsIopts ->+ (case (({-# LINE 180 "src/Errs.ag" #-}+ identPos name_+ {-# LINE 354 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 143 "src/Errs.ag" #-}+ locLine _pos ("missing clause " >#< show name_ >#< "of" >#< show itf_)+ {-# LINE 358 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }))+sem_Err_MissingVisit :: Pos ->+ Ident ->+ Ident ->+ T_Err +sem_Err_MissingVisit pos_ child_ visit_ =+ (\ _lhsIopts ->+ (case (({-# LINE 134 "src/Errs.ag" #-}+ locLine pos_ ("missing invoke of visit" >#< show visit_ >#< "of child" >#< show child_)+ {-# LINE 369 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }))+sem_Err_NameClash :: Ident ->+ T_Err +sem_Err_NameClash name_ =+ (\ _lhsIopts ->+ (case (({-# LINE 172 "src/Errs.ag" #-}+ identPos name_+ {-# LINE 378 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 140 "src/Errs.ag" #-}+ locLine _pos ("name clash" >#< show name_)+ {-# LINE 382 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }))+sem_Err_TypeConflict :: Ident ->+ Ident ->+ T_Err +sem_Err_TypeConflict found_ expect_ =+ (\ _lhsIopts ->+ (case (({-# LINE 184 "src/Errs.ag" #-}+ identPos found_+ {-# LINE 392 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 146 "src/Errs.ag" #-}+ locLine _pos ("type" >#< show found_ >#< "does not match expected type" >#< show expect_)+ {-# LINE 396 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }))+sem_Err_UndeclAttr :: Ident ->+ Ident ->+ T_Err +sem_Err_UndeclAttr child_ name_ =+ (\ _lhsIopts ->+ (case (({-# LINE 170 "src/Errs.ag" #-}+ identPos name_+ {-# LINE 406 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 139 "src/Errs.ag" #-}+ locLine _pos ("undeclared attr" >#< show child_ >|< "." >|< show name_)+ {-# LINE 410 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }))+sem_Err_UndeclVisit :: Pos ->+ Ident ->+ Ident ->+ T_Err +sem_Err_UndeclVisit pos_ name_ itf_ =+ (\ _lhsIopts ->+ (case (({-# LINE 137 "src/Errs.ag" #-}+ locLine pos_ ("undeclared visit" >#< show name_ >#< "of interface" >#< show itf_)+ {-# LINE 421 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }))+sem_Err_UndefVisit :: Ident ->+ Ident ->+ ([Ident]) ->+ T_Err +sem_Err_UndefVisit child_ visit_ visits_ =+ (\ _lhsIopts ->+ (case (({-# LINE 166 "src/Errs.ag" #-}+ identPos visit_+ {-# LINE 432 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 136 "src/Errs.ag" #-}+ locLine _pos ("undefined visit" >#< show visit_ >#< "of child" >#< show child_)+ {-# LINE 436 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }))+sem_Err_UndetachVisit :: Ident ->+ Ident ->+ Ident ->+ T_Err +sem_Err_UndetachVisit child_ visit_ expect_ =+ (\ _lhsIopts ->+ (case (({-# LINE 168 "src/Errs.ag" #-}+ identPos visit_+ {-# LINE 447 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 138 "src/Errs.ag" #-}+ locLine _pos ("undetachable visit" >#< show visit_ >#< "of child" >#< show child_ >|< ": expecting visit" >#< show expect_)+ {-# LINE 451 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }))+sem_Err_VisExpCyclic :: Ident ->+ Ident ->+ T_Err +sem_Err_VisExpCyclic name_ child_ =+ (\ _lhsIopts ->+ (case (({-# LINE 186 "src/Errs.ag" #-}+ identPos name_+ {-# LINE 461 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 152 "src/Errs.ag" #-}+ locLine _pos ("visit" >#< show name_ >#< "of" >#< show child_ >#< "is on a cycle")+ {-# LINE 465 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }))+sem_Err_VisitsNotImpl :: ([Ident]) ->+ ([Ident]) ->+ T_Err +sem_Err_VisitsNotImpl nonterm_ vs_ =+ (\ _lhsIopts ->+ (case (({-# LINE 164 "src/Errs.ag" #-}+ identPos (head nonterm_)+ {-# LINE 475 "src/Errs.hs" #-})) of+ { _pos ->+ (case (({-# LINE 162 "src/Errs.ag" #-}+ if null vs_ then ident "<unspecified>" else head vs_+ {-# LINE 479 "src/Errs.hs" #-})) of+ { _main ->+ (case (({-# LINE 135 "src/Errs.ag" #-}+ locLine _pos ("missing visit" >#< show _main >#< "for" >#< show (head nonterm_))+ {-# LINE 483 "src/Errs.hs" #-})) of+ { _lhsOpp ->+ ( _lhsOpp) }) }) }))
+ dist/build/ruler-core/ruler-core-tmp/Scanner.hs view
@@ -0,0 +1,353 @@+{-# OPTIONS -fglasgow-exts -cpp #-}+{-# LINE 1 "src/Scanner.x" #-}+ +module Scanner(tokenize, ppTokens) where + +import UU.Scanner +import UU.Scanner.GenToken +import Data.Char +import UU.Pretty +import Opts ++#if __GLASGOW_HASKELL__ >= 603+#include "ghcconfig.h"+#elif defined(__GLASGOW_HASKELL__)+#include "config.h"+#endif+#if __GLASGOW_HASKELL__ >= 503+import Data.Array+import Data.Char (ord)+import Data.Array.Base (unsafeAt)+#else+import Array+import Char (ord)+#endif+#if __GLASGOW_HASKELL__ >= 503+import GHC.Exts+#else+import GlaExts+#endif+alex_base :: AlexAddr+alex_base = AlexA# "\xf7\xff\xff\xff\x69\x00\x00\x00\xc3\x00\x00\x00\xe0\x00\x00\x00\xf8\xff\xff\xff\xf9\xff\xff\xff\xfd\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\xff\x02\x00\x00\x00\xe3\xff\xff\xff\x00\x00\x00\x00\xe4\xff\xff\xff\xe5\xff\xff\xff\xe6\xff\xff\xff\xe7\xff\xff\xff\x0b\x00\x00\x00\x00\x00\x00\x00\xe9\xff\xff\xff\xed\xff\xff\xff\xee\xff\xff\xff\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x01\x00\x00\x89\x01\x00\x00\xdd\x01\x00\x00\x31\x02\x00\x00\x85\x02\x00\x00\xd9\x02\x00\x00\x2d\x03\x00\x00\x81\x03\x00\x00\xd5\x03\x00\x00\x29\x04\x00\x00\x7d\x04\x00\x00\xd1\x04\x00\x00\x25\x05\x00\x00\x79\x05\x00\x00\xcd\x05\x00\x00\x21\x06\x00\x00\x75\x06\x00\x00\xc9\x06\x00\x00\x1d\x07\x00\x00\x71\x07\x00\x00\xc5\x07\x00\x00\x19\x08\x00\x00\x6d\x08\x00\x00\xc1\x08\x00\x00\x15\x09\x00\x00\x69\x09\x00\x00\xbd\x09\x00\x00\x11\x0a\x00\x00\x65\x0a\x00\x00\xb9\x0a\x00\x00\x0d\x0b\x00\x00\x61\x0b\x00\x00\xb5\x0b\x00\x00\x09\x0c\x00\x00\x5d\x0c\x00\x00\xb1\x0c\x00\x00\x05\x0d\x00\x00\x59\x0d\x00\x00\xad\x0d\x00\x00\x01\x0e\x00\x00\x55\x0e\x00\x00\xa9\x0e\x00\x00\xfd\x0e\x00\x00\x51\x0f\x00\x00\xa5\x0f\x00\x00\xf9\x0f\x00\x00\x4d\x10\x00\x00\xa1\x10\x00\x00\xf5\x10\x00\x00\x49\x11\x00\x00\x9d\x11\x00\x00\xf1\x11\x00\x00\x45\x12\x00\x00\x99\x12\x00\x00\xed\x12\x00\x00\x41\x13\x00\x00\x95\x13\x00\x00\xe9\x13\x00\x00\x3d\x14\x00\x00\x91\x14\x00\x00\xe5\x14\x00\x00\x39\x15\x00\x00\x8d\x15\x00\x00\xe1\x15\x00\x00\x35\x16\x00\x00\x89\x16\x00\x00\xdd\x16\x00\x00\x31\x17\x00\x00\x85\x17\x00\x00\xd9\x17\x00\x00\x2d\x18\x00\x00\x81\x18\x00\x00\xd5\x18\x00\x00\x29\x19\x00\x00\x7d\x19\x00\x00\xd1\x19\x00\x00\x25\x1a\x00\x00\x79\x1a\x00\x00\xcd\x1a\x00\x00\x21\x1b\x00\x00\x75\x1b\x00\x00\xc9\x1b\x00\x00\x1d\x1c\x00\x00\x71\x1c\x00\x00\xc5\x1c\x00\x00\x00\x00\x00\x00\x19\x1d\x00\x00\x6d\x1d\x00\x00\xc1\x1d\x00\x00\x15\x1e\x00\x00\x69\x1e\x00\x00\xeb\xff\xff\xff\x00\x00\x00\x00\xbd\x1e\x00\x00\x11\x1f\x00\x00\x65\x1f\x00\x00\xb9\x1f\x00\x00\x0d\x20\x00\x00\x61\x20\x00\x00\xb5\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x21\x00\x00\x5d\x21\x00\x00\xb1\x21\x00\x00\x05\x22\x00\x00\x59\x22\x00\x00\xad\x22\x00\x00\x01\x23\x00\x00\x55\x23\x00\x00\xa9\x23\x00\x00\xfd\x23\x00\x00\x51\x24\x00\x00\xa5\x24\x00\x00\xf9\x24\x00\x00\x4d\x25\x00\x00\xa1\x25\x00\x00\xf5\x25\x00\x00\x49\x26\x00\x00\x9d\x26\x00\x00\xf1\x26\x00\x00\x45\x27\x00\x00\x99\x27\x00\x00\xed\x27\x00\x00\x41\x28\x00\x00\x95\x28\x00\x00\xe9\x28\x00\x00\x3d\x29\x00\x00\x91\x29\x00\x00\xe5\x29\x00\x00\x39\x2a\x00\x00\x8d\x2a\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\xfe\x2a\x00\x00\xff\x2a\x00\x00\x00\x2b\x00\x00\x1c\x2b\x00\x00\x70\x2b\x00\x00\xc2\x2a\x00\x00\xc4\x2b\x00\x00\x18\x2c\x00\x00\x6c\x2c\x00\x00\xc0\x2c\x00\x00\xda\x2c\x00\x00\x2e\x2d\x00\x00\x82\x2d\x00\x00\xd6\x2d\x00\x00\x2a\x2e\x00\x00\x44\x2e\x00\x00\x98\x2e\x00\x00\xec\x2e\x00\x00"#++alex_table :: AlexAddr+alex_table = AlexA# "\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\xff\xff\xff\xff\x05\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x09\x00\x10\x00\x10\x00\x0c\x00\x0c\x00\xff\xff\x15\x00\x06\x00\x06\x00\x06\x00\x15\x00\x12\x00\xff\xff\x06\x00\x82\x00\x7c\x00\x7d\x00\x00\x00\x07\x00\x80\x00\x0a\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\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x34\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x7e\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\xa1\x00\xa1\x00\x23\x00\x2c\x00\x36\x00\xa1\x00\xa1\x00\xa1\x00\x1a\x00\xa1\x00\xa1\x00\xa1\x00\x76\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\x26\x00\x30\x00\xa1\x00\x1e\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\x0f\x00\x05\x00\x00\x00\xff\xff\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\x0b\x00\x06\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x11\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x00\x00\x80\x00\x0a\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\x73\x00\x00\x00\x83\x00\x81\x00\x00\x00\x00\x00\x85\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x7e\x00\x00\x00\x7f\x00\xa9\x00\x86\x00\x00\x00\x5f\x00\xa1\x00\x3f\x00\x64\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\x4f\x00\xa1\x00\xa1\x00\xa1\x00\x54\x00\xa1\x00\x58\x00\xa1\x00\xa1\x00\x6b\x00\xa1\x00\x59\x00\xa1\x00\x43\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\x0e\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\xb2\x00\x8f\x00\x9f\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\x93\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\x14\x00\x00\x00\x17\x00\xb7\x00\xb7\x00\x90\x00\xa0\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x94\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x16\x00\xa2\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x24\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x19\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x1b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x1c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x7b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x1d\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x1f\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x20\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x21\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x2d\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x22\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x25\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x39\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x27\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x2a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x2b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x28\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x28\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x2e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x2f\x00\xa2\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x29\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\x31\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x32\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x33\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x28\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x35\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x37\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x38\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x3d\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x48\x00\xa2\x00\xa2\x00\xa2\x00\x3e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x47\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x40\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x41\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x7b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x42\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x44\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x45\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x46\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x66\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x49\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4d\x00\xa2\x00\x57\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x50\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x51\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x52\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x53\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x77\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x50\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x55\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x56\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x50\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x50\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x5b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x5c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5d\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x60\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x61\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x72\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x62\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x63\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\x5a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x65\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x67\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x68\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x69\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x6a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x6e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x6c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x6f\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x70\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x71\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x77\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x78\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x79\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\x75\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x7a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x87\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x88\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x89\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x8a\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x8b\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x8c\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x8d\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x8e\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x87\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x88\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x91\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x92\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x87\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x88\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x95\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x96\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x97\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x98\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x99\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x9a\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x9b\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x9c\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x9d\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x9e\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x00\xa5\x00\xa6\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\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\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\xa9\x00\xa9\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x0a\x00\x0a\x00\x0d\x00\x0d\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x0a\x00\x2d\x00\x20\x00\x20\x00\x20\x00\x2d\x00\x2d\x00\x0a\x00\x20\x00\x2d\x00\x28\x00\x29\x00\xff\xff\x20\x00\x2c\x00\x2d\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\x0a\x00\xff\xff\x0a\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\x7d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x7d\x00\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\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\x3a\x00\xff\xff\x3c\x00\x3d\x00\xff\xff\xff\xff\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\xff\xff\x5d\x00\x5c\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\x22\x00\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\x22\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\xff\xff\x7d\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\x27\x00\x7d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x0a\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\x22\x00\x22\x00\x22\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5c\x00\x5c\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\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x08\x00\x08\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x0d\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x13\x00\x13\x00\xff\xff\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xff\xff\xff\xff\xff\xff\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,184) [[],[],[],[],[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[],[],[(AlexAccSkip)],[],[],[],[(AlexAcc (alex_action_4))],[],[(AlexAcc (alex_action_3))],[],[],[(AlexAcc (alex_action_4))],[],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_11))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_16))],[(AlexAcc (alex_action_16))],[],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_18))],[(AlexAcc (alex_action_18))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_21))],[],[],[],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_22))],[],[],[],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[],[],[],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[],[],[]]+{-# LINE 52 "src/Scanner.x" #-}+ +tokenize :: Opts -> FilePath -> String -> [Token] +tokenize opts path str + = merge $ scanTks opts [(Pos 1 0 path, 0)] (Pos 1 1 path, str) + +merge [] = [] +merge r@[_] = r +merge (ValToken TkTextln s1 p : ValToken TkTextln s2 _ : r) + = merge (ValToken TkTextln (s1 ++ s2) p : r) +merge (t : r) = t : merge r + +type AlexInput = (Pos, String) -- current position, current string + +alexGetChar :: AlexInput -> Maybe (Char,AlexInput) +alexGetChar (_, []) = Nothing +alexGetChar (p, c : cs) = Just (c, (adv p c, cs)) + +alexInputPrevChar :: AlexInput -> Char +alexInputPrevChar = error "alexInputPrevChar: should not be used." + +type Ctx = (Pos, Int) -- context start position, start code +type CtxStack = [Ctx] + +scanTks :: Opts -> CtxStack -> AlexInput -> [Token] +scanTks opts st inp@(pos,str) + = let (sc,st',tks) = unwind pos str st [] + in tks ++ + case alexScan inp sc of + AlexEOF -> unwindAll st' pos + AlexError _ -> let (Just (c, inp')) = alexGetChar inp + tk | sc == h || sc == j = valueToken TkTextln [c] pos + | otherwise = errToken [c] pos + in tk : scanTks opts st' inp' + AlexSkip inp' _ -> scanTks opts st' inp' + AlexToken inp' len act -> let tk = act (take len str) pos + in tk : scanTks opts (push opts sc tk st') inp' + +push :: Opts -> Int -> Token -> CtxStack -> CtxStack +push opts sc (Reserved k pos) + | sc == 0 && k == "{" = ((noPos, n) :) + | sc == h && k == "{" = ((noPos, n) :) + | sc == h && k == "}" = tail + | sc == j && k == "{" = ((noPos, j) :) + | sc == j && k == "}" = tail + | sc == 0 && k == "itf" = ((pos, 0) :) + | sc == 0 && k == "data" = ((pos, 0) :) + | sc /= a && k == "sem" = ((pos, a) :) + | sc /= a && k == "datasem" = ((pos, a) :) + | sc /= a && k == "cosem" = ((pos, a) :) + | sc /= a && k == "detach" = ((pos, a) :) + | sc == a && k == "=" = ((pos, n) :) + | sc == a && k == "<-" = ((pos, n) :) + | sc == 0 && k == "::" = ((pos, n) :) + | sc == a && k == "::" = ((pos, n) :) + | sc == a && k == "monad" = ((pos, n) :) + | sc == a && k == "visit" = ((pos, a) :) + | sc == a && k == "internal" = ((pos, a) :) + | sc == a && k == "clause" = ((pos, a) :) + where + n | genHaskell opts = h + | genJs opts = j + | otherwise = error "target language unspecified" +push _ _ _ = id + +unwind :: Pos -> String -> CtxStack -> [Token] -> (Int, CtxStack, [Token]) +unwind p str st@((p',c) : st') acc + | (cp == cp' && + (null str || (not $ isSpace $ head str)) ) + || (cp < cp' && + ( any (not . isSpace) $ + take (cp' - cp) str) ) = unwind p str st' (reserved "end" p : acc) + | otherwise = (c, st, acc) + where cp = column p + cp' = column p' + +unwindAll :: CtxStack -> Pos -> [Token] +unwindAll st pos + = map (const (reserved "end" pos)) (init st) + +ppTokens :: [Token] -> PP_Doc +ppTokens = vlist . map ppToken + +ppToken :: Token -> PP_Doc +ppToken (Reserved str pos) = "keyword " >|< show str >|< " at " >|< ppPos pos +ppToken (ValToken tp val pos) = show tp >|< " " >|< val >|< " at " >|< ppPos pos + +ppPos :: Pos -> PP_Doc +ppPos (Pos l c _) = show l >|< "," >|< show c +++a,h,j :: Int+a = 1+h = 2+j = 3+alex_action_3 = valueToken TkTextln +alex_action_4 = reserved +alex_action_5 = reserved +alex_action_6 = reserved +alex_action_7 = reserved +alex_action_8 = reserved +alex_action_9 = reserved +alex_action_10 = reserved +alex_action_11 = reserved +alex_action_12 = reserved +alex_action_13 = reserved +alex_action_14 = reserved +alex_action_15 = reserved +alex_action_16 = reserved +alex_action_17 = reserved +alex_action_18 = reserved +alex_action_19 = valueToken TkVarid +alex_action_20 = valueToken TkConid +alex_action_21 = valueToken TkTextln +alex_action_22 = valueToken TkTextln +alex_action_23 = valueToken TkVarid +alex_action_24 = valueToken TkVarid +{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<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 37 "templates/GenericTemplate.hs" #-}++{-# LINE 47 "templates/GenericTemplate.hs" #-}+++data AlexAddr = AlexA# Addr#++#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 alexGetChar input of+ Nothing -> ++++ AlexEOF+ Just _ ->++++ AlexError input'++ (AlexLastSkip input len, _) ->++++ AlexSkip input len++ (AlexLastAcc k input len, _) ->++++ AlexToken input len 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 alexGetChar input of+ Nothing -> (new_acc, input)+ Just (c, new_input) -> ++++ let+ !(base) = alexIndexInt32OffAddr alex_base s+ !((I# (ord_c))) = ord c+ !(offset) = (base +# ord_c)+ !(check) = alexIndexInt16OffAddr alex_check offset+ + !(new_s) = if (offset >=# 0#) && (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 (len +# 1#) + new_input new_s new_acc++ where+ check_accs [] = last_acc+ check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len))+ check_accs (AlexAccSkip : _) = AlexLastSkip input (I# (len))+ check_accs (AlexAccPred a pred : rest)+ | pred user orig_input (I# (len)) input+ = AlexLastAcc a input (I# (len))+ check_accs (AlexAccSkipPred pred : rest)+ | pred user orig_input (I# (len)) input+ = AlexLastSkip input (I# (len))+ check_accs (_ : rest) = check_accs rest++data AlexLastAcc a+ = AlexNone+ | AlexLastAcc a !AlexInput !Int+ | AlexLastSkip !AlexInput !Int++data AlexAcc a user+ = AlexAcc a+ | AlexAccSkip+ | AlexAccPred a (AlexAccPred user)+ | AlexAccSkipPred (AlexAccPred 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++--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.++-- used by wrappers+iUnbox (I# (i)) = i
+ dist/build/ruler-core/ruler-core-tmp/Transform.hs view
file too large to diff
+ examples/Alias.rul view
@@ -0,0 +1,47 @@+{+{-# LANGUAGE BangPatterns #-}+module Alias where++import Control.Monad.Error+}++type ListX : [X]++data X+ con C++itf X+ visit v+ inh ast :: X+ syn x :: Int++datasem X+ clause C+ lhs.x = 1++itf ListX+ visit v+ inh ast :: ListX+ syn x :: Int++datasem ListX+ clause Cons+ invoke v of hd+ invoke v of tl+ lhs.x = hd.x + tl.x+ clause Nil+ lhs.x = 0++{+test :: ListX -> IO Int+test xs = do+ let inh = Inh_ListX_v { ast_Inh_ListX = xs }+ syn <- invoke_ListX_v dnt_ListX inh+ let x = x_Syn_ListX syn+ return x++main :: IO ()+main = do let list = [X_C,X_C,X_C]+ x <- test list+ putStrLn $ show x+}
+ examples/ConMatch.rul view
@@ -0,0 +1,22 @@+{+{-# LANGUAGE BangPatterns #-}+module Eval where++import Control.Monad.Error+}++itf I+ visit v+ syn x :: Int+ +data D+ con C+ y :: Int++{+t = sem t : I monad IO+ visit v+ clause c+ match D.C@m = D_C 3+ lhs.x = m.y+}
+ examples/CycRepmin.rul view
@@ -0,0 +1,63 @@+{+{-# LANGUAGE BangPatterns #-}+module CycRepmin where++import Control.Monad.Error+}++data Tree+ con Leaf+ x :: Int+ con Bin+ l : Tree+ r : Tree+ ext Show++data Root+ con Root+ t : Tree++itf Root+ visit dispatch+ inh ast :: Root+ syn t :: Tree++itf Tree+ visit dispatch+ inh ast :: Tree+ visit compdist cyclic+ inh g :: Int+ syn m :: Int+ visit result+ syn t :: Tree++datasem Root monad IO+ cyclic -- reminder: turn on cycle checking+ clause Root+ t.g = t.m+ lhs.t = t.t++datasem Tree monad IO+ clause Leaf+ lhs.t = Tree_Leaf lhs.g+ lhs.m = loc.x++ clause Bin+ default g = last+ visit compdist+ lhs.m = l.m `min` r.m+ lhs.t = Tree_Bin l.t r.t++{+test :: Tree -> IO Tree+test t = do+ let inh = Inh_Root_dispatch { ast_Inh_Root = Root_Root t }+ syn <- invoke_Root_dispatch dnt_Root inh+ let t = t_Syn_Root syn+ return t++main :: IO ()+main = do let exp = Tree_Bin (Tree_Leaf 1) (Tree_Bin (Tree_Leaf 2) (Tree_Leaf 3))+ x <- test exp+ putStrLn $ show x+}
+ examples/Eval.rul view
@@ -0,0 +1,56 @@+{+{-# LANGUAGE BangPatterns #-}+module Eval where++import Control.Monad.Error+}++data Expr+ con Int+ x :: Int+ con Plus+ l :: Expr+ r :: Expr++itf Eval+ visit eval+ inh e :: Expr+ syn val :: Int++{+eval = sem eval : Eval monad IO+ visit eval+ clause int+ match Expr.Int@loc = lhs.e+ lhs.val = loc.x++ clause plus+ attach m : Decon_Expr_Plus = mkDecon_Expr_Plus+ m.data = lhs.e+ invoke deconstruct of m++ child l : Eval = eval+ child r : Eval = eval++ l.e = m.l+ r.e = m.r++ invoke eval of l+ invoke eval of r++ lhs.val = l.val + r.val+}++{+test :: Expr -> IO Int+test exp = do+ let inh = Inh_Eval_eval { e_Inh_Eval = exp }+ syn <- invoke_Eval_eval eval inh+ let x = val_Syn_Eval syn+ return x++main :: IO ()+main = do let exp = Expr_Plus (Expr_Int 1) (Expr_Plus (Expr_Int 2) (Expr_Int 3))+ x <- test exp+ putStrLn $ show x+}
+ examples/EvalAsAg.rul view
@@ -0,0 +1,42 @@+{+{-# LANGUAGE BangPatterns #-}+module Eval where++import Control.Monad.Error+}++data Expr+ con Int+ x :: Int+ con Plus+ l : Expr+ r : Expr++itf Expr+ visit eval+ inh ast :: Expr+ syn val :: Int++datasem Expr monad IO+ clause Int+ loc.z = 3+ lhs.val = loc.x+ clause Plus+ invoke eval of l+ invoke eval of r+ lhs.val = l.val + r.val+++{+test :: Expr -> IO Int+test exp = do+ let inh = Inh_Expr_eval { ast_Inh_Expr = exp }+ syn <- invoke_Expr_eval dnt_Expr inh+ let x = val_Syn_Expr syn+ return x++main :: IO ()+main = do let exp = Expr_Plus (Expr_Int 1) (Expr_Plus (Expr_Int 2) (Expr_Int 3))+ x <- test exp+ putStrLn $ show x+}
+ examples/HelloWorld.rul view
@@ -0,0 +1,23 @@+{+{-# LANGUAGE BangPatterns #-}+module HelloWorld where++import Control.Monad.Error+}++itf H+ visit v1+ syn xs :: String++{+hello = sem hello : H monad Either String+ visit v1+ clause c1+ match True = False+ lhs.xs = "Hello World"++hello2 = sem hello2 : H monad Either String+ visit v1+ clause c3+ lhs.xs = "Booh!"+}
+ examples/Internal.rul view
@@ -0,0 +1,46 @@+{+{-# LANGUAGE BangPatterns #-}+module Internal where++import Control.Monad.Error+}++data D+ con C++itf D+ visit dispatch+ inh ast :: D+ syn x :: Int+ syn z :: Int++{+foo =+ sem foo : D monad IO+ visit dispatch+ clause C+ internal bla -- internal clause: conditionally compute attributes+ loc.p = 9+ lhs.z = loc.p+ clause other1+ match False = True -- this clause will fail+ loc.q = True+ lhs.x = loc.p + const 3 lhs.ast+ clause other2+ lhs.x = 42 -- the result of this internal clause is returned+}++{+test :: D -> IO (Int, Int)+test d = do+ let inh = Inh_D_dispatch { ast_Inh_D = d }+ syn <- invoke_D_dispatch foo inh+ let x = x_Syn_D syn+ let z = z_Syn_D syn+ return (x,z)++main :: IO ()+main = do let d = D_C+ t <- test d+ putStrLn $ show t+}
+ examples/JsMenu.rul view
@@ -0,0 +1,131 @@+{+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">++<html>+<head>+<title>Visitor example</title>++<script type="text/javascript">+var eEval = new Object();+var eAbort = new Object();++}++data Root+ con Root+ root : Menu++data Menu+ con Menu+ name :: + cs : Menus++type Menus : [Menu]++itf Root+ visit perform+ inh ast ::++itf Menu+ visit gather+ inh ast ::+ inh depth ::+ syn gathMax ::+ visit layout+ inh finMax ::+ inh count ::+ syn count ::++itf Menus+ visit gather+ inh ast ::+ inh depth ::+ syn gathMax ::+ visit layout+ inh finMax ::+ inh count ::+ syn count ::++{+var root = new Root_Root(+ new Menu_Menu("a", [+ new Menu_Menu("b", [+ new Menu_Menu("c", [])+ , new Menu_Menu("d", []) ]) ]));++function align(root, anchor) {+ datasem Root+ clause Root+ root:depth = 0+ root:count = 0+ root:finMax = root:gathMax+ invoke layout of root++ datasem Menu+ clause Menu+ cs:finMax = lhs:finMax+ cs:depth = 1 + lhs:depth+ cs:count = 1 + lhs:count+ lhs:count = cs:count++ match loc:elem = document.getElementById(loc:name)+ loc:offset = lhs:depth * 20+ loc:width = loc:offset + loc:elem.clientWidth+ lhs:gathMax = Math.max(cs:gathMax, loc:width)++ visit layout+ match _ = (function () {+ loc:elem.style.left = (anchor.offsetLeft + loc:offset) + "px";+ loc:elem.style.top = (anchor.offsetTop + lhs:count * 30) + "px";+ loc:elem.style.width = (lhs:finMax - loc:offset) + "px";+ loc:elem.style.height = 30 + "px";+ }) ()++ datasem Menus+ default depth = function(depths) { return depths[depths.length-1]; }+ default finMax = function(maxs) { return maxs[maxs.length-1]; }+ default gathMax = function(maxs) { return Math.max.apply(Math, maxs); }+ default count = function(counts) { return counts[0]; }+ clause Cons+ clause Nil+ + var inps = new Inh_Root_perform();+ inps.ast = root;+ dnt_Root()(inps);+}++</script>++<style type="text/css">+ #a { background-color: red; position: absolute; display: block; width: auto; }+ #b { background-color: green; position: absolute; display: block; width: auto; }+ #c { background-color: blue; position: absolute; display: block; width: auto; }+ #d { background-color: yellow; position: absolute; display: block; width: auto; }+</style>++</head>+<body onLoad="align(root, document.getElementById('anchor'));">+ +<div id="a">+ item a+</div>++<div id="b">+ very big item b+</div>++<div id="c">+ not so big c+</div>++<div id="d">+ tiny+</div>++<div id="anchor" style="position: absolute; display: block; left: 200px; right: 50px;">+</div>++</body>+</html>+}
+ examples/JsMenu2.rul view
@@ -0,0 +1,101 @@+data Menu+ con Menu+ name :: + cs : Menus++type Menus : [Menu]++itf Root+ visit perform+ inh ast ::++itf Menu+ visit gather+ inh ast ::+ syn gathMax ::+ visit layout+ inh count ::+ syn count ::++itf Menus+ visit gather+ inh ast ::+ syn gathMax ::+ visit layout+ inh finMax ::+ inh count ::+ syn count ::++{+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">++<html>+<head>+<title>Visitor example</title>++<script type="text/javascript">++var root = new Root_Root(+ new Menu_Menu("a", [+ new Menu_Menu("b", [+ new Menu_Menu("c", [])+ , new Menu_Menu("d", []) ]) ]));++function align(root, anchor) {+ datasem Menu+ clause Menu+ cs:count = lhs:count+1+ lhs:count = cs:count+ lhs:gathMax = cs:gathMax+ cs:finMax = 1++ datasem Menus+ default gathMax = function(maxs) { return Math.max.apply(Math, maxs); }+ default finMax = function(maxs) { return maxs[maxs.length-1]; }+ default count = function(counts) { return counts[0]; }+ clause Cons+ hd:count = lhs:count+ -- tl:count = hd:count+ lhs:count = tl:count+ clause Nil++ var inhs = new Inh_Root_perform();+ inhs.ast = root+ eval_Root_perform(s_Root, inhs);+}++</script>++<style type="text/css">+ #a { background-color: red; position: absolute; display: block; width: auto; }+ #b { background-color: green; position: absolute; display: block; width: auto; }+ #c { background-color: blue; position: absolute; display: block; width: auto; }+ #d { background-color: yellow; position: absolute; display: block; width: auto; }+</style>++</head>+<body onLoad="align(root, document.getElementById('anchor'));">+ +<div id="a">+ item a+</div>++<div id="b">+ very big item b+</div>++<div id="c">+ not so big c+</div>++<div id="d">+ tiny+</div>++<div id="anchor" style="position: absolute; display: block; left: 200px; right: 50px;">+</div>++</body>+</html>+}
+ examples/RenameAttr.rul view
@@ -0,0 +1,40 @@+{+{-# LANGUAGE BangPatterns #-}+module RenameAttr where++import Control.Monad.Error+}++data X+ con X+ chld : Y+ con X2+ c1 : Y+ c2 : Y++data Y+ con Y++itf X+ visit v+ inh ast :: X+ syn x :: Int++itf Y+ visit v+ inh ast :: Y+ syn z :: Int++datasem X+ clause X+ rename chld z to x+ invoke v of chld+ lhs.x = chld.x+ clause X2+ rename c1 z to x+ rename c2 z to x+ default x = sum++datasem Y+ clause Y+ lhs.z = 3
+ examples/Repmin.rul view
@@ -0,0 +1,62 @@+{+{-# LANGUAGE BangPatterns #-}+module Repmin where++import Control.Monad.Error+}++data Tree+ con Leaf+ x :: Int+ con Bin+ l : Tree+ r : Tree+ ext Show++data Root+ con Root+ t : Tree++itf Root+ visit dispatch+ inh ast :: Root+ syn t :: Tree++itf Tree+ visit dispatch+ inh ast :: Tree+ visit compute+ syn m :: Int+ visit distribute+ inh g :: Int+ visit result+ syn t :: Tree++datasem Root monad IO+ clause Root+ t.g = t.m+ lhs.t = t.t++datasem Tree monad IO+ clause Leaf+ lhs.t = Tree_Leaf lhs.g+ lhs.m = loc.x++ clause Bin+ default g = last+ lhs.t = Tree_Bin l.t r.t+ lhs.m = l.m `min` r.m++{+test :: Tree -> IO Tree+test t = do+ let inh = Inh_Root_dispatch { ast_Inh_Root = Root_Root t }+ syn <- invoke_Root_dispatch dnt_Root inh+ let t = t_Syn_Root syn+ return t++main :: IO ()+main = do let exp = Tree_Bin (Tree_Leaf 1) (Tree_Bin (Tree_Leaf 2) (Tree_Leaf 3))+ x <- test exp+ putStrLn $ show x+}
+ examples/Sum.rul view
@@ -0,0 +1,40 @@+{+{-# LANGUAGE BangPatterns #-}+module Sum where++import Control.Monad.Error+}++itf S+ visit v1+ inh l :: [Int]+ visit v2+ syn s :: Int++{+sum' = sem sum : S monad Either String+ visit v1+ clause sumNil+ lhs.s = 0+ match [] = lhs.l++ clause sumCons+ tl.l = loc.xs+ lhs.s = loc.x + tl.s+ match (loc.x : loc.xs) = lhs.l+ attach v1 of tl : S = sum'+}++{+test :: [Int] -> Either String Int+test xs = do+ let inh1 = Inh_S_v1 { l_Inh_S = xs }+ syn1 <- invoke_S_v1 sum' inh1+ let inh2 = Inh_S_v2 { }+ syn2 <- invoke_S_v2 (next_S_v1 syn1) inh2+ let s = s_Syn_S syn2+ return s++main :: IO ()+main = putStrLn (show (test [1..100000]))+}
+ examples/TypedEval.rul view
@@ -0,0 +1,27 @@+{+{-# LANGUAGE BangPatterns #-}+module Eval where++import Control.Monad.Error+}++data Expr+ var a+ con Int+ constr a ~ Int+ x :: Int++itf Eval+ var a+ visit eval+ inh e :: Expr a+ syn val :: a++{+eval = sem eval : Eval+ inst m :: IO+ visit eval+ clause int+ match Expr.Int@loc = lhs.e+ lhs.val = loc.x+}
+ examples/Unknown.rul view
@@ -0,0 +1,360 @@+data TyQu + con TyForall + +data TyExpr + con Con + nm :: HsName + con App + func :: TyExpr + arg :: TyExpr + con AppTop + tyExpr :: TyExpr + con Parens + tyExpr :: TyExpr + con Ann + ann :: TyExprAnn + tyExpr :: TyExpr + con Wild + con Mono + con Var + nm :: HsName + con VarWild + mm :: HsName + con Quant + qu :: TyQu + tyVar :: HsName + tyExpr :: TyExpr + con Forall + qu :: TyQu + tyVar :: [HsName] + tyExpr :: TyExpr + con Row + rowTyExpr :: RowTyExpr + +data TyVar + con Var + nm :: HsName + +type TyVars : [TyVar] + +-- Type Index (a1 >= TyQuantifiedScheme) +data TyIndex + con Group + varnm :: HsName + bounds :: TyQuantifiedScheme + +-- -- Quantified type scheme +-- data TyQuantifiedScheme + -- con Quant + -- tyIndex :: TyIndex + -- tyScheme :: TyScheme + -- con Bottom + +-- Type Schemes +data TyScheme + con Quant + subst :: Scheme + tyExpr :: TyScheme + con SystemF + tyExpr :: TyExpr + con Bottom + -- These next two are just used internally + con Sugar + prefix :: Prefix + tyExpr :: TyScheme + con Forall + tyQuant :: [HsName] + tyExpr :: TyScheme + +-- A simple tybound e.f. (a >= phi) +data Scheme + con Simple + varnm :: HsName + bounds :: TyScheme + +-- Mono type +data TyMono + con Var + nm :: HsName + con App + func :: TyMono + arg :: TyMono + con Con + nm :: HsName + con AppTop + tyMono :: TyMono + +-- Unqualified typed +data TyPoly + con Var + nm :: HsName + con App + func :: TyPoly + arg :: TyPoly + con Con + nm :: HsName + con SystemF + tyExpr :: TyExpr + +data DataFieldExpr + con Upd + dataFieldExpr : DataFieldExpr + nm :: HsName + expr : Expr + con Con + nm :: HsName + con Expr + expr : Expr + +data DataFieldPatExpr + con Ext + dataFieldPatExpr :: DataFieldPatExpr + nm :: HsName + patExpr :: PatExpr + con Con + nm :: HsName + +data RecExpr + con Empty + con Ext + recExpr : RecExpr + mbNm :: (Maybe HsName) + expr : Expr + con Upd + recExpr : RecExpr + mbNm :: HsName + expr : Expr + con Expr + expr : Expr + +data RecPatExpr + con Empty + con Ext + recPatExpr : RecPatExpr + mbNm :: (Maybe HsName) + patExpr :: PatExpr + con Expr + patExpr :: PatExpr + +data RowTyExpr + con Empty + con Ext + rowTyExpr :: RowTyExpr + mbNm :: (Maybe HsName) + tyExpr :: TyExpr + +data KiExpr + con Con + nm :: HsName + con Var + nm :: HsName + con App + func :: KiExpr + arg :: KiExpr + con AppTop + kiExpr :: KiExpr + con Parens + kiExpr :: KiExpr + con Ann + ann :: KiExprAnn + kiExpr :: KiExpr + +data Expr + con IConst + int :: Int + con CConst + char :: Char + con Con + nm :: HsName + con Var + nm :: HsName + con App + func : Expr + arg : Expr + con Let + isStrict :: Bool + decls : Decls + body : Expr + con Lam + arg :: PatExpr + body : Expr + con AppTop + expr : Expr + con Parens + expr : Expr + con TypeAs + tyExpr :: TyExpr + expr : Expr + con Ann + ann :: ExprAnn + expr : Expr + con AppImpred + func : Expr + arg : Expr + con SConst + str :: String + con Case + expr : Expr + alts :: CaseAlts + mbCaseIds :: (Maybe UIDS) + caseFailS :: UIDS + isTupOfArg :: Bool + con DataFields + dataFieldExpr :: DataFieldExpr + con Rec + recExpr :: RecExpr + con Sel + expr : Expr + lbl :: HsName + con Undefined + con CaseAltFail + caseId :: UID + +data PatExpr + con IConst + int :: Int + con CConst + char :: Char + con Con + nm :: HsName + con Var + nm :: HsName + con VarAs + nm :: HsName + patExpr :: PatExpr + con App + func :: PatExpr + arg :: PatExpr + con AppTop + patExpr :: PatExpr + con Parens + patExpr :: PatExpr + con Ann + ann :: PatExprAnn + patExpr :: PatExpr + con TypeAs + tyExpr :: TyExpr + patExpr :: PatExpr + con SConst + str :: String + con Rec + recPatExpr :: RecPatExpr + con DataFields + dataFieldPatExpr :: DataFieldPatExpr + con Irrefutable + patExpr :: PatExpr + +data CaseAlt + con Pat + patExpr :: PatExpr + expr : Expr + +type CaseAlts : [CaseAlt] + +data DataConstr + con Constr + conNm :: HsName + fields : DataFields + +type DataConstrs : [DataConstr] + +data DataField + con Field + mbLabels :: (Maybe [HsName]) + tyExpr :: TyExpr + +type DataFields : [DataField] + +data ExprAnn + con Empty + +data TyExprAnn + con Empty + +data PatExprAnn + con Empty + +data KiExprAnn + con Empty + +data Decl + con TySig + nm :: HsName + tyExpr :: TyExpr + con Val + patExpr :: PatExpr + expr : Expr + con Data + isNewType :: Bool + tyNm :: HsName + tyVars :: TyVars + constrs :: DataConstrs + con KiSig + nm :: HsName + kiExpr :: KiExpr + con FFI + callconv :: FFIWay + safety :: String + impEnt :: String + nm :: HsName + tyExpr :: TyExpr + +type TyExprs : [TyExpr] +type Decls : [Decl] + +itf Unify + visit unify + inh pre :: Prefix + inh exp1 :: TyExpr + inh exp2 :: TyExpr + inh frs :: Int + syn pre :: Prefix + syn sub :: Env + syn frs :: Int + +itf Subsume + visit subsume + inh pre :: Prefix + inh exp :: TyScheme + inh ty :: TyScheme + inh frs :: Int + syn pre :: Prefix + syn sub :: Env + syn frs :: Int + +itf UnifyScheme + visit unifyScheme + inh pre :: Prefix + inh ty1 :: TyScheme + inh ty2 :: TyScheme + inh frs :: Int + syn pre :: Prefix + syn sub :: Env + syn ty :: TyScheme + syn frs :: Int + +{ +unifyScheme = sem unifyScheme : UnifyScheme monad IO + visit unifyScheme + default? pre = last + default? frs = last + default? sub = const empty + clause Main_unifyScheme + loc.nfTy = isNf lhs.ty1 + loc.nfTs = isNf lhs.ty2 + loc.nf = True -- loc.nfTy && loc.nfTs + internal nf_check + loc.b1 = isBottom lhs.ty1 + loc.b2 = isBottom lhs.ty2 + clause s_subsume + match True = loc.nf + internal bot_check + clause first_bottom + match True = loc.b1 + (loc.q, loc.tyx) = splitQuant lhs.ty2 + lhs.ty = nf lhs.ty2 -- loc.tyx + lhs.pre = lhs.pre -- munion loc.q lhs.pre + clause f_subsume + match False = loc.nf + lhs.ty = error "unifyScheme failure, ty1 or ty2 is not in normal form" +}
+ ruler-core.cabal view
@@ -0,0 +1,20 @@+cabal-version: >=1.6 +build-type: Custom +name: ruler-core +version: 1.0 +license: LGPL +maintainer: Arie Middelkoop <ariem@cs.uu.nl> +homepage: http://www.cs.uu.nl/wiki/HUT/WebHome +description: Ruler-core Attribute Grammar +category: Development +stability: Experimental +copyright: Arie Middelkoop +extra-source-files: README, uuagc_options, src/AstAG.ag, src/Ast.ag, src/TargetHaskell.ag, src/TargetGraph.ag, src/TargetJs.ag, examples/*.rul + +executable ruler-core + build-depends: base >= 4, base < 5, uulib, uuagc>=0.9.26, filepath, directory, containers, array, mtl, fgl + build-depends: haskell98 + main-is: Main.hs + hs-source-dirs: src + other-modules: + Scanner, Parser, Opts, Ast, Transform, Errs, Env, DepAnalysis, Pretty, Common
+ src/Ast.ag view
@@ -0,0 +1,10 @@+MODULE {Ast} {} {}++PRAGMA genlinepragmas++INCLUDE "AstAG.ag"++imports+{+import Common+}
+ src/AstAG.ag view
@@ -0,0 +1,334 @@+DATA Program+ | Program+ blocks : BlocksTop++DATA BlocksTop+ | Top+ blocks : Blocks+ | None++TYPE Blocks = [Block]++DATA Block+ | Itf+ itf : Itf+ | Data+ data : Data+ | Type+ type : Type+ | Section+ code : Code+ | Item+ name : Ident+ item : Item+ | DataSem+ sem : DataSem++DATA Itf+ | Itf+ pos : Pos+ name : Ident+ vars : Vars+ visits : ItfVisits++TYPE ItfVisits = [ItfVisit]++DATA ItfVisit+ | Visit+ pos : Pos+ name : Ident+ cyclic : Bool+ vars : Vars+ attrs : Attrs++TYPE Attrs = [Attr]++DATA Attr+ | Inh+ name : Ident+ type : String+ | Syn+ name : Ident+ type : String++DATA Data+ | Data+ pos : Pos+ name : Ident+ vars : Vars+ cons : Cons+ exts : Exts++TYPE Vars = [Var]++DATA Var+ | Var+ name : Ident++TYPE Exts = [Ext]++DATA Ext+ | Ext+ name : Ident++TYPE Cons = [Con]++DATA Con+ | Con+ pos : Pos+ name : Ident+ vars : Vars+ fields : Fields++TYPE Fields = [Field]++DATA Field+ | Field+ name : Ident+ type : FieldType++DATA FieldType+ | Term type : String+ | Nonterm name : Ident++DATA Type+ | Alias+ pos : Pos+ name : Ident+ type : AliasType+ vars : Vars++DATA AliasType+ | Prod fields : {[Ident]}+ | List type : Ident+ | Maybe type : Ident++DATA DataSem+ | Sem+ pos : Pos+ tp : Ident+ vars : Vars+ mbMonad : {Maybe String}+ cyclic : Bool+ stmts : {Stmts}+ clauses : ClausesTop++TYPE SemCons = [SemCon]++DATA SemCon+ | Con+ pos : Pos+ name : Ident+ fields : SemFields++TYPE SemFields = [SemField]++DATA SemField+ | Field+ pos : Pos+ name : Ident+ type : {Either Ident String}++DATA Code+ | Code+ items : Items++TYPE MaybeBoundCode = MAYBE BoundCode++DATA BoundCode+ | Code+ bind : Bind+ pos : Pos+ code : Code++TYPE Items = [Item]++DATA Item+ | Plain+ pos : Pos+ txt : String+ | Attr+ pos : Pos+ child : Ident+ name : Ident+ | Sem+ pos : Pos+ name : Ident+ tp : Ident+ vars : Vars+ mbMonad : {Maybe String}+ first : SemVisit+ | CoSem+ pos : Pos+ name : Ident+ tp : Ident+ visit : Ident+ vars : Vars+ mbMonad : {Maybe String}+ first : SemVisit+ | DataSem+ sem : DataSem+ | Detach -- requires visits up to but not including this visit to be invoked+ pos : Pos+ visit : Ident+ name : Ident+ | Construct+ pos : Pos+ data : Ident+ con : Ident+ fields : ExprFields+ | Brackets+ pos : Pos+ items : Items+ posEnd : Pos++TYPE ExprFields = [ExprField]++DATA ExprField+ | Field+ name : Ident+ code : Code++DATA SemVisit+ | Visit+ pos : Pos+ name : Ident+ cyclic : Bool+ attrs : VisitAttrs+ stmts : Stmts+ clauses : ClausesTop+ | Internal+ pos : Pos+ name : Ident+ cyclic : Bool+ stmts : Stmts+ clauses : ClausesTop+ | Impl+ | Prependable -- maybe prepended by other visits+ pos : Pos+ name : Ident+ actual : {SemVisit}+ | End++TYPE VisitAttrs = [VisitAttr]++DATA VisitAttr+ | Chn+ name : Ident+ type : String++DATA ClausesTop+ | Top+ clauses : Clauses+ | Impl+ clauses : {Clauses}++TYPE Clauses = [Clause]++DATA Clause+ | Clause+ pos : Pos+ name : Ident+ stmts : Stmts+ next : SemVisit++TYPE Stmts = [Stmt]++DATA Stmt+ | Eval+ mode : Mode+ pat : Pat+ code : BoundCode+ | Attach+ pos : Pos+ mbVisit : {Maybe Ident}+ name : Ident+ type : Ident+ code : MaybeBoundCode+ | Invoke+ pos : Pos+ visit : Ident+ name : Ident+ code : MaybeBoundCode+ | Default+ allowEmpty : Bool+ pos : Pos+ name : Ident+ mbCode : MaybeBoundCode+ | Rename+ pos : Pos+ child : Ident+ subst : Renames++TYPE Renames = [Rename]+DATA Rename | Rename+ source : Ident+ dest : Ident++DATA Mode+ | Match+ | Assert++DATA Bind+ | Fun+ | Monadic++TYPE Pats = [Pat]++DATA Pat+ | Con+ name : Ident+ pats : Pats+ | AttrCon+ con : Ident+ name : Ident+ dt : Ident+ | Attr+ child : Ident+ name : Ident+ | Tup+ pats : Pats+ | List+ pats : Pats+ | Cons+ hd : Pat+ tl : Pat+ | Underscore+ pos : Pos++DATA AttrTypePat+ | VisLocal+ | ProdLocal+ | Lhs+ | Child+ | Visit++DATA AttrTypeCode+ | VisLocal+ | ProdLocal+ | Lhs+ | Child+ | Visit++TYPE ImplStmts = [ImplStmt]++DATA ImplStmt+ | Invoke+ pos : Pos+ child : Ident+ visit : Ident+ itf : Ident+ | DefaultChild+ pos : Pos+ allowEmpty : Bool+ child : Ident+ name : Ident+ mbCodeRef : {Maybe Int}+ | DefaultSyn+ pos : Pos+ allowEmpty : Bool+ name : Ident+ mbCodeRef : {Maybe Int}+ | DefaultVisLocal+ pos : Pos+ name : Ident
+ src/Common.hs view
@@ -0,0 +1,134 @@+module Common+ ( Ident(..), identName, identPos, ident, explainIdent, explainPos, QIdent+ , module UU.Scanner.Position+ , DepItem(..), Reason(..)+ )+ where++import UU.Scanner.Position+import Data.Map(Map)+import qualified Data.Map as Map+++--+-- Identifiers+--++data Ident+ = Ident String Pos++identName :: Ident -> String+identName (Ident nm _) = nm++identPos :: Ident -> Pos+identPos (Ident _ pos) = pos++ident :: String -> Ident+ident nm = Ident nm noPos++instance Show Ident where+ show (Ident nm _) = nm++instance Eq Ident where+ (Ident nmA _) == (Ident nmB _) = nmA == nmB++instance Ord Ident where+ compare (Ident nmA _) (Ident nmB _) = compare nmA nmB++explainIdent :: Ident -> String+explainIdent ident = show ident ++ " {" ++ explainPos (identPos ident) ++ "}"++explainPos :: Pos -> String+explainPos (Pos l c file) = file ++ ":" ++ show l ++ "," ++ show c++--+-- Qualified Identifiers+--++type QIdent = [Ident]+++--+-- DepItems+--++data DepItem+ = DepMatch !Int -- occ id+ | DepAssert !Int -- occ id+ | DepDefault !Int -- code id+ | DepAttach !Int -- occ id+ | DepInvoke !QIdent -- name : qual childname+ | DepVisStart !QIdent -- name : basename+ | DepVisEnd !QIdent -- name : basename+ | DepClause !QIdent -- name : basename (or: loc.basename)+ deriving (Eq, Show)++instance Ord DepItem where+ compare a b =+ let+ c (DepMatch n) (DepMatch m) = compare m n+ -- c (DepMatch n) (DepAssert m) = compare m n+ c (DepMatch _) _ = GT+ -- c (DepAssert n) (DepMatch m) = compare m n+ c (DepAssert n) (DepMatch m) = LT+ c (DepAssert n) (DepAssert m) = compare m n+ c (DepAssert _) _ = GT+ c (DepDefault _) (DepMatch _) = LT+ c (DepDefault _) (DepAssert _) = LT+ c (DepDefault n) (DepDefault m) = compare m n+ c (DepDefault _) _ = GT+ c (DepAttach _) (DepMatch _) = LT+ c (DepAttach _) (DepAssert _) = LT+ c (DepAttach _) (DepDefault _) = LT+ c (DepAttach n) (DepAttach m) = compare m n+ c (DepAttach _) _ = GT+ c (DepInvoke _) (DepMatch _) = LT+ c (DepInvoke _) (DepAssert _) = LT+ c (DepInvoke _) (DepDefault _) = LT+ c (DepInvoke _) (DepAttach _) = LT+ c (DepInvoke n) (DepInvoke m) = compareNames (reverse n) (reverse m)+ c (DepInvoke _) _ = GT+ c (DepVisStart _) (DepMatch _) = LT+ c (DepVisStart _) (DepAssert _) = LT+ c (DepVisStart _) (DepDefault _) = LT+ c (DepVisStart _) (DepAttach _) = LT+ c (DepVisStart _) (DepInvoke _) = LT+ c (DepVisStart n) (DepVisStart m) = compareNames (reverse n) (reverse m)+ c (DepVisStart _) _ = GT+ c (DepVisEnd n) (DepVisEnd m) = compareNames (reverse n) (reverse m)+ c (DepVisEnd _) _ = LT+ c (DepClause _) (DepMatch _) = LT+ c (DepClause _) (DepAssert _) = LT+ c (DepClause _) (DepDefault _) = LT+ c (DepClause _) (DepAttach _) = LT+ c (DepClause _) (DepInvoke _) = LT+ c (DepClause _) (DepVisStart _) = LT+ c (DepClause _) (DepVisEnd _) = GT+ c (DepClause n) (DepClause m) = compareNames (reverse n) (reverse m)+ in c b a++compareNames :: QIdent -> QIdent -> Ordering+compareNames [] [] = EQ+compareNames [] _ = GT+compareNames _ [] = LT+compareNames (x:xs) (y:ys)+ = case compare x y of+ LT -> GT+ GT -> LT+ EQ -> compareNames xs ys++-- Dependency reasons+data Reason = ReasonScopeVisit !Ident+ | ReasonScopeClause !Ident+ | ReasonScopeEnd !Ident+ | ReasonAttrReq !Ident !Ident+ | ReasonInvokeReq !Ident+ | ReasonChildReq !Ident+ | ReasonAttach !Ident !Ident+ | ReasonDefault !Ident+ | ReasonDetach !Ident !Ident+ | ReasonSink+ | ReasonAlloc+ | ReasonError+ | ReasonOrder+ deriving (Eq,Ord,Show)
+ src/DepAnalysis.hs view
@@ -0,0 +1,207 @@+module DepAnalysis (analyze) where++import Common+import Data.Graph+import Data.Tree+import Data.Maybe+import Control.Monad.State.Strict+import qualified Data.Map as Map+import Data.Map(Map)+import qualified Data.IntMap as IntMap+import Data.IntMap(IntMap)+import qualified Data.Set as Set+import Data.Set(Set)+import qualified Data.IntSet as IntSet+import Data.IntSet(IntSet)+import Data.List(partition, nub,sortBy,groupBy)+import Data.Array+import Data.Tree+import qualified Data.Graph.Inductive as G+++-- computes additional dependencies related to "late-as-possible" scheduling and avoidance of+-- cyclic visits+analyze :: [DepItem] -> [DepItem] -> [DepItem] -> Set DepItem -> [(Reason, DepItem, [DepItem])] -> [SCC DepItem]+analyze oSemStarts oStartVisits oEndVisits avoidVisits deps = map compToItem comps+ where+ comps = stronglyConnCompR $ total $ deps'++ compToItem (AcyclicSCC d) = AcyclicSCC (toItem d)+ compToItem (CyclicSCC ds) = CyclicSCC (map toItem ds)+ toItem (_,d,_) = d++ (gIn, vertexToKey, keyToVertex) = graphFromEdges (merge deps)+ gInRev = transposeG gIn+ deps' = merge (map (\(d,(b,_)) -> (ReasonAlloc, d, [b])) extraConstrs ++ deps)+ + merge ds = map (\(d,(r,ds)) -> (r,d,ds)) $ Map.assocs $+ Map.fromListWith (\(_,as) (r,bs) -> (r,nub (as ++ bs))) $ map (\(r,d,ds) -> (d, (r,ds))) ds++ sequenceMap = let pairs = zip oStartVisits oEndVisits+ seqs [] = []+ seqs l@((x,_) : zs) = (x, l) : seqs zs+ in Map.fromList (seqs pairs) -- given an beginVisit: gives the end visits starting at this visit+ visitAllocMap = Map.mapWithKey allocStmt $ Map.filterWithKey (\k _ -> isStmt k) pairRanges+ extraConstrs = [ (k,p) | (k,Just p) <- Map.assocs visitAllocMap ]++ allocStmt :: DepItem -> (DepItem, DepItem) -> Maybe (DepItem, DepItem)+ allocStmt dep (begin,end)+ | begin == end = Nothing+ | otherwise = if null ok+ then if null bad+ then Nothing+ else Just (last bad)+ else Just (last ok)+ where+ s = Map.findWithDefault [] begin sequenceMap+ s' = untilVisit end s+ (bad, ok) = partition (\(b,e) -> e `Set.member` avoidVisits) s'++ untilVisit x [] = []+ untilVisit x (p@(_,e):ys)+ | x == e = [p]+ | otherwise = p : untilVisit x ys++ isStmt (DepMatch _) = True+ isStmt (DepAssert _) = True+ isStmt (DepDefault _) = True+ isStmt (DepAttach _) = True+ isStmt (DepInvoke _) = True+ isStmt _ = False++ endRanges = markNodes gIn oEndVisits -- lastest visits+ beginRanges = markNodes gInRev (reverse oStartVisits) -- earliest visits+ pairRanges = Map.mapWithKey (\k v -> (Map.findWithDefault k k beginRanges, v)) endRanges+ rootItem = DepVisStart [ident "_root"]++ markNodes :: Graph -> [DepItem] -> Map DepItem DepItem+ markNodes g sources = snd $ execState (travForest forest) (Nothing, Map.empty)+ where+ sources' = Set.fromList sources+ forest = dfs g (catMaybes $ map keyToVertex sources)+ travForest trees = mapM_ travTree trees+ travTree (Node v sub)+ = do let (_, d, _) = vertexToKey v+ encounter d+ travForest sub+ + encounter d+ = do (mbD, mp) <- get+ if d `Set.member` sources'+ then put (Just d, mp)+ else case mbD of+ Nothing -> return ()+ Just d' -> put (mbD, Map.insertWith (flip const) d d' mp)++-- Creates a total order+total :: [(Reason, DepItem, [DepItem])] -> [(Reason, DepItem, [DepItem])]+total deps = result+ where+ result = map (\(a,(r,bs)) -> (r,a,bs)) $ Map.assocs merged+ merged = Map.unionWith merge+ (Map.fromListWith merge [ (a, (ReasonOrder, [b])) | (b,a) <- pairs ])+ (Map.fromList [ (a,(r,bs)) | (r,a,bs) <- deps ])+ + merge (_,as) (r,bs) = (r,nub (as ++ bs))+ toVal x = case G.lab g0 x of+ Nothing -> error ("has disapeared from graph: " ++ show x)+ Just v -> v+ pairs = zip nodes3 (tail nodes3)+ nodes3 = map toVal nodes2+ + items = nub ([ s | (_,s,_) <- deps ] ++ [ d | (_,_,ds) <- deps, d <- ds ])+ (nodes, mp) = G.mkNodes G.new items+ (Just edges) = G.mkEdges mp [ (s,d,r) | (r, s, ds) <- deps, d <- ds ]+ + g0 :: G.Gr DepItem Reason+ g0 = G.mkGraph nodes edges -- orig graph+ g1 = G.trc $ removeCycles g0 -- search graph+ + nodes1 = sortBy compare' (G.nodes g0) -- totally ordered+ compare' a b+ = let (Just av) = G.lab g0 a+ (Just bv) = G.lab g0 b+ in compare av bv+ + dmap = list2DMap nodes1+ nodes2 = toListDMap $ fixSolve (assocsDMap dmap) dmap+ + fixSolve todo dmap+ = case Map.maxViewWithKey todo of+ Nothing -> dmap+ Just ((a,v), todo1) ->+ let preds = G.pre g1 v -- a must be before the preds+ troubles = filter (\b -> b < a) $ map (\v -> lookupDMapVal v dmap) preds+ in if null troubles+ then fixSolve todo1 dmap+ else let b = minimum troubles+ succs = G.suc g1 v+ in case insertDMap b v (removeDMap a dmap) of+ Left dmap' -> -- reindexed, rebuild todo+ let a' = lookupDMapVal v dmap'+ todo2 = Map.fromList [ (lookupDMapVal v dmap', v) | v <- Map.elems todo1 ]+ todo3 = Map.fromList [ (k,v) | v <- succs, let k = lookupDMapVal v dmap', k > a'] `Map.union` todo2+ in fixSolve todo3 dmap'+ Right dmap' ->+ let todo2 = Map.fromList [ (b,v) | v <- succs, let k = lookupDMapVal v dmap', b > a] `Map.union` todo1+ in fixSolve todo2 dmap'++-- eliminates those edges E from the graph that make it cyclic.+-- for an edge e `elem` E, it holds that not removing it from+-- the graph:+-- (a) makes it cylic, or+-- (b) does not increase the connected-ness of nodes+-- the idea:+-- (1) compute strongly connected components+-- (2) arbitrarily totally-order the nodes in such component+-- (3) filter out those edges between nodes in such component+-- that are going in a different direction than imposed+-- by the order.+removeCycles :: G.Gr DepItem Reason -> G.Gr DepItem Reason+removeCycles g+ = G.efilter keep g+ where+ cmps = G.scc g+ mp = IntMap.unions (map createMp cmps)+ createMp comp =+ let items = IntSet.fromList comp+ in IntMap.fromList [ (i, items) | i <- comp ]+ + keep (a, b, _)+ = case IntMap.lookup a mp of+ Nothing -> error "removeCycles: missing node"+ Just comp -> not (IntSet.member b comp) || b > a++-- A sparse array with elements indexed by doubles instead of integers,+-- offering fast insertion.++newtype DMap = DMap (Map Double Int, IntMap Double)++emptyDMap = DMap (Map.empty, IntMap.empty)++lookupDMapKey k (DMap (m,_)) = Map.findWithDefault undefined k m+lookupDMapVal v (DMap (_,m)) = IntMap.findWithDefault undefined v m++assocsDMap (DMap (m,_)) = Map.deleteMin $ Map.deleteMax m -- remove sentinels++list2DMap xs = DMap (m, r)+ where+ pairs = zip [1.0, 2.0..] xs+ m = Map.fromAscList ([(0.0,0)] ++ pairs ++ [(fromIntegral (length xs + 1),maxBound)])+ r = IntMap.fromList [ (k,d) | (d,k) <- pairs ]++-- insert just before b (potentially reassigns the elements in the map)+insertDMap b v (DMap (m,r))+ | c == a = let mp1' = Map.deleteMin mp1+ mp2' = Map.deleteMax mp2+ in Left $ list2DMap (Map.elems mp1' ++ [v, v'] ++ Map.elems mp2')+ | otherwise = Right $ DMap (Map.insert c v m, IntMap.insert v c r)+ where+ (mp1,Just v',mp2) = Map.splitLookup b m+ (a,_) = Map.findMax mp1+ c = (a + b) / 2.0++removeDMap a (DMap (m,r))+ = DMap (Map.delete a m, r)++toListDMap (DMap (m,_)) = tail $ init $ Map.elems m
+ src/Env.hs view
@@ -0,0 +1,130 @@+module Env( emptyEnv, enterWith, splitWith, enter, leave, dups, missing+ , extend, extendTail, find, Env, split, merge, defined, findAll+ , intersection, strip, push, assocs) where++import Data.Map(Map)+import qualified Data.Map as Map+import Data.List(nub)++newtype Env k v = Env [Map k (Entries k v)]++data Entries k v+ = E [k] [(k,v)]++instance (Show k, Show v) => Show (Env k v) where+ show (Env mps) = show (map Map.assocs mps)++instance (Show k, Show v) => Show (Entries k v) where+ show (E ms ks) = "<E: " ++ show ms ++ " * " ++ show ks ++ ">"++emptyEnv :: Env k v+emptyEnv = Env [Map.empty]++enter :: Env k v -> Env k v+enter (Env mps) = Env (Map.empty : mps)++enterWith :: Env k v -> Env k v -> Env k v+enterWith (Env (mp : _)) (Env mps) = Env (mp : mps)++leave :: Env k v -> (Env k v, Env k v)+leave (Env (mp : mps)) = (Env mps, Env [mp])++split :: Env k v -> (Env k v, Env k v)+split x = (enter x, x)++splitWith :: Env k v -> Env k v -> (Env k v, Env k v)+splitWith l x = (enterWith l x, x)++-- result: merged env, left only env+merge :: Ord k => Env k v -> Env k v -> (Env k v, Env k v)+merge (Env (ha:t)) (Env t1)+ | length t /= length t1 = error "input environments from different scopes"+ | otherwise = (Env t2, Env [l])+ where+ tstar = Map.unions t1+ (l,t2) = apply ha tstar t1++apply :: Ord k => Map k (Entries k v) -> Map k (Entries k v) -> [Map k (Entries k v)] -> (Map k (Entries k v), [Map k (Entries k v)]) +apply mp mpstar mps+ = (new `Map.union` mpDefs, mps')+ where+ (mpElse, mpDefs) = Map.partition (\(E _ ds) -> null ds) mp+ (old,new) = Map.partitionWithKey (\k _ -> Map.member k mpstar) mpElse+ mps' = Map.foldWithKey mergeEnt mps old++mergeEnt :: Ord k => k -> Entries k v -> [Map k (Entries k v)] -> [Map k (Entries k v)]+mergeEnt k e (mp:mps)+ | k `Map.member` mp = Map.insertWith mergeE k e mp : mps+ | otherwise = mp : mergeEnt k e mps++mergeE :: Entries k v -> Entries k v -> Entries k v+mergeE (E ms1 ds1) (E ms2 ds2) = E (ms1 ++ ms2) (ds1 ++ ds2)++dups :: Ord k => Env k v -> [[(k,v)]]+dups (Env mps) = foldl (Map.fold dups') [] mps+ where dups' (E _ defs) | length defs > 1 = (defs :)+ | otherwise = id++missing :: Ord k => Env k v -> [[k]]+missing (Env mps) = foldl (Map.fold miss') [] mps+ where miss' (E ks _) | null ks = id+ | otherwise = (ks :)++extend :: Ord k => k -> v -> Env k v -> Env k v+extend k v (Env (mp:mps))+ = case Map.lookup k mp of+ Nothing -> Env (Map.insert k (E [] [(k,v)]) mp : mps)+ Just (E ms ps) -> Env (Map.insert k (E ms ((k,v) : ps)) mp : mps)++extendTail :: Ord k => k -> v -> Env k v -> Env k v+extendTail k v (Env (mp:mps))+ = case Map.lookup k mp of+ Nothing -> Env (Map.insert k (E [] [(k,v)]) mp : mps)+ Just (E ms ps) -> Env (Map.insert k (E ms (ps ++ [(k,v)])) mp : mps)++find :: Ord k => k -> v -> Env k v -> (v, Env k v)+find k defl e@(Env mps)+ = case find' mps of+ Just (v, mps') -> (v, Env mps')+ Nothing -> (defl, Env (Map.insertWith mergeE k (E [k] []) (head mps) : tail mps ))+ where+ find' [] = Nothing+ find' ms@(mp : mps)+ = case Map.lookup k mp of+ Just (E _ ((_,v):_)) -> return (v, ms)+ _ -> do (v,mps') <- find' mps+ return (v, mp : mps')++findAll :: Ord k => k -> Env k v -> [v]+findAll k (Env mps) = concatMap find' mps+ where+ find' mp = case Map.lookup k mp of+ Just (E _ defs) -> map snd defs+ _ -> []++defined :: Ord k => k -> Env k v -> Bool+defined k (Env mps) = foldr def' False mps+ where def' mp r = Map.member k mp || r++intersection :: Ord k => [Env k v] -> Env k v+intersection [] = emptyEnv+intersection [env] = env+intersection (x:xs) = inter x (intersection xs)+ where+ inter (Env (a:l)) (Env (b:r)) = Env (inter' a b : zipWith inter' l r)+ inter' = Map.intersectionWith mergeE++strip :: Env k v -> Env k v+strip (Env t) = Env (map (Map.map strip') t)+ where strip' (E _ ds) = E [] (trim ds)+ trim [] = []+ trim (x:_) = [x]++push :: Ord k => Env k v -> Env k v -> Env k v+push (Env (m : _)) (Env (m' : t))+ = Env (Map.unionWith mergeE m m' : t)++assocs :: Ord k => Env k v -> [(k,v)]+assocs (Env ms)+ = [ head ds | (k, E _ ds) <- acs, not (null ds) ]+ where acs = Map.assocs $ Map.unions ms
+ src/Errs.ag view
@@ -0,0 +1,207 @@+MODULE {Errs} {errsToStr, prettyErrs, Errs, Err(..), debugMsg, nullErrs} {}++PRAGMA genlinepragmas++imports+{+import Common+import Pretty+import UU.Scanner.Position+import Data.Sequence(Seq)+import qualified Data.Sequence as Seq+import Data.Map(Map)+import qualified Data.Map as Map+import Data.Foldable+import Opts+}++WRAPPER Err++{+type Errs = Seq Err++prettyErr :: Opts -> Err -> PP_Doc+prettyErr opts e+ = pp_Syn_Err syn+ where+ inh = Inh_Err { opts_Inh_Err = opts }+ syn = wrap_Err sem inh+ sem = sem_Err e++prettyErrs :: Opts -> Errs -> PP_Doc+prettyErrs opts = vlist . map (prettyErr opts) . toList++errsToStr :: Opts -> Errs -> String+errsToStr opts es = disp (prettyErrs opts es) 999999 ""++debugMsg :: String -> Errs+debugMsg = Seq.singleton . Err_General noPos++nullErrs :: Errs -> Bool+nullErrs = Seq.null+}++DATA Err+ | General+ pos : Pos+ str : String+ | Missing+ ks : {[Ident]}+ | Dup+ ks : {[Ident]}+ | ExpVisit+ pos : Pos+ found : Ident+ expect : Ident+ | MissingVisit+ pos : Pos+ child : Ident+ visit : Ident+ | VisitsNotImpl+ nonterm : {[Ident]}+ vs : {[Ident]}+ | UndefVisit+ child : Ident+ visit : Ident+ visits : {[Ident]}+ | UndeclVisit+ pos : Pos+ name : Ident+ itf : Ident+ | UndetachVisit+ child : Ident+ visit : Ident+ expect : Ident+ | UndeclAttr+ child : Ident+ name : Ident+ | NameClash+ name : Ident+ | MissingAttr+ inherited : Bool+ child : Ident+ name : Ident+ | DupAttr+ inherited : Bool+ child : Ident+ name : Ident+ | MissingClause+ itf : Ident+ name : Ident+ | AmbAttach+ name : Ident+ visit : Ident+ | AmbDefault+ pos : Pos+ name : Ident+ | TypeConflict+ found : Ident+ expect : Ident+ | ChildSynUnav+ pos : Pos+ child : Ident+ itf : Ident+ vis : Ident+ name : Ident+ | Cyclic+ pos : Pos+ posMap : {Map DepItem Pos}+ comps : {[DepItem]}+ | MatchCyclic+ pos : Pos+ | ClausesCyclic+ pos : Pos+ name : Ident+ n : Int+ | EffCyclic+ pos : Pos+ | VisExpCyclic+ name : Ident+ child : Ident+ | IterCyclic+ pos : Pos+ | InternalInCyclic+ pos : Pos+ name : Ident++ATTR Err [ opts : Opts | | pp : {PP_Doc} ]++SEM Err+ | General lhs.pp = locLine @pos @str+ | Missing lhs.pp = locLine @loc.pos ("undefined identifier" >#< show @loc.main)+ | Dup lhs.pp = locLine @loc.pos ("duplicate identifier" >#< show @loc.main)+ | ExpVisit lhs.pp = locLine @pos ("expecting visit" >#< show @expect >#< "found" >#< show @found)+ | MissingVisit lhs.pp = locLine @pos ("missing invoke of visit" >#< show @visit >#< "of child" >#< show @child)+ | VisitsNotImpl lhs.pp = locLine @loc.pos ("missing visit" >#< show @loc.main >#< "for" >#< show (head @nonterm))+ | UndefVisit lhs.pp = locLine @loc.pos ("undefined visit" >#< show @visit >#< "of child" >#< show @child)+ | UndeclVisit lhs.pp = locLine @pos ("undeclared visit" >#< show @name >#< "of interface" >#< show @itf)+ | UndetachVisit lhs.pp = locLine @loc.pos ("undetachable visit" >#< show @visit >#< "of child" >#< show @child >|< ": expecting visit" >#< show @expect)+ | UndeclAttr lhs.pp = locLine @loc.pos ("undeclared attr" >#< show @child >|< "." >|< show @name)+ | NameClash lhs.pp = locLine @loc.pos ("name clash" >#< show @name)+ | MissingAttr lhs.pp = locLine @loc.pos ("undefined" >#< @loc.type >#< "attr" >#< show @child >|< "." >|< show @name)+ | DupAttr lhs.pp = locLine @loc.pos ("duplicate" >#< @loc.type >#< "attr" >#< show @child >|< "." >|< show @name)+ | MissingClause lhs.pp = locLine @loc.pos ("missing clause " >#< show @name >#< "of" >#< show @itf)+ | AmbAttach lhs.pp = locLine @loc.pos ("ambiguous attach of child" >#< show @name >#< "and visit" >#< show @visit)+ | AmbDefault lhs.pp = locLine @pos ("ambiguous default statement for" >#< show @name)+ | TypeConflict lhs.pp = locLine @loc.pos ("type" >#< show @found >#< "does not match expected type" >#< show @expect)+ | ChildSynUnav lhs.pp = locLine @pos ("default for" >#< show @name >#< "requires unavailable attribute" >#< show @name >#< "of" >#< show @child >|< "'s visit" >#< show @vis)+ | Cyclic lhs.pp = locLine @pos ("cycle:" >#< hlist_sp (map @loc.ppDep @comps) )+ | MatchCyclic lhs.pp = locLine @pos ("match statement not allowed in cyclic visit")+ | ClausesCyclic lhs.pp = locLine @pos ("cyclic visit" >#< show @name >#< "must have one clause, but has" >#< show @n)+ | EffCyclic lhs.pp = locLine @pos ("effectful code not allowed for cyclic stmt")+ | VisExpCyclic lhs.pp = locLine @loc.pos ("visit" >#< show @name >#< "of" >#< show @child >#< "is on a cycle")+ | IterCyclic lhs.pp = locLine @pos ("visit may not be iterated by cyclic stmt")+ | InternalInCyclic lhs.pp = locLine @pos ("internal visit" >#< show @name >#< "may not occur in a fully cyclic visit")++SEM Err+ | Missing Dup+ loc.main = if null @ks then ident "<unspecified>" else head @ks+ loc.others = tail @ks+ loc.pos = identPos @loc.main+ | VisitsNotImpl+ loc.main = if null @vs then ident "<unspecified>" else head @vs+ loc.others = tail @vs+ loc.pos = identPos (head @nonterm)+ | UndefVisit+ loc.pos = identPos @visit+ | UndetachVisit+ loc.pos = identPos @visit+ | UndeclAttr+ loc.pos = identPos @name+ | NameClash+ loc.pos = identPos @name+ | MissingAttr+ loc.pos = identPos @name+ loc.type = if @inherited then text "inh" else text "syn"+ | DupAttr+ loc.pos = identPos @name+ loc.type = if @inherited then text "inh" else text "syn"+ | MissingClause+ loc.pos = identPos @name+ | AmbAttach+ loc.pos = identPos @name+ | TypeConflict+ loc.pos = identPos @found+ | VisExpCyclic+ loc.pos = identPos @name+ | Cyclic+ loc.ppDep = \d -> let pos = Map.findWithDefault noPos d @posMap+ in case d of+ DepMatch _ -> "@" >|< show (line pos)+ DepAssert _ -> "@" >|< show (line pos)+ DepDefault o -> "d" >|< show o+ DepAttach n -> "@" >|< show (line pos)+ DepInvoke (visit:name:_) -> show name >|< "." >|< show visit >|< "@" >|< show (line $ identPos name)+ DepInvoke _ -> text "i???"+ DepVisStart (visit:_) -> ">" >|< show visit >|< "@" >|< show (line $ identPos visit)+ DepVisStart _ -> text ">v???"+ DepVisEnd (visit:_) -> show visit >|< "@" >|< show (line $ identPos visit) >|< "<"+ DepVisEnd _ -> text "<v???"+ DepClause (clause:_) -> "|" >|< show clause >|< "@" >|< show (line $ identPos clause)+ DepClause _ -> text "|???"++{+locLine :: PP a => Pos -> a -> PP_Doc+locLine (Pos l c f) d+ = pp f >|< ":" >|< pp l >|< "," >|< pp c >|< ":error:" >#< pp d+}
+ src/Main.hs view
@@ -0,0 +1,48 @@+module Main where + +import Scanner +import Parser +import Opts +import Common +import Transform +import Errs +import Control.Monad +import System +import System.IO + +main :: IO () +main = do opts <- commandlineArgs + let path = sourceFile opts + pos = Pos 1 1 path + when (path /= "") $ + do str <- readFile path + let tks = tokenize opts path str + pres = parseProgram opts pos tks + when (tokens opts) (putStrLn (show $ ppTokens tks)) + case pres of + Left err -> do hPutStrLn stderr err + hFlush stderr + exitFailure + Right ast -> let (errs, txtId, txtTarget, txtGraph) = transform pos opts ast + in do when (pretty opts) (putStrLn txtId) + when (not $ nullErrs errs) $ do + hPutStrLn stderr (errsToStr opts errs) + hFlush stderr + case outputGraph opts of + Just name -> myWriteFile name txtGraph + Nothing -> return () + if nullErrs errs || forceGen opts + then case outputFile opts of + Just name -> myWriteFile name txtTarget + Nothing -> return () + else exitFailure + +myWriteFile :: FilePath -> String -> IO () +myWriteFile path txt + = seq (seqChars txt) $ withFile path WriteMode writeHandle + where + seqChars [] = () + seqChars (c:cs) = seq c (seqChars cs) + + writeHandle h = do hPutStrLn h txt + hFlush h
+ src/Opts.hs view
@@ -0,0 +1,95 @@+module Opts where + +import System.Console.GetOpt +import System.Environment +import System.FilePath +import System.IO +import System.Directory + +data Opts + = Opts { sourceFile :: !FilePath + , outputFile :: !(Maybe FilePath) + , verbose :: !Bool + , tokens :: !Bool + , pretty :: !Bool + , genHaskell :: !Bool + , genJs :: !Bool + , forceGen :: !Bool + , noDataGen :: !Bool + , outputGraph :: !(Maybe FilePath) + , hNoLinePragmas :: !Bool + , genConNonterms :: !Bool + , genCoSems :: !Bool + } + +opts :: [OptDescr (Opts -> IO Opts)] +opts = [ Option "o" ["output"] (ReqArg oOutput "path") "output .hs file" + , Option "v" ["verbose"] (NoArg oVerbose) "verbose output" + , Option "" ["pretty"] (NoArg oPretty) "pp AST to STDOUT" + , Option "" ["tokens"] (NoArg oTokens) "print tokens to STDOUT" + , Option "" ["haskell"] (NoArg oHaskell) "generate Haskell code (default)" + , Option "" ["js"] (NoArg oJs) "generate Javascript code" + , Option "f" ["force"] (NoArg oForce) "force code generation" + , Option "" ["nodata"] (NoArg oNoData) "do not generate data types" + , Option "" ["graph"] (ReqArg oGraph "path") "output .dot file" + , Option "" ["noline"] (NoArg oNoLinePragmas) "do not generate LINE pragmas" + , Option "" ["genconnon"] (NoArg oGenConNon) "generate constructor nonterminals" + , Option "" ["gencosems"] (NoArg oGenCoSems) "generate cosems" + ] + +oOutput :: FilePath -> Opts -> IO Opts +oOutput s o = return (o { outputFile = Just s }) + +oGraph :: FilePath -> Opts -> IO Opts +oGraph s o = return (o { outputGraph = Just s }) + +oVerbose :: Opts -> IO Opts +oVerbose o = return (o { verbose = True }) + +oPretty :: Opts -> IO Opts +oPretty o = return (o { pretty = True }) + +oTokens :: Opts -> IO Opts +oTokens o = return (o { tokens = True }) + +oHaskell :: Opts -> IO Opts +oHaskell o = return (o { genHaskell = True, genJs = False }) + +oJs :: Opts -> IO Opts +oJs o = return (o { genJs = True, genHaskell = False }) + +oForce :: Opts -> IO Opts +oForce o = return (o { forceGen = True }) + +oNoData :: Opts -> IO Opts +oNoData o = return (o { noDataGen = True }) + +oNoLinePragmas :: Opts -> IO Opts +oNoLinePragmas o = return (o { hNoLinePragmas = True }) + +oGenConNon :: Opts -> IO Opts +oGenConNon o = return (o { genConNonterms = True }) + +oGenCoSems :: Opts -> IO Opts +oGenCoSems o = return (o { genCoSems = True }) + +defaultOpts :: Opts +defaultOpts = Opts { sourceFile = "", outputFile = Nothing, verbose = False, pretty = False, tokens = False + , genHaskell = True, genJs = False + , forceGen = False, noDataGen = False, outputGraph = Nothing, hNoLinePragmas = False + , genConNonterms = False, genCoSems = False } + +commandlineArgs :: IO Opts +commandlineArgs + = do args <- getArgs + let usage = usageInfo "Usage: imp-visits <OPTION ...> <ag-file> ..." opts + case getOpt Permute opts args of + (actions, args', []) | null args' -> do hPutStrLn stderr ("No AG source file specified.\n" ++ usage) + foldl (>>=) (return defaultOpts) actions + | otherwise -> foldl (>>=) (return $ patch $ defaultOpts { sourceFile = head args' }) actions + (_, _, errs) -> do hPutStrLn stderr (unlines errs ++ "\n" ++ usage) + return defaultOpts + where + patch o = if sourceFile o /= "" + then o { outputFile = Just $ replaceExtension (sourceFile o) ".hs" } + else o
+ src/Parser.hs view
@@ -0,0 +1,258 @@+module Parser(AgParser, parseProgram) where + + +import UU.Scanner +import UU.Scanner.GenToken +import UU.Parsing +import Opts +import Ast +import Common +import qualified Data.Sequence as Seq +import qualified Data.Map as Map +import Data.Map(Map) + + +type AgParser a = Parser Token a + +pEnd :: AgParser Pos +pEnd = pKeyPos "end" <?> "end of layout" + +pVarIdent :: AgParser Ident +pVarIdent = uncurry Ident <$> pVaridPos + +pConIdent :: AgParser Ident +pConIdent = uncurry Ident <$> pConidPos + +pIdentItf, pIdentAttr, pIdentChild, pIdentVisit, pIdentCon :: AgParser Ident +pIdentItf = pConIdent <?> "itf ident" +pIdentAttr = pVarIdent <?> "attr ident" +pIdentSem = pVarIdent <?> "sem ident" +pIdentChild = pVarIdent <?> "child ident" +pIdentVisit = pVarIdent <?> "visit ident" +pIdentClause = pVarIdent <?> "clause ident" +pIdentCon = pConIdent <?> "con ident" +pDataIdent = pConIdent <?> "data ident" +pConstrIdent = pConIdent <?> "con ident" +pFieldIdent = pVarIdent <?> "field ident" +pExtIdent = pConIdent <?> "ext ident" +pTyVarIdent = pVarIdent <?> "var ident" + +pProgram :: AgParser Program +pProgram = (Program_Program . BlocksTop_Top) <$> pList_gr pBlock + +pBlock :: AgParser Block +pBlock = Block_Itf <$> pItf + <|> Block_Section <$> pCurly pCode + <|> Block_Data <$> pData + <|> Block_Type <$> pType + <|> Block_DataSem <$> pDataSem + +pCode :: AgParser Code +pCode = Code_Code <$> pList_gr pItem + +pItf :: AgParser Itf +pItf = Itf_Itf + <$> pKeyPos "itf" + <*> pIdentItf + <*> pList_gr pVar + <*> pItfVisits + <* pEnd + <?> "itf" + +pItfVisits :: AgParser ItfVisits +pItfVisits + = pList1_gr pItfVisit <?> "visits" + +pItfVisit :: AgParser ItfVisit +pItfVisit + = (ItfVisit_Visit + <$> pKeyPos "visit" + <*> pIdentVisit + <*> opt (True <$ pKey "cyclic") False + <*> pList_gr pVar + <*> pList_gr pAttrInhSyn + <?> "visit") + +pAttrInhSyn :: AgParser Attr +pAttrInhSyn = (pAttrInh <|> pAttrSyn) <?> "attr" + +pAttrInh :: AgParser Attr +pAttrInh = Attr_Inh <$ pKey "inh" <*> pVarIdent <* pKey "::" <*> (pTextln <?> "type") <* pEnd + +pAttrSyn :: AgParser Attr +pAttrSyn = Attr_Syn <$ pKey "syn" <*> pVarIdent <* pKey "::" <*> (pTextln <?> "type") <* pEnd + +pData :: AgParser Data +pData = Data_Data <$> pKeyPos "data" <*> pDataIdent <*> pList_gr pVar <*> pList_gr pCon <*> pList_gr pExt <* pEnd <?> "data" + +pVar :: AgParser Var +pVar = Var_Var <$ pKeyPos "var" <*> pTyVarIdent <?> "var" + +pExt :: AgParser Ext +pExt = Ext_Ext <$ pKeyPos "ext" <*> pExtIdent <?> "ext" + +pCon :: AgParser Con +pCon = Con_Con <$> pKeyPos "con" <*> pConstrIdent <*> pList_gr pVar <*> pList_gr pField <?> "con" + +pField :: AgParser Field +pField = pFieldIdent <**> ( (\nt fld -> Field_Field fld (FieldType_Nonterm nt)) <$ pKey ":" <*> pDataIdent + <|> (\tp fld -> Field_Field fld (FieldType_Term tp)) <$ pKey "::" <*> (pTextln <?> "type") <* pEnd + ) <?> "field" + +pType :: AgParser Type +pType = Type_Alias <$> pKeyPos "type" <*> pDataIdent <* pKey ":" <*> pAliasType <*> pList_gr pVar <?> "type" + +pAliasType :: AgParser AliasType +pAliasType + = (AliasType_Prod <$> pParens_pCommas pDataIdent <?> "product type") + <|> (AliasType_List <$> pBracks pDataIdent <?> "list type") + <|> (AliasType_Maybe <$ pKey "Maybe" <*> pDataIdent <?> "Maybe type") + +pDataSem :: AgParser DataSem +pDataSem + = DataSem_Sem <$> pKeyPos "datasem" + <*> pIdentItf + <*> pList_gr pVar + <*> opt (pKey "monad" *> (Just <$> pTextln <* pEnd <?> "monad type")) Nothing + <*> opt (True <$ pKey "cyclic") False + <*> pList_gr pStmt + <*> (ClausesTop_Impl <$> pList_gr pClause) + <* pEnd <?> "data sem" + +pItem :: AgParser Item +pItem + = uncurry (flip Item_Plain) <$> (pTextlnPos <?> "code") + <|> uncurry mkAttr <$> (pVaridPos <?> "attribute occurrence") + <|> (Item_Sem <$> pKeyPos "sem" + <*> pIdentSem + <* pKey ":" + <*> pIdentItf + <*> pList_gr pVar + <*> opt (pKey "monad" *> (Just <$> pTextln <* pEnd <?> "monad type")) Nothing + <*> pSemVisit + <* pEnd <?> "sem") + <|> (Item_CoSem <$> pKeyPos "cosem" + <*> pIdentSem + <* pKey ":" + <*> pIdentItf + <*> pIdentVisit + <*> pList_gr pVar + <*> opt (pKey "monad" *> (Just <$> pTextln <* pEnd <?> "monad type")) Nothing + <*> pSemVisit + <* pEnd <?> "cosem") + <|> Item_DataSem <$> pDataSem + <|> (Item_Detach <$> pKeyPos "detach" <*> pIdentVisit <* pKey "of" <*> pIdentChild <* pEnd <?> "detach item") + <|> (Item_Brackets <$> pKeyPos "{" <*> pList_gr pItem <*> pKeyPos"}" <?> "brackets") + <?> "code item" + where + mkAttr s p = let (i,t) = break (\c -> c == '.' || c == ':') s + in Item_Attr p (Ident i p) (Ident (tail t) p) + +pSemVisit :: AgParser SemVisit +pSemVisit + = opt ( ((\pos nm cyclic chns stmts clauses -> + SemVisit_Prependable pos nm (SemVisit_Visit pos nm cyclic chns stmts clauses)) + <$> pKeyPos "visit" <*> pIdentVisit <*> opt (True <$ pKey "cyclic") False + <*> pList_gr pChn <*> pList_gr pStmt + <*> (ClausesTop_Impl <$> pList_gr pClause) + <* pEnd + <?> "visit") + <|> ((\pos nm cyclic stmts clauses -> + SemVisit_Internal pos nm cyclic stmts clauses) + <$> pKeyPos "internal" <*> pIdentVisit <*> opt (True <$ pKey "cyclic") False + <*> pList_gr pStmt + <*> (ClausesTop_Impl <$> pList_gr pClause) + <* pEnd + <?> "internal visit") + ) SemVisit_Impl + +pChn :: AgParser VisitAttr +pChn = VisitAttr_Chn <$ pKey "chn" <*> pVarIdent <* pKey "::" <*> (pTextln <?> "type") <* pEnd <?> "visit-local attr" + +pClause :: AgParser Clause +pClause = Clause_Clause <$> pKeyPos "clause" <*> pClauseIdent <*> pList_gr pStmt <*> pSemVisit <* pEnd <?> "clause" + +pClauseIdent :: AgParser Ident +pClauseIdent + = pVarIdent <|> pConIdent <?> "clause name" + +pStmt :: AgParser Stmt +pStmt + = ( Stmt_Eval <$> opt (Mode_Match <$ pKey "match") Mode_Assert <*> pPat <*> pBoundCode <?> "eval stmt" ) + <|> ( Stmt_Invoke <$> pKeyPos "invoke" <*> pIdentVisit <* pKey "of" <*> pIdentChild <*> pMaybeBoundCode <?> "invoke stmt" ) + <|> ( (\p v mb -> Stmt_Attach p (maybe Nothing (const $ Just v) mb) (maybe v id mb) ) + <$> pKeyPos "attach" <*> pIdentChild <*> pMbChild + <* pKey ":" <*> pIdentItf <*> pMaybeBoundCode <?> "attach stmt" ) + <|> ((\p -> Stmt_Attach p Nothing) <$> pKeyPos "child" <*> pIdentChild + <* pKey ":" <*> pIdentItf <*> pMaybeBoundCode <?> "child stmt") + <|> ( Stmt_Default True <$> pKeyPos "default?" <*> pVarIdent <*> pMaybeBoundCode <?> "default stmt" ) + <|> ( Stmt_Default False <$> (pKeyPos "default" <|> pKeyPos "default1") <*> pVarIdent <*> pMaybeBoundCode <?> "default1 stmt") + <|> ( Stmt_Rename <$> pKeyPos "rename" <*> pIdentChild <*> pList_gr pRename <?> "rename stmt") + <?> "statement" + +pRename :: AgParser Rename +pRename = Rename_Rename <$> pIdentAttr <* pKey "to" <*> pIdentAttr + +pMbChild :: AgParser (Maybe Ident) +pMbChild = opt (Just <$ pKey "of" <*> pIdentChild) Nothing + +pMaybeBoundCode :: AgParser MaybeBoundCode +pMaybeBoundCode + = opt (Just <$> pBoundCode) Nothing + +pBoundCode :: AgParser BoundCode +pBoundCode + = BoundCode_Code Bind_Fun <$> pKeyPos "=" <*> pCode <* pEnd + <|> BoundCode_Code Bind_Monadic <$> pKeyPos "<-" <*> pCode <* pEnd + +pPat :: AgParser Pat +pPat = pChainr_gr (Pat_Cons <$ pKey ":") pPatCon + +pPatCon :: AgParser Pat +pPatCon = pIdentCon <**> ( (Pat_Con <$$> pList_gr pPatBase <?> "con pattern") + <|> ((pKey "." *> pIdentCon <* pKey "@" <**> Pat_AttrCon <$$> pIdentChild) <?> "attr con") + ) + <|> pPatBase + +pPatBase :: AgParser Pat +pPatBase + = Pat_Underscore <$> pKeyPos "_" + <|> Pat_Attr <$> pIdentChild <* pKey "." <*> pIdentAttr + <|> Pat_Attr <$> pIdentChild <* pKey ":" <*> pIdentAttr -- should actually check to only parse these in case of javascript + <|> Pat_Tup <$> pParens_pCommas pPat + <|> Pat_List <$> pBracks_pCommas pPat + <?> "simple pattern" + + +-- +-- Run parser +-- + +parseProgram :: Opts -> Pos -> [Token] -> Either String Program +parseProgram opts pos tks + = parseTokens opts pos pProgram tks + +parseTokens :: Opts -> Pos -> AgParser a -> [Token] -> Either String a +parseTokens opts pos p tks + = if null msgs + then final `seq` Right v + else Left $ toError opts pos $ head msgs + where + steps = UU.Parsing.parse p tks + msgs = getMsgs steps + (Pair v final) = evalSteps steps + +toError :: Opts -> Pos -> Message Token (Maybe Token) -> String +toError opts pos (Msg exp mtok _) + = show p ++ ": " ++ m ++ ". Expecting " ++ show exp + where + p = case mtok of + Nothing -> pos + Just t -> position t + m = case mtok of + Nothing -> "end of file" + Just tok -> case tok of + Reserved str _ -> "symbol " ++ show str + ValToken TkError val _ -> "unrecognized token " ++ show val + ValToken tp val _ -> let descr = if verbose opts then show tp ++ " " else "" + in descr ++ show val
+ src/Pretty.hs view
@@ -0,0 +1,187 @@+-------------------------------------------------------------------------+-- Subset of UU.Pretty, based on very simple pretty printing+-- Extended with line-nr tracking+-------------------------------------------------------------------------++module Pretty+ ( PP_Doc, PP(..)+ , disp++ , (>|<), (>-<)+ , (>#<)+ , ppWithLineNr+ , hlist, vlist, hv, hlist_sp+ , fill+ , indent++ , pp_block+ , vlist_sep+ , pp_parens+ , pp_braces+ , pp_brackets+ , pp_doubleQuotes+ , hv_sp++ , empty, text+ )+ where++import Data.List(intersperse)+ +-------------------------------------------------------------------------+-- Doc structure+-------------------------------------------------------------------------++data Doc+ = Emp+ | Str !String -- basic string+ | Hor Doc !Doc -- horizontal positioning+ | Ver Doc !Doc -- vertical positioning+ | Ind !Int Doc -- indent+ | Line (Int -> Doc) -- line nr++type PP_Doc = Doc++-------------------------------------------------------------------------+-- Basic combinators+-------------------------------------------------------------------------++infixr 3 >|<, >#<+infixr 2 >-< ++(>|<) :: (PP a, PP b) => a -> b -> PP_Doc+l >|< r = pp l `Hor` pp r++(>-<) :: (PP a, PP b) => a -> b -> PP_Doc+l >-< r = pp l `Ver` pp r++(>#<) :: (PP a, PP b) => a -> b -> PP_Doc+l >#< r = l >|< " " >|< r++indent :: PP a => Int -> a -> PP_Doc+indent i d = Ind i $ pp d++text :: String -> PP_Doc+text s+ = let ls = lines s+ ls' | null ls = [""]+ | otherwise = ls+ in vlist (map Str ls')++empty :: PP_Doc+empty = Emp++ppWithLineNr :: PP a => (Int -> a) -> PP_Doc+ppWithLineNr f = Line (pp . f)++-------------------------------------------------------------------------+-- Derived combinators+-------------------------------------------------------------------------++hlist, vlist :: PP a => [a] -> PP_Doc+vlist [] = empty+vlist as = foldr (>-<) empty as+hlist [] = empty+hlist as = foldr (>|<) empty as++hv :: PP a => [a] -> PP_Doc+hv = vlist++hv_sp :: PP a => [a] -> PP_Doc+hv_sp = foldr (>#<) empty++fill :: PP a => [a] -> PP_Doc+fill = hlist++pp_block:: (PP a, PP b, PP c) => a -> b -> c -> [PP_Doc] -> PP_Doc+pp_block o c s as = pp o >|< hlist (intersperse (pp s) as) >|< pp c++pp_parens :: PP a => a -> PP_Doc+pp_parens p = '(' >|< p >|< ')'++pp_braces :: PP a => a -> PP_Doc+pp_braces p = '{' >-< p >-< '}'++pp_brackets :: PP a => a -> PP_Doc+pp_brackets p = '[' >|< pp p >|< ']'++pp_doubleQuotes :: PP a => a -> PP_Doc+pp_doubleQuotes p = '"' >|< pp p >|< '"'++vlist_sep :: (PP a, PP b) => a -> [b] -> PP_Doc+vlist_sep sep lst+ = vlist (intersperse (pp sep) (map pp lst))++hlist_sp :: PP a => [a] -> PP_Doc+hlist_sp ps = hlist (intersperse (pp " ") (map pp ps))++-------------------------------------------------------------------------+-- PP class+-------------------------------------------------------------------------++class Show a => PP a where+ pp :: a -> PP_Doc+ pp = text . show++ ppList :: [a] -> PP_Doc+ ppList as = hlist as++instance PP Doc where+ pp = id++instance PP Char where+ pp c = text [c]+ ppList = text++instance PP a => PP [a] where+ pp = ppList++instance Show Doc where+ show p = disp p 200 ""++instance PP Int where+ pp = text . show++instance PP Float where+ pp = text . show++-------------------------------------------------------------------------+-- Observation+-------------------------------------------------------------------------++isEmpty :: PP_Doc -> Bool+isEmpty Emp = True+isEmpty (Ver d1 d2) = isEmpty d1 && isEmpty d2+isEmpty (Hor d1 d2) = isEmpty d1 && isEmpty d2+isEmpty (Ind _ d ) = isEmpty d+isEmpty _ = False++-------------------------------------------------------------------------+-- Rendering+-------------------------------------------------------------------------++disp :: PP_Doc -> Int -> ShowS+disp d _ s+ = r+ where (r,_,_) = put 0 1 d s+ put p l d s+ = case d of+ Emp -> (s,p,l)+ Str s' -> (s' ++ s,p + length s',l)+ Ind i d -> (ind ++ r,p', l')+ where (r,p',l') = put (p+i) l d s+ ind = replicate i ' '+ Hor d1 d2 -> (r1,p2,l2)+ where (r1,p1,l1) = put p l d1 r2+ (r2,p2,l2) = put p1 l1 d2 s+ Ver d1 d2 | isEmpty d1+ -> put p l d2 s+ Ver d1 d2 | isEmpty d2+ -> put p l d1 s+ Ver d1 d2 -> (r1,p2,l2)+ where (r1,p1,l1) = put p l d1 $ "\n" ++ ind ++ r2+ (r2,p2,l2) = put p (l1+1) d2 s+ ind = replicate p ' '+ Line f -> (r,p',l')+ where (r,p',l') = put p l (f l) s+
+ src/Scanner.x view
@@ -0,0 +1,140 @@+{ +module Scanner(tokenize, ppTokens) where + +import UU.Scanner +import UU.Scanner.GenToken +import Data.Char +import UU.Pretty +import Opts +} + +$litChar = [^[\" \\]] +$identChar = [a-zA-Z0-9\'_] + +@ucIdent = [A-Z] $identChar* +@lcIdent = [a-z] $identChar* + +tokens :- + <0,a> (" " | \n | \r)+ ; -- ignore spaces + <0,a,h> "--" $white .* ; -- to-end-of-line comment + <0,a> "{-" ([^\-] | $white | "-" [^\}])* "-}" ; -- multi-line comment (not nested) + <h> "{-" ([^\-] | $white | "-" [^\}])* "-}" { valueToken TkTextln } -- haskell comment token + + <0,h,j> "{" { reserved } + <h,j> "}" { reserved } + + <0> itf | visit | cyclic | inh | syn { reserved } + <0> data | con | type | Maybe | ext { reserved } + <0> datasem { reserved } + + <a> clause | visit | cyclic | chn | internal { reserved } + <a> match | invoke | of | to { reserved } + <a> attach | detach | child | rename { reserved } + <a> default | default1 | "default?" { reserved } + + <0,a> "::" | ":" | "monad" { reserved } + <0,a> var { reserved } + + <0,a> "(" | ")" | "[" | "]" | "," { reserved } + <a> "=" | "<-" { reserved } + <a> "." | "@" | "_" { reserved } + <h,j> cosem | sem | datasem { reserved } + + <0,a> @lcIdent { valueToken TkVarid } + <0,a> @ucIdent { valueToken TkConid } + + <h,j> \" ([^\"]|\\\")* \" { valueToken TkTextln } -- scan string + <h> @ucIdent "." @lcIdent { valueToken TkTextln } -- treat qualified names as opaque strings + <h> @lcIdent "." @lcIdent { valueToken TkVarid } -- scan attr occ + <j> @lcIdent ":" @lcIdent { valueToken TkVarid } -- scan attr occ + + +{ +tokenize :: Opts -> FilePath -> String -> [Token] +tokenize opts path str + = merge $ scanTks opts [(Pos 1 0 path, 0)] (Pos 1 1 path, str) + +merge [] = [] +merge r@[_] = r +merge (ValToken TkTextln s1 p : ValToken TkTextln s2 _ : r) + = merge (ValToken TkTextln (s1 ++ s2) p : r) +merge (t : r) = t : merge r + +type AlexInput = (Pos, String) -- current position, current string + +alexGetChar :: AlexInput -> Maybe (Char,AlexInput) +alexGetChar (_, []) = Nothing +alexGetChar (p, c : cs) = Just (c, (adv p c, cs)) + +alexInputPrevChar :: AlexInput -> Char +alexInputPrevChar = error "alexInputPrevChar: should not be used." + +type Ctx = (Pos, Int) -- context start position, start code +type CtxStack = [Ctx] + +scanTks :: Opts -> CtxStack -> AlexInput -> [Token] +scanTks opts st inp@(pos,str) + = let (sc,st',tks) = unwind pos str st [] + in tks ++ + case alexScan inp sc of + AlexEOF -> unwindAll st' pos + AlexError _ -> let (Just (c, inp')) = alexGetChar inp + tk | sc == h || sc == j = valueToken TkTextln [c] pos + | otherwise = errToken [c] pos + in tk : scanTks opts st' inp' + AlexSkip inp' _ -> scanTks opts st' inp' + AlexToken inp' len act -> let tk = act (take len str) pos + in tk : scanTks opts (push opts sc tk st') inp' + +push :: Opts -> Int -> Token -> CtxStack -> CtxStack +push opts sc (Reserved k pos) + | sc == 0 && k == "{" = ((noPos, n) :) + | sc == h && k == "{" = ((noPos, n) :) + | sc == h && k == "}" = tail + | sc == j && k == "{" = ((noPos, j) :) + | sc == j && k == "}" = tail + | sc == 0 && k == "itf" = ((pos, 0) :) + | sc == 0 && k == "data" = ((pos, 0) :) + | sc /= a && k == "sem" = ((pos, a) :) + | sc /= a && k == "datasem" = ((pos, a) :) + | sc /= a && k == "cosem" = ((pos, a) :) + | sc /= a && k == "detach" = ((pos, a) :) + | sc == a && k == "=" = ((pos, n) :) + | sc == a && k == "<-" = ((pos, n) :) + | sc == 0 && k == "::" = ((pos, n) :) + | sc == a && k == "::" = ((pos, n) :) + | sc == a && k == "monad" = ((pos, n) :) + | sc == a && k == "visit" = ((pos, a) :) + | sc == a && k == "internal" = ((pos, a) :) + | sc == a && k == "clause" = ((pos, a) :) + where + n | genHaskell opts = h + | genJs opts = j + | otherwise = error "target language unspecified" +push _ _ _ = id + +unwind :: Pos -> String -> CtxStack -> [Token] -> (Int, CtxStack, [Token]) +unwind p str st@((p',c) : st') acc + | (cp == cp' && + (null str || (not $ isSpace $ head str)) ) + || (cp < cp' && + ( any (not . isSpace) $ + take (cp' - cp) str) ) = unwind p str st' (reserved "end" p : acc) + | otherwise = (c, st, acc) + where cp = column p + cp' = column p' + +unwindAll :: CtxStack -> Pos -> [Token] +unwindAll st pos + = map (const (reserved "end" pos)) (init st) + +ppTokens :: [Token] -> PP_Doc +ppTokens = vlist . map ppToken + +ppToken :: Token -> PP_Doc +ppToken (Reserved str pos) = "keyword " >|< show str >|< " at " >|< ppPos pos +ppToken (ValToken tp val pos) = show tp >|< " " >|< val >|< " at " >|< ppPos pos + +ppPos :: Pos -> PP_Doc +ppPos (Pos l c _) = show l >|< "," >|< show c +}
+ src/TargetGraph.ag view
@@ -0,0 +1,104 @@+-- This file is included by Transform.ag+-- Generates code for a dependency graph++SEM Program | Program+ loc.ppGraph = "digraph Deps {"+ >-< indent 2 ( vlist+ [ ppgNode (Map.findWithDefault noPos d @blocks.gathStmtPosMap) d @loc.distRanks+ | d <- @loc.unqItems+ ])+ >-< indent 2 ( vlist+ [ label' from >#< "->" >#< ppgDeps (map label' [to])+ >#< pp_block "[" "]" "," ( ppgColor (isOnCycle from @loc.distRanks && isOnCycle to @loc.distRanks)+ : maybe [] (\d -> [ppgProp "label" d]) (ppgReason reason))+ + >|< ";"+ | (from, (reason, tos)) <- Map.assocs @loc.unqDeps+ , length tos >= 1+ , let label' = \item -> ppgKey (Map.findWithDefault noPos item @blocks.gathStmtPosMap) item+ , to <- tos ]+ )+ >-< "}"++{+isOnCycle :: DepItem -> Map DepItem (Bool,Int) -> Bool+isOnCycle d mp+ = case Map.lookup d mp of+ Nothing -> False+ Just (b,_) -> b++ppgProp :: PP a => String -> a -> PP_Doc+ppgProp s d = s >|< "=" >|< pp_doubleQuotes (pp d)++ppgNms :: QIdent -> PP_Doc+ppgNms = hlist . map show++ppgDeps :: PP a => [a] -> PP_Doc+ppgDeps [x] = pp x+ppgDeps xs = pp_block "{" "}" ";" (map pp xs)++ppgNode :: Pos -> DepItem -> Map DepItem (Bool,Int) -> PP_Doc+ppgNode pos item rankMap+ = case item of+ DepMatch n -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "label" l, c] >|< ";"+ DepAssert n -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "label" l, c] >|< ";"+ DepDefault n -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "label" l, c] >|< ";"+ DepAttach n -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "label" l, c] >|< ";"+ DepInvoke nms -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "skew" ".3",ppgProp "label" l,c] >|< ";"+ DepVisStart nms -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "skew" ".3",ppgProp "label" l,c] >|< ";"+ DepVisEnd nms -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "skew" ".3",ppgProp "label" l,c] >|< ";"+ DepClause nms -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "skew" ".3",ppgProp "label" l,c] >|< ";"+ where mbInfo = Map.lookup item rankMap+ l = ppgLabel pos item (maybe Nothing (Just . snd) mbInfo)+ c = ppgColor (maybe False fst mbInfo)++ppgColor :: Bool -> PP_Doc+ppgColor True = ppgProp "color" "red4"+ppgColor False = ppgProp "color" "black"++ppgLabel :: Pos -> DepItem -> Maybe Int -> PP_Doc+ppgLabel pos item mbRank+ = case item of+ DepMatch m -> r >#< show m >|< "?@" >|< show (line pos)+ DepAssert n -> r >#< show n >|< "@" >|< show (line pos)+ DepDefault o -> r >#< "d" >|< show o+ DepAttach n -> r >#< "@" >|< show (line pos)+ DepInvoke (visit:name:_) -> r >#< name >|< "." >|< visit >|< "@" >|< show (line $ identPos name)+ DepInvoke _ -> r >#< text "i???"+ DepVisStart (visit:_) -> r >#< ">" >|< show visit >|< "@" >|< show (line $ identPos visit)+ DepVisStart _ -> r >#< text ">v???"+ DepVisEnd (visit:_) -> r >#< show visit >|< "@" >|< show (line $ identPos visit) >|< "<"+ DepVisEnd _ -> r >#< text "<v???"+ DepClause (clause:_) -> r >#< "|" >|< show clause >|< "@" >|< show (line $ identPos clause)+ DepClause _ -> r >#< text "|???"+ where+ r = case mbRank of+ Nothing -> empty+ Just k -> show k >|< ":"++ppgKey :: Pos -> DepItem -> PP_Doc+ppgKey pos item+ = case item of+ DepMatch n -> "s" >|< show n+ DepAssert n -> "s" >|< show n+ DepDefault n -> "d" >|< show n+ DepAttach n -> "a" >|< show n+ DepInvoke nms -> "iv" >|< ppgNms nms+ DepVisStart nms -> "vb" >|< ppgNms nms+ DepVisEnd nms -> "ve" >|< ppgNms nms+ DepClause nms -> "cl" >|< ppgNms nms++ppgReason :: Reason -> Maybe PP_Doc+ppgReason reason+ = case reason of+ ReasonScopeVisit i -> Nothing -- Just ("sc-vis-pre" >#< show i)+ ReasonScopeClause i -> Nothing -- Just ("sc-cl" >#< show i)+ ReasonScopeEnd i -> Nothing -- Just ("sc-vis-end" >#< show i)+ ReasonAttrReq chld attr -> Just (show chld >|< "." >|< show attr)+ ReasonInvokeReq i -> Just ("inv" >#< show i)+ ReasonChildReq i -> Nothing -- Just ("chld" >#< show i)+ ReasonAttach i v -> Just ("att" >#< show i >|< "." >|< show v)+ ReasonDefault attr -> Nothing -- Just ("def." >|< show attr)+ ReasonDetach _ _ -> Nothing -- Just $ text "detach"+ ReasonError -> Just $ text "error"+}
+ src/TargetHaskell.ag view
@@ -0,0 +1,644 @@+-- This file is included by Transform.ag+-- Based on the AST of AstAG.ag+-- Generates code for Haskell++SEM Program | Program+ +pp = if genHaskell @lhs.opts+ then (@loc.hpp >-<)+ else id+++{+hItfNm nm = "I_" ++ show nm+hCoItfNm nm vis = hItfNm (mkCoIdent nm vis)+hItfVsNm nm vis = "I_" ++ show nm ++ "_" ++ show vis+hCoItfVsNm nm vis = hItfVsNm (mkCoIdent nm vis) vis+hNt x = "_nt_" ++ show x+hVis x = "_vis_" ++ show x+hSemNm k v = "_sem_" ++ show k ++ "_" ++ show v++hInp child name+ | show child == "loc" = show child ++ "L" ++ show name+ | show child == "lhs" = show child ++ "I" ++ show name+ | show child == "vis" = show child ++ "I" ++ show name+ | otherwise = show child ++ "S" ++ show name++hOutp child name+ | show child == "loc" = show child ++ "L" ++ show name+ | show child == "lhs" = show child ++ "S" ++ show name+ | show child == "vis" = show child ++ "S" ++ show name+ | otherwise = show child ++ "I" ++ show name++hOutpLoc child name = show child ++ "L" ++ show name+hInpLoc child name = show child ++ "L" ++ show name++hInhFldNm nm itf vis = show nm ++ "_Inh_" ++ show itf+hSynFldNm nm itf vis = show nm ++ "_Syn_" ++ show itf+hInhFldNmFull nm itf vis = hInhFldNm nm itf vis ++ "_" ++ show vis+hSynFldNmFull nm itf vis = hSynFldNm nm itf vis ++ "_" ++ show vis+hCoInhFldNm nm itf vis = hInhFldNm nm (mkCoIdent itf vis) vis+hCoSynFldNm nm itf vis = hSynFldNm nm (mkCoIdent itf vis) vis+hCoInhFldNmFull nm itf vis = hCoInhFldNm nm itf vis ++ "_" ++ show vis+hCoSynFldNmFull nm itf vis = hCoSynFldNm nm itf vis ++ "_" ++ show vis++hInhDt itf vis = "Inh_" ++ show itf ++ "_" ++ show vis+hSynDt itf vis = "Syn_" ++ show itf ++ "_" ++ show vis+hCoInhDt itf vis = hInhDt (mkCoIdent itf vis) vis+hCoSynDt itf vis = hSynDt (mkCoIdent itf vis) vis++hInvNm itf nm = "invoke_" ++ show itf ++ "_" ++ show nm+hCoInvNm itf nm = "coinvoke_" ++ show itf ++ "_" ++ show nm+hNextNm itf nm = "next_" ++ show itf ++ "_" ++ show nm+hCurrentNm itf nm = "current_" ++ show itf ++ "_" ++ show nm++hDtNm nm = show nm+hConNm dt nm = show dt ++ "_" ++ show nm+hFldNm dt con nm = show nm ++ "_" ++ show dt ++ "_" ++ show con+hDtSemNm nm = "dnt_" ++ show nm++hDfltNm nm nr = "dflt_" ++ show nm ++ "_" ++ show nr++hCatch :: (PP a, PP b) => a -> b -> PP_Doc+hCatch l r = "catchError"+ >-< indent 2 (pp_parens (pp l))+ >-< indent 2 (pp_parens (pp r))++hThrow msg = "throwError" >#< pp_parens ("strMsg" >#< show msg)+}+++SEM Program | Program+ loc.hpp = vlist @blocks.hpps++ATTR Block Itf ItfVisit Data Con Field Type AliasType DataSem MaybeBoundCode BoundCode Code+ Item SemVisit ClausesTop Clauses Clause Stmt Pat ImplStmt Var AttrTypePat AttrTypeCode+ [ | | hpp : {PP_Doc} ]++ATTR ExprField [ | | hopp : {(Int,PP_Doc)} ]++SEM Block+ | Section lhs.hpp = @code.hpp+ | Itf lhs.hpp = @itf.hpp+ | Data lhs.hpp = if noDataGen @lhs.opts then empty else @data.hpp+ | Type lhs.hpp = if noDataGen @lhs.opts then empty else @type.hpp+ | Item lhs.hpp = "mk" >|< show @name >#< "::" >#< @item.hppType+ >-< "mk" >|< show @name >#< "="+ >-< indent 2 @item.hpp+ | DataSem lhs.hpp = @sem.hpp++SEM Itf+ | Itf lhs.hpp = empty+ + +hpp = ("type" >#< hItfNm @name >#< "m" >#< "=" >#< hItfVsNm @name @visits.firstVisit >#< "m") >-<+ +hpp = vlist @visits.hpps >-<++SEM ItfVisit+ | Visit lhs.hpp = empty+ loc.hCtx = "(Monad m) => "+ loc.hMonad = if @cyclic then empty else text "m"+ loc.hConNm = text $ hItfVsNm @loc.itfNm @name+ loc.hCoConNm = text $ hCoItfVsNm @loc.itfNm @name+ loc.hRepFld = [ hSynFldNmFull repIdent @loc.itfNm @name >#< "::" >#< "!" >|< pp_parens (@loc.hConNm >#< "m") ]+ loc.hNextFld = maybe [] (\nm -> [ hSynFldNmFull nextIdent @loc.itfNm @name + >#< "::" >#< "!" >|< pp_parens (hItfVsNm @loc.itfNm nm >#< "m")]) @lhs.mbNextVisit+ loc.hArrTp = hInhDt @loc.itfNm @name >#< "m" >#< "->" >#< @loc.hMonad >#< pp_parens (hSynDt @loc.itfNm @name >#< "m")+ loc.hCoArrTp = hCoInhDt @loc.itfNm @name >#< "m" >#< "->" >#< @loc.hMonad >#< pp_parens (hCoSynDt @loc.itfNm @name >#< "m")+ +hpp = ("newtype" >#< @loc.hCtx >#< @loc.hConNm >#< "m" >#< "=" >#< @loc.hConNm >#< pp_parens @loc.hArrTp) >-<+ +hpp = ("newtype" >#< @loc.hCtx >#< @loc.hCoConNm >#< "m" >#< "=" >#< @loc.hCoConNm >#< pp_parens @loc.hCoArrTp) >-<+ +hpp = ("data" >#< @loc.hCtx+ >#< hInhDt @loc.itfNm @name >#< "m" >#< "=" >#< hInhDt @loc.itfNm @name+ >#< pp_block "{" "}" "," @attrs.hInhDeclPPs) >-<+ +hpp = ("data" >#< @loc.hCtx+ >#< hSynDt @loc.itfNm @name >#< "m" >#< "=" >#< hSynDt @loc.itfNm @name+ >#< pp_block "{" "}" "," (@loc.hRepFld ++ @loc.hNextFld ++ @attrs.hSynDeclPPs)+ ) >-<+ +hpp = ("data" >#< @loc.hCtx+ >#< hCoInhDt @loc.itfNm @name >#< "m" >#< "=" >#< hCoInhDt @loc.itfNm @name+ >#< pp_block "{" "}" "," @attrs.hCoInhDeclPPs) >-<+ +hpp = ("data" >#< @loc.hCtx+ >#< hCoSynDt @loc.itfNm @name >#< "m" >#< "=" >#< hCoSynDt @loc.itfNm @name+ >#< pp_block "{" "}" "," (+ (hCoSynFldNmFull repIdent @loc.itfNm @name >#< "::" >#< "!" >|< pp_parens (@loc.hCoConNm >#< "m"))+ : @attrs.hCoSynDeclPPs)+ ) >-<+ +hpp = ("type" >#< hCoItfNm @loc.itfNm @name >#< "m" >#< "=" >#< hCoItfVsNm @loc.itfNm @name >#< "m") >-<+ + +hpp = (hInvNm @loc.itfNm @name >#< "!" >|< pp_parens (@loc.hConNm >#< "!" >|< "__f") >#< "=" >#< "__f") >-<+ +hpp = (hCoInvNm @loc.itfNm @name >#< "!" >|< pp_parens (@loc.hCoConNm >#< "!" >|< "__f") >#< "=" >#< "__f") >-<+ +hpp = case @lhs.mbNextVisit of+ Nothing -> id+ Just v -> ((hNextNm @loc.itfNm @name >#< "!" >|< pp_parens (+ hSynDt @loc.itfNm @name >#< pp_braces (+ hSynFldNmFull nextIdent @loc.itfNm @name >#< "=" >#< "__f")+ ) >#< "=" >#< "__f" >#< "--" >#< v) >-<)+ +hpp = ((hCurrentNm @loc.itfNm @name >#< "!" >|< pp_parens (+ hSynDt @loc.itfNm @name >#< pp_braces (hSynFldNmFull repIdent @loc.itfNm @name >#< "=" >#< "__f")+ ) >#< "=" >#< "__f") >-<)++{+nextIdent :: Ident+nextIdent = ident "next_"++repIdent :: Ident+repIdent = ident "rep_"+}++ATTR Attrs Attr [ | | hInhDeclPPs,hSynDeclPPs,hCoInhDeclPPs,hCoSynDeclPPs USE {++} {[]} : {[PP_Doc]}]++SEM Attr+ | Inh Syn loc.hTpPP = stripSpacing @type+ loc.pos = identPos @name+ loc.hBoxed = if @lhs.visCyclic then empty else text "!"+ | Inh loc.hFldNm = hInhFldNm @name @loc.itfNm @loc.visNm+ lhs.hInhDeclPPs = [hWrapLinePragma @lhs.opts (identPos @name) (@loc.hFldNm >#< "::" >#< @loc.hBoxed >|< @loc.hTpPP)]+ | Syn loc.hFldNm = hSynFldNm @name @loc.itfNm @loc.visNm+ lhs.hSynDeclPPs = [hWrapLinePragma @lhs.opts (identPos @name) (@loc.hFldNm >#< "::" >#< @loc.hBoxed >|< @loc.hTpPP)]++ | Inh loc.hCoFldNm = hCoSynFldNm @name @loc.itfNm @loc.visNm+ lhs.hCoSynDeclPPs = [hWrapLinePragma @lhs.opts (identPos @name) (@loc.hCoFldNm >#< "::" >#< @loc.hBoxed >|< @loc.hTpPP)]+ | Syn loc.hCoFldNm = hCoInhFldNm @name @loc.itfNm @loc.visNm+ lhs.hCoInhDeclPPs = [hWrapLinePragma @lhs.opts (identPos @name) (@loc.hCoFldNm >#< "::" >#< @loc.hBoxed >|< @loc.hTpPP)]++{+stripSpacing :: String -> PP_Doc+stripSpacing = pp_block "(" ")" " " . map text . lines+}++SEM Data | Data+ lhs.hpp = "data" >#< hDtNm @name >#< hlist_sp @vars.hpps >-< indent 2 (vlist @cons.hpps) >-< indent 2 @loc.hExts+ loc.hExts = if Set.null @exts.gathExts+ then empty+ else "deriving" >#< pp_block "(" ")" "," [ text (show i) | i <- Set.toList @exts.gathExts ]++SEM Con | Con+ loc.prefix = if @lhs.isFirst then "=" else "|"+ lhs.hpp = @loc.prefix >#< @loc.hVarsPP >#< hConNm @lhs.data @name >#< pp_block "{" "}" "," @fields.hpps+ loc.hVarsPP = if null @vars.vars+ then empty+ else "forall" >#< hlist_sp (map (text .show) @vars.vars) >#< "."++SEM Field | Field+ loc.txtTp = either show id @type.fldType+ lhs.hpp = hFldNm @lhs.data @lhs.con @name >#< "::" >#< "!" >|< hParensWithPos @lhs.opts (identPos @name) (stripSpacing @loc.txtTp)++ATTR Cons Con [ isFirst : Bool | | ]+SEM Data | Data cons.isFirst = True+SEM Cons | Cons tl.isFirst = False++SEM Type | Alias+ lhs.hpp = "type" >#< @name >#< hlist_sp @vars.hpps >#< "=" >#< @type.hpp++SEM AliasType+ | Prod lhs.hpp = pp_block "(" ")" "," (map (text . show) @fields)+ | List lhs.hpp = pp_brackets $ text $ show @type+ | Maybe lhs.hpp = "Maybe" >#< pp_parens (text $ show @type)++SEM DataSem | Sem+ lhs.hpp = hDtSemNm @tp >#< "::" >#< @loc.hppType+ >-< hDtSemNm @tp >#< "="+ >-< indent 4 @clauses.hpp+ loc.hppType = case @mbMonad of+ Nothing -> "(Monad m, MonadError e m, Error e) => " >#< hItfNm @tp >#< "m"+ Just t -> hItfNm @tp >#< pp_parens (stripSpacing t)++SEM BoundCode+ | Code lhs.hpp = @code.hpp -- deal with binder etc in parent++SEM MaybeBoundCode+ | Nothing lhs.hpp = empty++SEM Code+ | Code lhs.hpp = vlist @items.hpps++SEM Item+ | Plain lhs.hpp = if all isSpace @txt+ then empty+ else vlist $ modifySpacing @loc.diff @lhs.indent @txt+ | Attr lhs.hpp = addSpaces @loc.diff $ @tp.hpp+ | Sem CoSem lhs.hpp = addSpaces @loc.diff ( pp_parens (+ "let" >#< (hNt @name >#< "::" >#< @loc.hppType)+ >-< indent 4 (hNt @name >#< "=")+ >-< indent 6 @first.hpp+ >-< "in" >#< hNt @name ))+ | DataSem lhs.hpp = @sem.hpp+ | Detach lhs.hpp = addSpaces @loc.diff (text $ hSemNm @name @visit)+ | Brackets lhs.hpp = addSpaces @loc.diff (text "{")+ >-< vlist @items.hpps+ >-< addSpaces @loc.diff2 (text "}")+ | Construct lhs.hpp = addSpaces @loc.diff (pp_parens @loc.hpp)+ loc.hFldsPPs = sortPairs @fields.hopps+ loc.hpp = case @mbAlias of+ Nothing -> hConNm @data @con >#< hlist_sp @loc.hFldsPPs+ Just alias -> case alias of+ AliasType_Prod _ -> pp_block "(" ")" "," @loc.hFldsPPs+ AliasType_List _ -> if @con == ident "Cons"+ then "(:)" >#< hlist_sp @loc.hFldsPPs+ else text "[]"+ AliasType_Maybe _ -> if @con == ident "Nothing"+ then "Just" >#< hlist_sp @loc.hFldsPPs+ else text "Nothing"++{+hWrapLinePragma :: PP a => Opts -> Pos -> a -> PP_Doc+hWrapLinePragma opts pos doc+ | isJust (outputFile opts) && not (hNoLinePragmas opts)+ = let nrIn = line pos+ nmIn = file pos+ nmOut = fromJust (outputFile opts)+ in ""+ >-< "{-# LINE" >#< show nrIn >#< show nmIn >#< "#-}"+ >-< doc+ >-< "{-# LINE" >#< ppWithLineNr (\n -> pp $ show $ n + 1) >#< show nmOut >#< "#-}"+ >-< ""+ | otherwise = pp doc+}++ATTR Item [ | | hppType : PP_Doc ]+SEM Item+ | Plain Attr Detach Brackets Construct+ loc.hppType = text "{- cannot be used toplevel -}"+ | Sem loc.hppType = case @mbMonad of+ Nothing -> "(Monad m, MonadError e m, Error e) => " >#< hItfNm @tp >#< "m"+ Just t -> hItfNm @tp >#< pp_parens (stripSpacing t)+ | CoSem loc.hppType = case @mbMonad of+ Nothing -> "(Monad m, MonadError e m, Error e) => " >#< hCoItfNm @tp @visit >#< "m"+ Just t -> hCoItfNm @tp @visit >#< pp_parens (stripSpacing t)+ | DataSem+ loc.hppType = text "{- no type signature for nested datatype semantics -}"++SEM SemVisit+ | Visit loc.hChildren = hlist_sp [ hSemNm k v | (k, Just v) <- Map.assocs @loc.myNextVisits ]+ loc.hChns = [ hParensWithPos @lhs.opts @pos $ hInp visIdent nm | (nm,_) <- Map.assocs @attrs.gathVisitLocalAttrs ]+ loc.hChnsOut = [ hParensWithPos @lhs.opts @pos $ hOutp @name nm | (nm,_) <- Map.assocs @attrs.gathVisitLocalAttrs ]+ loc.hInhPPs = [ hInhFldNm nm @loc.itfNm @name >#< "=" >#< hParensWithPos @lhs.opts @pos (hInp lhsIdent nm)+ | (nm,_) <- Map.assocs @loc.inhAttrMap ]+ loc.hMatch = pp_parens (hInhDt @loc.itfNm @name >#< pp_block "{" "}" "," @loc.hInhPPs)+ loc.hVisType = if @lhs.withinCoSem+ then text (hCoItfVsNm @lhs.coItf @name)+ else text (hItfVsNm @loc.itfNm @name)+ lhs.hpp = pp_parens (+ "let -- __vis ::" >#< @loc.hVisType + >-< " __vis =" >#< (+ "let" >#< ( hVis @name >#< @loc.hChildren >#< @loc.hChns >#< @loc.hMatch+ >-< indent 2 (+ "=" >#< ( if @loc.fullCyclic+ then "let" >#< vlist (concat @loc.hGroupedStmts)+ >-< "in" >#< @clauses.hpp+ else "do" >#< (+ hppStmtBlock @loc.hGroupedStmts+ >-< @clauses.hpp+ )+ )+ )+ )+ >-< "in" >#< hItfVsNm @loc.itfNm @name >#<+ pp_parens (hVis @name >#< @loc.hChildren >#< @loc.hChnsOut)+ ) >-< "in __vis"+ )+ | Internal lhs.hpp = hppStmtBlock @loc.hGroupedStmts+ >-< @clauses.hpp+ | End lhs.hpp = if @lhs.fullCyclic+ then vlist @loc.hGroupedStmts -- assume these end up in a let-block or do-block+ else hppStmtBlock @loc.hGroupedStmts++{+hppStmtBlock :: PP a => [[a]] -> PP_Doc+hppStmtBlock = vlist . map ppComp+ where ppComp [] = empty+ ppComp [x] = pp x+ ppComp xs = "let" >#< vlist (map pp xs)+}++SEM Clauses+ | Cons lhs.hpp = if @lhs.fullCyclic+ then @hd.hpp -- only one clause+ else pp_parens (hCatch @hd.hpp ("\\_ -> " >#< @tl.hpp))+ | Nil lhs.hpp = if @lhs.fullCyclic+ then text "undefined" -- never generated when there is only one clause+ else pp_parens (hThrow ("no applicable clause for " ++ show (head @lhs.itf) ++ "." ++ show @lhs.visit))++SEM Clause+ | Clause loc.hChildren = hlist_sp [ hSemNm k v | (k, Just v) <- Map.assocs @lhs.myNextVisits ]+ loc.hChns = hlist_sp [ hParensWithPos @lhs.opts @pos $ hInp visIdent nm+ | (nm,_) <- Map.assocs @lhs.directVisitLocalAttrs ]+ loc.hNext = maybe [] (\nm -> [ hSynFldNmFull nextIdent @loc.itfNm @lhs.visit >#< "= _visNext" ]) @next.mbNextVisit+ loc.hVisLocs = [ hInp visIdent @lhs.visit >#< "=" >#< hParensWithPos @lhs.opts @pos (hOutp visIdent nm)+ | (nm,_) <- Map.assocs @lhs.directVisitLocalAttrs ]+ loc.hRestart = "_visRestart =" >#< hItfVsNm @loc.itfNm @lhs.visit+ >#< pp_parens (hVis @lhs.visit >#< @loc.hChildren >#< @loc.hChns)+ loc.hResVal = pp_parens ( hSynDt @loc.itfNm @lhs.visit+ >#< pp_block "{" "}" "," ( [hSynFldNmFull repIdent @loc.itfNm @lhs.visit >#< "= _visRestart" ] +++ @loc.hNext +++ [ hSynFldNm nm @loc.itfNm @lhs.visit >#< "=" >#<+ hParensWithPos @lhs.opts @pos (hOutp lhsIdent nm)+ | (nm,_) <- Map.assocs @loc.synAttrMap ] ))+ lhs.hpp = if @lhs.fullCyclic+ then "let" >#< (+ vlist (concat @loc.hGroupedStmts)+ >-< vlist @loc.hVisLocs+ >-< @loc.hRestart+ >-< case @next.mbNextVisit of+ Nothing -> @next.hpp -- remaining stmts+ Just _ -> "_visNext" >#< "=" >#< @next.hpp+ )+ >-< "in" >#< @loc.hResVal+ else "do" >#< (+ hppStmtBlock @loc.hGroupedStmts+ >-< if @loc.isDeepest+ then vlist (map ("let" >#<) @loc.hVisLocs)+ >-< "let" >#< ( "!" >|< @loc.hRestart+ >-< case @next.mbNextVisit of+ Nothing -> empty+ Just _ -> "!" >|< "_visNext" >#< "=" >#< @next.hpp+ )+ >-< case @next.mbNextVisit of+ Nothing -> @next.hpp+ Just _ -> empty+ >-< "return" >#< @loc.hResVal+ else @next.hpp -- continue with the deeper clauses+ )++{+hParensWithPos :: PP a => Opts -> Pos -> a -> PP_Doc+hParensWithPos opts pos doc+ = ""+ >-< "("+ >-< indent 2 (hWrapLinePragma opts pos doc)+ >-< " )"+ >-< ""+}++SEM Stmt+ | Eval loc.infoComment = "-- eval stmt:" >#< show (line @loc.pos) >#< ", rank:" >#< @loc.rank+ >#< ", dest: " >#< show @loc.destVisit+ lhs.hpp = hWrapLinePragma @lhs.opts @loc.pos $+ if @loc.isCyclic+ then ppBindPos @lhs.opts @loc.pos @loc.isCyclic @pat.hpp @code.hpp >#< "-- rank:" >#< show @loc.rank+ else if @mode.isMatch+ then ppBindPos @lhs.opts @loc.pos False @pat.hpp (hppWrapRet @code.isFun @code.hpp)+ >#< @loc.infoComment+ else ppBindPos @lhs.opts @loc.pos False ("!" >|< "__fresh") (hppWrapRet @code.isFun @code.hpp)+ >-< "let" >#< pp_parens @pat.hpp >#< "= __fresh" >#< @loc.infoComment+ | Attach loc.infoComment = "-- attach stmt:" >#< show (line @pos) >#< ", rank:" >#< @loc.rank+ lhs.hpp = ppBind @loc.isCyclic (hSemNm @name @loc.visit) @loc.hRhsCode >#< @loc.infoComment+ loc.hRhsCode = if @code.isJust+ then hppWrapRet @code.isFun @code.hpp+ else "return" >#< pp_parens (text $ hDtSemNm @type)+ | Invoke loc.infoComment = "-- invoke stmt:" >#< show (line @pos) >#< ", rank:" >#< @loc.rank+ loc.hBang = if @loc.behaveCyclic then empty else text "!"+ lhs.hpp = (if @loc.isCyclic+ then vlist (concat @loc.hGroupedStmts)+ else hppStmtBlock @loc.hGroupedStmts)+ >-< if @code.isJust+ then ppBind @loc.isCyclic @loc.hPat ("let" >#< @loc.hIter >-< "in" >#< @loc.hRhs) >#< @loc.infoComment+ else ppBind @loc.isCyclic (@loc.hBang >|< @loc.hPat)+ ((\p -> if not @loc.isCyclic && @loc.behaveCyclic then "return" >#< pp_parens p else p) (+ ("let" >#< @loc.hBang >|< pp_parens (hItfVsNm @loc.unqualChildItf @visit+ >#< "!" >|< "__f")+ >#< "=" >#< hSemNm @name @visit+ >-< "in" >#< "__f" >#< @loc.hfInps)))+ >#< @loc.infoComment+ loc.hRhsCode = if @code.isJust+ then @code.hpp+ else "return" >#< pp_parens ("mk" >|< noIterNm @loc.unqualChildItf @visit)+ loc.hIter = "__iter" >#< "!" >|< pp_parens (hItfVsNm @loc.unqualChildItf @visit >#< "!" >|< "__f")+ >#< @loc.hfInps+ >-< indent 2 ( "=" >#< "do" >#< (+ "!" >|< ppBind False (hCoItfVsNm @loc.unqualChildItf @visit >#< "!" >|< "__g") @loc.hRhsCode+ >-< ppBind @loc.behaveCyclic (@loc.hBang >|< "__res@" >|< @loc.hfOuts) ("__f" >#< @loc.hfInps)+ >-< hCatch ("do" >#< (+ @loc.hBang >|< ppBind False @loc.hgOuts ("__g" >#< @loc.hgInps)+ >-< "__iter" >#< "__f" >#< @loc.hfInps+ ))+ (text "const (return __res)")+ ))+ loc.hfInps = pp_parens (hInhDt @loc.unqualChildItf @visit >#< pp_block "{" "}" ","+ [ hInhFldNm nm @loc.unqualChildItf @visit >#< "=" >#<+ hParensWithPos @lhs.opts @pos (hOutp @name nm)+ | (nm,_) <- Map.assocs @loc.inhAttrMap ] )+ loc.hfOuts = pp_parens (hSynDt @loc.unqualChildItf @visit >#< pp_block "{" "}" ","+ ( (hSynFldNmFull repIdent @loc.unqualChildItf @visit >#< "=" >#< "__f") :+ [ hSynFldNm nm @loc.unqualChildItf @visit >#< "=" >#<+ hParensWithPos @lhs.opts @pos (hInp @name nm)+ | (nm,_) <- Map.assocs @loc.synAttrMap ] ))+ loc.hgInps = pp_parens (hCoInhDt @loc.unqualChildItf @visit >#< pp_block "{" "}" ","+ [ hCoInhFldNm nm @loc.unqualChildItf @visit >#< "=" >#<+ hParensWithPos @lhs.opts @pos (hInp @name nm)+ | (nm,_) <- Map.assocs @loc.synAttrMap ] )+ loc.hgOuts = pp_parens (hCoSynDt @loc.unqualChildItf @visit >#< pp_block "{" "}" ","+ [ hCoSynFldNm nm @loc.unqualChildItf @visit >#< "=" >#<+ hParensWithPos @lhs.opts @pos (hOutp @name nm)+ | (nm,_) <- Map.assocs @loc.inhAttrMap ] )+ loc.hRhs = "__iter" >#< hSemNm @name @visit >#< @loc.hfInps+ loc.hPat = pp_parens (+ hSynDt @loc.unqualChildItf @visit >#< pp_block "{" "}" "," (+ ( maybe [] (\nm -> [ hSynFldNmFull nextIdent @loc.unqualChildItf @visit >#< "=" >#< hSemNm @name nm ])+ @loc.mbNextVisit) +++ [ hSynFldNm nm @loc.unqualChildItf @visit >#< "=" >#< hInp @name nm+ | (nm,_) <- Map.assocs @loc.synAttrMap ]+ ))+ | Default loc.infoComment = "-- default stmt:" >#< show (line @pos) >#< ", rank:" >#< @loc.rank+ lhs.hpp = if @loc.isCyclic+ then ppBind True (text $ hDfltNm @name @loc.codeId) @mbCode.hpp >#< @loc.infoComment+ else if @mbCode.isJust+ then ppBindPos @lhs.opts @pos False ("!" >|< "__fresh") (hppWrapRet @mbCode.isFun @mbCode.hpp)+ >-< "let" >#< pp_parens (text $ hDfltNm @name @loc.codeId) >#< "= __fresh" >#< @loc.infoComment+ else empty+ | Rename lhs.hpp = empty++SEM ImplStmt+ | Invoke+ loc.hBang = if @loc.behaveCyclic then empty else text "!"+ lhs.hpp = (if @loc.isCyclic+ then vlist (concat @loc.hGroupedStmts)+ else hppStmtBlock @loc.hGroupedStmts)+ >-< ppBind @loc.isCyclic+ (@loc.hBang >|< @loc.hPat)+ ((\p -> if not @loc.isCyclic && @loc.behaveCyclic then "return" >#< pp_parens p else p) (+ "let" >#< @loc.hBang >|< pp_parens (hItfVsNm @itf @visit >#< "!" >|< "__f")+ >#< "=" >#< hSemNm @child @visit+ >-< "in" >#< "__f" >#< @loc.hfInps))+ >#< "-- implicit invoke: " >#< show @child >|< "." >|< show @visit+ loc.hfInps = pp_parens (hInhDt @itf @visit >#< pp_block "{" "}" ","+ [ hInhFldNm nm @itf @visit >#< "=" >#<+ hParensWithPos @lhs.opts @pos (hOutp @child nm)+ | (nm,_) <- Map.assocs @loc.inhAttrMap ] )+ loc.hPat = pp_parens (+ hSynDt @itf @visit >#< pp_block "{" "}" "," (+ ( maybe [] (\nm -> [ hSynFldNmFull nextIdent @itf @visit >#< "=" >#< hSemNm @child nm ])+ @loc.mbNextVisit) +++ [ hSynFldNm nm @itf @visit >#< "=" >#< hParensWithPos @lhs.opts @pos (hInp @child nm)+ | (nm,_) <- Map.assocs @loc.synAttrMap ]+ ))+ + | DefaultChild+ lhs.hpp = @loc.hPrefix >|< hParensWithPos @lhs.opts @pos (hOutp @child @name)+ >#< "=" >#< pp_parens @loc.hApp >#< "-- default rule for inh: " >#< show @child >|< "." >|< show @name+ | DefaultSyn+ lhs.hpp = @loc.hPrefix >|< hParensWithPos @lhs.opts @pos (hOutp lhsIdent @name)+ >#< "=" >#< pp_parens @loc.hApp >#< "-- default rule for syn: " >#< show lhsIdent >|< "." >|< show @name++ | DefaultChild DefaultSyn+ loc.hApp = @loc.hFun >#< pp_block "[" "]" "," (reverse @loc.hInps)+ loc.hInps = (if @loc.lhsHasAttr then [text $ hInp lhsIdent @name] else []) ++ map (\(c,a) -> text $ hInp c a) @loc.childAttrs+ loc.hFun = case @mbCodeRef of+ Nothing -> text "head"+ Just ref -> hParensWithPos @lhs.opts @pos $ hDfltNm @name ref+ | DefaultVisLocal+ lhs.hpp = @loc.hPrefix >|< hParensWithPos @lhs.opts @pos (hOutp visIdent @name) >#< "="+ >#< hParensWithPos @lhs.opts @pos (hInp visIdent @name)+ >#< "-- default rule for vis-local: " >#< show @name+ + | DefaultChild DefaultSyn DefaultVisLocal+ loc.hPrefix = if @loc.isCyclic then empty else text "let "++{+ppBind :: (PP a, PP b) => Bool -> a -> b -> PP_Doc+ppBind True pat expr = pp_parens (pp pat) >#< "=" >-< indent 2 (pp_parens (pp expr))+ppBind False pat expr = pp_parens (pp pat) >#< "<-" >-< indent 2 (pp_parens (pp expr))++ppBindPos :: (PP a, PP b) => Opts -> Pos -> Bool -> a -> b -> PP_Doc+-- ppBindPos _ _ = ppBind+ppBindPos opts pos True pat expr = hWrapLinePragma opts pos (pp pat) >#< "=" >-< indent 2 (hWrapLinePragma opts pos (pp expr))+ppBindPos opts pos False pat expr = hWrapLinePragma opts pos (pp pat) >#< "<-" >-< indent 2 (hWrapLinePragma opts pos (pp expr))++hppWrapRet :: PP a => Bool -> a -> PP_Doc+hppWrapRet True d = "return" >#< pp_parens (pp d)+hppWrapRet False d = pp d+}++SEM Pat+ | Con lhs.hpp = @loc.hBang >|< hParensWithPos @lhs.opts (identPos @name) (@name >#< hlist_sp @pats.hpps)+ | AttrCon lhs.hpp = @loc.hBang >|< (pp_parens @loc.hpp)+ loc.hFldsPPs = [ hParensWithPos @lhs.opts (identPos @name) (hOutpLoc @name nm) | (nm,_) <- @loc.fields ]+ loc.hBangFldsPPs = map (@loc.hBang >|<) @loc.hFldsPPs+ loc.hpp = case @mbAlias of+ Nothing -> hConNm @dt @con >#< hlist_sp @loc.hFldsPPs+ Just alias -> case alias of+ AliasType_Prod _ -> pp_block "(" ")" "," @loc.hBangFldsPPs+ AliasType_List _ -> if @con == ident "Cons"+ then "(:)" >#< hlist_sp @loc.hBangFldsPPs+ else text "[]"+ AliasType_Maybe _ -> if @con == ident "Nothing"+ then text "Nothing"+ else "Just" >#< hlist_sp @loc.hBangFldsPPs+ | Attr lhs.hpp = @loc.hBang >|< hParensWithPos @lhs.opts (identPos @child) @tp.hpp+ | Tup lhs.hpp = @loc.hBang >|< pp_block "(" ")" "," @pats.hpps+ | List lhs.hpp = @loc.hBang >|< pp_block "[" "]" "," @pats.hpps+ | Cons lhs.hpp = @loc.hBang >|< pp_parens (@hd.hpp >#< ":" >#< pp_parens @tl.hpp)+ | Underscore lhs.hpp = @loc.hBang >|< text "_"+ | * loc.hBang = if @lhs.isCyclic then empty else text "!"++SEM ExprField | Field+ lhs.hopp = (@loc.fieldIndex, pp_parens @code.hpp)++SEM Var | Var+ lhs.hpp = text (show @name)+++SEM AttrTypePat+ | ProdLocal lhs.hpp = text $ hOutpLoc @lhs.child @lhs.name+ | VisLocal Lhs Child Visit+ lhs.hpp = text $ hOutp @lhs.child @lhs.name++SEM AttrTypeCode+ | ProdLocal lhs.hpp = text $ hInpLoc @lhs.child @lhs.name+ | VisLocal Lhs Child Visit+ lhs.hpp = text $ hInp @lhs.child @lhs.name+++ATTR BlocksTop Blocks ItfVisits Items Pats Cons Fields Vars+ [ | | hpps : {[PP_Doc]} ]++SEM BlocksTop+ | Top lhs.hpps = @blocks.hpps ++ (if noDataGen @lhs.opts then [] else @extra.hpps)+ | None lhs.hpps = []++SEM Blocks+ | Cons lhs.hpps = @hd.hpp : @tl.hpps+ | Nil lhs.hpps = []++SEM ItfVisits+ | Cons lhs.hpps = @hd.hpp : @tl.hpps+ | Nil lhs.hpps = []++SEM Cons+ | Cons lhs.hpps = @hd.hpp : @tl.hpps+ | Nil lhs.hpps = []++SEM Fields+ | Cons lhs.hpps = @hd.hpp : @tl.hpps+ | Nil lhs.hpps = []++SEM Items+ | Cons lhs.hpps = @hd.hpp : @tl.hpps+ | Nil lhs.hpps = []++SEM Pats+ | Cons lhs.hpps = @hd.hpp : @tl.hpps+ | Nil lhs.hpps = []++SEM Vars+ | Cons lhs.hpps = @hd.hpp : @tl.hpps+ | Nil lhs.hpps = []+++--+-- Compute spread of stmts+--++ATTR AllFinal [ hSpilledStmts : {[(Int,PP_Doc)]} | | ]+SEM Program | Program blocks.hSpilledStmts = []++SEM SemVisit | Visit Internal+ (loc.hoStmts, clauses.hSpilledStmts) = partition (rankIsLower @clauses.minRank)+ (@lhs.hSpilledStmts ++ @impls.hopps ++ @stmts.hopps)+ loc.hGroupedStmts = groupPairs @loc.hoStmts++SEM SemVisit | End+ loc.hGroupedStmts = groupPairs @lhs.hSpilledStmts++SEM Clause | Clause+ (loc.hoStmts, next.hSpilledStmts) = partition (rankIsLower @next.minRank)+ (@lhs.hSpilledStmts ++ @deflts.hopps ++ @impls.hopps ++ @stmts.hopps)++ loc.hGroupedStmts = groupPairs @loc.hoStmts++SEM Stmt | Invoke loc.hGroupedStmts = groupPairs @deflts.hopps+SEM ImplStmt | Invoke loc.hGroupedStmts = groupPairs @deflts.hopps+++{+rankIsLower :: Int -> (Int, PP_Doc) -> Bool+rankIsLower m (n,_) = n < m+}++--+-- Certain fields need to be ordered+--++ATTR Stmts ImplStmts+ [ | | hopps : {[(Int, PP_Doc)]} ]++SEM ImplStmts+ | Cons lhs.hopps = (@hd.rank, @hd.hpp) : @tl.hopps+ | Nil lhs.hopps = []++SEM Stmts+ | Cons lhs.hopps = (@hd.rank, @hd.hpp) : @tl.hopps+ | Nil lhs.hopps = []++ATTR ExprFields+ [ | | hopps : {[(Int,PP_Doc)]} ]++SEM ExprFields+ | Cons lhs.hopps = @hd.hopp : @tl.hopps+ | Nil lhs.hopps = []++{+sortPairs :: [(Int,a)] -> [a]+sortPairs = map snd . sortBy (\(x,_) (y,_) -> x `compare` y)++groupPairs :: [(Int,a)] -> [[a]]+groupPairs = map (map snd) . groupBy (\(x,_) (y,_) -> x == y) . sortBy (\(x,_) (y,_) -> x `compare` y)+}
+ src/TargetJs.ag view
@@ -0,0 +1,425 @@+-- This file is included by Transform.ag+-- Based on the AST of AstAG.ag+-- Generates code for Javascript++SEM Program | Program+ +pp = if genJs @lhs.opts+ then (@loc.jspp >-<)+ else id++{+jsInp child name+ | show child == "loc" = show child ++ "L" ++ show name+ | show child == "lhs" = show child ++ "I" ++ show name+ | show child == "vis" = show child ++ "I" ++ show name+ | otherwise = show child ++ "S" ++ show name++jsOutp child name+ | show child == "loc" = show child ++ "L" ++ show name+ | show child == "lhs" = show child ++ "S" ++ show name+ | show child == "vis" = show child ++ "S" ++ show name+ | otherwise = show child ++ "I" ++ show name++jsDtSemNm nm = "dnt_" ++ show nm++jsVis nm vis = "vis_" ++ show nm ++ "_" ++ show vis++jsConNm dt nm = show dt ++ "_" ++ show nm+}++SEM Program | Program+ loc.jspp = vlist @blocks.jspps++ATTR Block Itf ItfVisit Data Con Field Type AliasType DataSem MaybeBoundCode BoundCode Code+ Item SemVisit ClausesTop Clauses Clause Stmt Pat ImplStmt Var AttrTypePat AttrTypeCode+ [ | | jspp : {PP_Doc} ]++ATTR ExprField [ | | jsopp : {(Int,PP_Doc)} ]++SEM Block+ | Section lhs.jspp = @code.jspp+ | Itf lhs.jspp = @itf.jspp+ | Data lhs.jspp = @data.jspp+ | Type lhs.jspp = empty+ | Item lhs.jspp = "var mk" >|< show @name >#< "=" >-< indent 2 @item.jspp+ | DataSem lhs.jspp = @sem.jspp++SEM Itf+ | Itf lhs.jspp = vlist @visits.jspps++SEM ItfVisit+ | Visit lhs.jspp = empty+ loc.jsInhNm = "Inh_" >|< jsConNm @loc.itfNm @name+ loc.jsSynNm = "Syn_" >|< jsConNm @loc.itfNm @name+ +jspp = ("function" >#< @loc.jsInhNm >#< "() {}"+ >-< @loc.jsInhNm >|< ".prototype.check = function()"+ >-< indent 2 (pp_braces (+ vlist [ jsTpCheck nm tp | (nm,tp) <- Map.assocs @attrs.gathVisitInhAttrs ]+ ))+ >-< "function" >#< @loc.jsSynNm >#< "() {}"+ >-< @loc.jsSynNm >|< ".prototype.check = function()"+ >-< indent 2 (pp_braces (+ vlist [ jsTpCheck nm tp | (nm,tp) <- Map.assocs @attrs.gathVisitSynAttrs ]+ ))+ ) >-<++{+jsTpCheck nm tp+ = "var _val = this." >|< show nm >|< ";"+ >-< "if (_val === undefined) { throw \"Undefined attribute: " >|< show nm >|< "\"; }"+ >-< if all isSpace tp+ then empty+ else "var _assert =" >#< tp >#< ";"+ >-< "if (!_assert) { throw \"Assert function undefined\"; }"+ >-< "var _outcome = _assert(_val);"+ >-< "if (!_outcome) { throw \"Attribute fails predicate: " >|< show nm >|< "\"; }"+}++SEM Data | Data+ lhs.jspp = "function" >#< show @name >#< "() {}"+ >-< vlist @cons.jspps++SEM Con | Con+ lhs.jspp = "function" >#< jsConNm @lhs.data @name+ >#< pp_block "(" ")" "," @fields.jspps+ >-< pp_braces (+ vlist [ "this." >|< nmPP >#< "=" >#< nmPP >|< ";" | nmPP <- @fields.jspps ]+ >-< vlist @fields.jsChecksPPs+ )+ >-< jsConNm @lhs.data @name >|< ".prototype = new " >#< show @lhs.data >|< "();"+ >-< jsConNm @lhs.data @name >|< ".prototype.constructor =" >#< jsConNm @lhs.data @name >|< ";"++ATTR Fields Field [ | | jsChecksPPs USE {++} {[]} : {[PP_Doc]} ]+ATTR FieldType [ | | jsCheckPP : {Maybe PP_Doc} ]++SEM Field | Field+ lhs.jspp = text $ show @name+ lhs.jsChecksPPs = [ "var _val = " >#< show @name >|< ";"+ >-< "if (_val === undefined) { throw \"Field undefined: " >|< show @name >|< "\";}"+ >-< case @type.jsCheckPP of+ Nothing -> text "_outcome = true;"+ Just p -> p+ >-< "if" >#< pp_parens ("!_outcome")+ >#< pp_braces ("throw \"Field fails predicate: " >|< show @name >|< "\";") ]++SEM FieldType+ | Term lhs.jsCheckPP = if all isSpace @type+ then Nothing+ else Just ("var _assert =" >#< @type >|< ";"+ >-< "if (!_assert) { throw \"assert function undefined\"; }"+ >-< "var _outcome = _assert(_val);")+ | Nonterm lhs.jsCheckPP = case @loc.mbAlias of+ Nothing -> Just ("var _outcome = _val instanceof" >#< show @name >|< ";")+ Just alias -> case alias of+ AliasType_Prod _ -> Just $ text ("var _outcome = _val instanceof Tuple;")+ AliasType_List _ -> Just $ text ("var _outcome = _val instanceof Array;")+ AliasType_Maybe _ -> Just $ text ("var _outcome = _val instanceof Maybe;")++SEM Type | Alias+ lhs.jspp = empty++SEM AliasType+ | Prod lhs.jspp = empty+ | List lhs.jspp = empty+ | Maybe lhs.jspp = empty++SEM DataSem | Sem+ lhs.jspp = "var dnt_" >|< show @tp >#< "="+ >#< pp_parens ( "function ()"+ >-< pp_braces (+ "var" >#< "nt" >|< show @tp >#< "=" >#< @clauses.jspp >|< ";"+ >-< "return" >#< "nt" >|< show @tp >|< ";"+ )) >|< ";"++SEM BoundCode+ | Code lhs.jspp = @code.jspp -- deal with binder etc in parent++SEM MaybeBoundCode+ | Nothing lhs.jspp = empty++SEM Code+ | Code lhs.jspp = vlist @items.jspps++SEM Item+ | Plain lhs.jspp = if all isSpace @txt+ then empty+ else vlist $ modifySpacing @loc.diff @lhs.indent @txt+ | Attr lhs.jspp = addSpaces @loc.diff @tp.jspp+ | Sem CoSem lhs.jspp = addSpaces @loc.diff (pp_parens (+ "function ()"+ >-< pp_braces (+ "var" >#< "nt" >|< show @name >#< "=" >#< @first.jspp >|< ";"+ >-< "return" >#< "nt" >|< show @name >|< ";"+ )+ ))+ | DataSem lhs.jspp = @sem.jspp+ | Detach lhs.jspp = addSpaces @loc.diff empty+ | Brackets lhs.jspp = addSpaces @loc.diff (text "{")+ >-< vlist @items.jspps+ >-< addSpaces @loc.diff2 (text "}")+ | Construct lhs.jspp = addSpaces @loc.diff (pp_parens @loc.jspp)+ loc.jspp = case @mbAlias of+ Nothing -> empty+ Just alias -> case alias of+ AliasType_Prod _ -> empty+ AliasType_List _ -> empty+ AliasType_Maybe _ -> empty++SEM SemVisit+ | Visit lhs.jspp = "function (_inps)" + >-< pp_braces (+ "_inps.check();"+ >-< vlist [ "var" >#< jsInp lhsIdent nm >#< "=" >#< "_inps." >|< show nm >|< ";"+ | (nm,_) <- Map.assocs @loc.inhAttrMap ]+ >-< jsppStmtBlock @loc.jsGroupedStmts+ >-< @clauses.jspp+ )+ | Internal lhs.jspp = jsppStmtBlock @loc.jsGroupedStmts+ >-< @clauses.jspp+ | End lhs.jspp = if @lhs.fullCyclic+ then vlist @loc.jsGroupedStmts+ else jsppStmtBlock @loc.jsGroupedStmts++{+jsppStmtBlock :: PP a => [[a]] -> PP_Doc+jsppStmtBlock = vlist . map ppComp+ where ppComp [] = empty+ ppComp [x] = pp x+ ppComp xs = vlist (map pp xs)+}++SEM Clauses+ | Cons lhs.jspp = if @lhs.fullCyclic+ then @hd.jspp -- only one clause+ else "try" >#< pp_braces (+ @hd.jspp+ ) >-< "catch (err)" >#< pp_braces (+ "if (err == eEval)"+ >-< pp_braces (+ @tl.jspp+ ) >-< "else" >#< pp_braces (+ text "throw err;"+ )+ )+ | Nil lhs.jspp = text "throw eEval;"++SEM Clause+ | Clause lhs.jspp = jsppStmtBlock @loc.jsGroupedStmts+ >-< if @loc.isDeepest+ then "var _outs = new Syn_" >|< jsConNm (head @lhs.itf) @lhs.visit >|< "();"+ >-< case @next.mbNextVisit of+ Just _ -> "_outs._next = " >#< @next.jspp >|< ";"+ Nothing -> @next.jspp+ >-< vlist [ "_outs." >|< show nm >#< "=" >#< jsOutp lhsIdent nm >|< ";"+ | (nm,_) <- Map.assocs @loc.synAttrMap ]+ >-< "return _outs;"+ else @next.jspp++SEM Stmt+ | Eval lhs.jspp = ( if not @mode.isMatch+ then "var _res; try" >#< pp_braces ("_res =" >#< @code.jspp >|< ";")+ >-< "catch(err) { if (err == eEval) { throw eAbort; } else { throw err; } }"+ else "var _res = " >#< @code.jspp+ ) >|< ";" >-< @pat.jspp+ pat.isMatch = @mode.isMatch+ | Attach lhs.jspp = "var _semantics =" >#< @loc.jsRhsCode >|< ";"+ >-< "if (!_semantics) { throw \"Undefined semantics: " >|< show @name >|< "\"; }"+ >-< "var" >#< jsVis @name @visit >#< "= _semantics();"+ >-< "if (!" >|< jsVis @name @visit >|< ") { throw \"Undefined attached semantics: " >|< show @name >|< "\"; }"+ loc.jsRhsCode = if @code.isJust+ then @code.hpp+ else text $ jsDtSemNm @type+ | Invoke lhs.jspp = jsppStmtBlock @loc.jsGroupedStmts+ >-< "var _args = new Inh_" >|< jsConNm @loc.unqualChildItf @visit >|< "();"+ >-< vlist [ "_args." >|< show nm >#< "=" >#< jsOutp @name nm >|< ";"+ | (nm,_) <- Map.assocs @loc.inhAttrMap ]+ >-< "if (!" >|< jsVis @name @visit >|< ") { throw \"uninitialized semantics: ">|< jsVis @name @visit >#< "(expl)\"; }"+ >-< "var _res =" >#< jsVis @name @visit >#< pp_parens (text "_args") >|< ";"+ >-< "_res.check();"+ >-< vlist [ "var" >#< (jsInp @name nm) >#< "=" >#< "_res." >|< show nm >|< ";"+ | (nm,_) <- Map.assocs @loc.synAttrMap ]+ >-< case @loc.mbNextVisit of+ Nothing -> empty+ Just next -> "var" >#< jsVis @name next >#< "= _res._next;"+ + | Default lhs.jspp = if @mbCode.isJust+ then "var _def" >|< show @loc.codeId >#< "=" >#< @mbCode.jspp >|< ";"+ else empty+ | Rename lhs.jspp = empty++SEM ImplStmt+ | Invoke+ lhs.jspp = jsppStmtBlock @loc.jsGroupedStmts+ >-< "var _args = new Inh_" >|< jsConNm @itf @visit >|< "();"+ >-< vlist [ "_args." >|< show nm >#< "=" >#< jsOutp @child nm >|< ";"+ | (nm,_) <- Map.assocs @loc.inhAttrMap ]+ >-< "if (!" >|< jsVis @child @visit >|< ") { throw \"uninitialized semantics: ">|< jsVis @child @visit >#< " (impl)\"; }"+ >-< "var _res =" >#< jsVis @child @visit >#< pp_parens (text "_args") >|< ";"+ >-< "_res.check();"+ >-< vlist [ "var" >#< (jsInp @child nm) >#< "=" >#< "_res." >|< show nm >|< ";"+ | (nm,_) <- Map.assocs @loc.synAttrMap ]+ >-< case @loc.mbNextVisit of+ Nothing -> empty+ Just next -> "var" >#< jsVis @child next >#< "= _res._next;"+ + + + | DefaultChild+ lhs.jspp = "var" >#< hOutp @child @name >#< "=" >#< @loc.jsApp >|< ";"+ | DefaultSyn+ lhs.jspp = "var" >#< hOutp lhsIdent @name >#< "=" >#< @loc.jsApp >|< ";"+ + | DefaultChild DefaultSyn+ loc.jsApp = case @mbCodeRef of+ Nothing -> @loc.jsArr >|< "[0]"+ Just ref -> "_def" >|< show ref >#< pp_parens @loc.jsArr+ loc.jsArr = pp_block "[" "]" "," (reverse @loc.jsInps)+ loc.jsInps = (if @loc.lhsHasAttr then [text $ jsInp lhsIdent @name] else []) ++ map (\(c,a) -> text $ jsInp c a) @loc.childAttrs++ | DefaultVisLocal+ lhs.jspp = empty++ATTR Pat Pats [ isMatch : Bool | | ]++SEM Pat+ | Con lhs.jspp = "if (!(_res instanceof" >#< show @name >|< "))" >#< @loc.jsThrow+ >-< "var _con = _res;"+ >-< vlist [ "var _res = _con[" >|< show i >|< "];"+ >-< jspp+ | (i, jspp) <- zip [0..] @pats.jspps ]+ | AttrCon lhs.jspp = case @mbAlias of+ Nothing -> "if (!(_res instanceof" >#< jsConNm @dt @con >|< "))" >#< @loc.jsThrow+ >-< "var _val = _res;"+ >-< vlist @loc.jsFieldPPs+ Just alias -> case alias of+ AliasType_Prod _ -> "if (!(_res instanceof Tuple))" >#< @loc.jsThrow+ >-< "if (_res.length != " >|< (show $ length @loc.fields) >|< ")" >#< @loc.jsThrow+ >-< "var _val = _res;"+ >-< vlist @loc.jsFieldPPs+ AliasType_List _ -> if @con == ident "Cons"+ then "if (!(_res instanceof Array))" >#< @loc.jsThrow+ >-< "if (_res.length < 1)" >#< @loc.jsThrow+ >-< "var" >#< hOutp @name (ident "hd") >#< "= _res[0];"+ >-< "var" >#< hOutp @name (ident "tl") >#< "= _res.slice(1);"+ else "if (!(_res instanceof Array))" >#< @loc.jsThrow+ >-< "if (_res.length != 0)" >#< @loc.jsThrow+ AliasType_Maybe _ -> if @con == ident "Nothing"+ then "if (!(_res instanceof Maybe_Nothing))" >#< @loc.jsThrow+ else "if (!(_res instanceof Maybe_Just))" >#< @loc.jsThrow+ >-< "var _val = _res;"+ >-< vlist @loc.jsFieldPPs+ loc.jsFieldPPs = [ "var" >#< hOutp @name nm >#< "= _val." >|< show nm >|< ";" | (nm,_) <- @loc.fields ]+ | Attr lhs.jspp = "var" >#< @tp.jspp >#< "=" >#< "_res;"+ | Tup lhs.jspp = "var _tuple = _res;"+ >-< "if (_tuple.length !=" >#< length (@pats.jspps) >|< ")" >#< @loc.jsThrow+ >-< vlist [ "var _res = _tuple[" >|< show i >|< "];"+ >-< jspp+ | (i, jspp) <- zip [0..] @pats.jspps ]+ | List lhs.jspp = "var _arr = _res;"+ >-< "if (_tuple.length !=" >#< length (@pats.jspps) >|< ")" >#< @loc.jsThrow+ >-< vlist [ "var _res = _arr[" >|< show i >|< "];"+ >-< jspp+ | (i, jspp) <- zip [0..] @pats.jspps ]+ | Cons lhs.jspp = "var _arr = _res;"+ >-< "if (_arr.length < 1)" >#< @loc.jsThrow+ >-< "var _res = _arr[0];"+ >-< @hd.jspp+ >-< "var _res = _arr.slice(1);"+ >-< @tl.jspp+ | Underscore lhs.jspp = empty+ + | Tup List Cons Con AttrCon+ loc.jsThrow = if @lhs.isMatch+ then "throw eEval;"+ else "throw eAbort;"++SEM ExprField | Field+ lhs.jsopp = (@loc.fieldIndex, pp_parens @code.jspp)++SEM Var | Var+ lhs.jspp = text (show @name)++SEM AttrTypePat | * lhs.jspp = text $ jsOutp @lhs.child @lhs.name+SEM AttrTypeCode | * lhs.jspp = text $ jsInp @lhs.child @lhs.name++ATTR BlocksTop Blocks ItfVisits Items Pats Cons Fields Vars+ [ | | jspps : {[PP_Doc]} ]++SEM BlocksTop+ | Top lhs.jspps = @blocks.jspps+ | None lhs.jspps = []++SEM Blocks+ | Cons lhs.jspps = @hd.jspp : @tl.jspps+ | Nil lhs.jspps = []++SEM ItfVisits+ | Cons lhs.jspps = @hd.jspp : @tl.jspps+ | Nil lhs.jspps = []++SEM Cons+ | Cons lhs.jspps = @hd.jspp : @tl.jspps+ | Nil lhs.jspps = []++SEM Fields+ | Cons lhs.jspps = @hd.jspp : @tl.jspps+ | Nil lhs.jspps = []++SEM Items+ | Cons lhs.jspps = @hd.jspp : @tl.jspps+ | Nil lhs.jspps = []++SEM Pats+ | Cons lhs.jspps = @hd.jspp : @tl.jspps+ | Nil lhs.jspps = []++SEM Vars+ | Cons lhs.jspps = @hd.jspp : @tl.jspps+ | Nil lhs.jspps = []+++--+-- Compute spread of stmts+--++ATTR AllFinal [ jsSpilledStmts : {[(Int,PP_Doc)]} | | ]+SEM Program | Program blocks.jsSpilledStmts = []++SEM SemVisit | Visit Internal+ (loc.jsoStmts, clauses.jsSpilledStmts) = partition (rankIsLower @clauses.minRank)+ (@lhs.jsSpilledStmts ++ @impls.jsopps ++ @stmts.jsopps)+ loc.jsGroupedStmts = groupPairs @loc.jsoStmts++SEM SemVisit | End+ loc.jsGroupedStmts = groupPairs @lhs.jsSpilledStmts++SEM Clause | Clause+ (loc.jsoStmts, next.jsSpilledStmts) = partition (rankIsLower @next.minRank)+ (@lhs.jsSpilledStmts ++ @deflts.jsopps ++ @impls.jsopps ++ @stmts.jsopps)++ loc.jsGroupedStmts = groupPairs @loc.jsoStmts++SEM Stmt | Invoke loc.jsGroupedStmts = groupPairs @deflts.jsopps+SEM ImplStmt | Invoke loc.jsGroupedStmts = groupPairs @deflts.jsopps++--+-- Certain fields need to be ordered+--++ATTR Stmts ImplStmts+ [ | | jsopps : {[(Int, PP_Doc)]} ]++SEM ImplStmts+ | Cons lhs.jsopps = (@hd.rank, @hd.jspp) : @tl.jsopps+ | Nil lhs.jsopps = []++SEM Stmts+ | Cons lhs.jsopps = (@hd.rank, @hd.jspp) : @tl.jsopps+ | Nil lhs.jsopps = []++ATTR ExprFields+ [ | | jsopps : {[(Int,PP_Doc)]} ]++SEM ExprFields+ | Cons lhs.jsopps = @hd.jsopp : @tl.jsopps+ | Nil lhs.jsopps = []
+ src/Transform.ag view
@@ -0,0 +1,2670 @@+MODULE {Transform} {transform} {}++PRAGMA genlinepragmas++INCLUDE "AstAG.ag"++imports+{+import Common+import Ast+import Errs+import Data.Sequence(Seq)+import qualified Data.Sequence as Seq+import Data.Map(Map)+import qualified Data.Map as Map+import Data.IntMap(IntMap)+import qualified Data.IntMap as IntMap+import Data.Set(Set)+import qualified Data.Set as Set+import Env+import Data.Monoid+import Data.List(nub, isPrefixOf, intersect, sortBy, partition, groupBy, sort)+import Pretty+import UU.Scanner.Position+import Opts+import Data.Maybe+import Data.Char+import Data.Graph+import Data.Foldable(toList)+import DepAnalysis+import Debug.Trace(trace)+}+++WRAPPER Program++{+transform :: Pos -> Opts -> Program -> (Errs, String, String, String)+transform pos opts prog+ = (errs, txtPretty, txtTarget, txtGraph)+ where+ inh = Inh_Program { opts_Inh_Program = opts, pos_Inh_Program = pos }+ syn = wrap_Program sem inh+ sem = sem_Program prog+ errs = firstErrs [ errs0_Syn_Program syn+ , errs1_Syn_Program syn+ , errs2_Syn_Program syn+ , errs3_Syn_Program syn+ , errs4_Syn_Program syn+ , errs5_Syn_Program syn ]+ + resPretty = pretty_Syn_Program syn+ txtPretty = disp resPretty 999999 ""+ resTarget = pp_Syn_Program syn+ txtTarget = disp resTarget 999999 ""+ resGraph = graph_Syn_Program syn+ txtGraph = disp resGraph 999999 ""++firstErrs :: [Errs] -> Errs+firstErrs [] = Seq.empty+firstErrs (x:xs) = if Seq.null x then firstErrs xs else x+}+++--+-- Transformations for various backends+--++ATTR Program [ | | pp, pretty, graph : {PP_Doc} ]+SEM Program | Program+ lhs.pp = empty -- add output for additional backends+ lhs.pretty = @loc.ppId+ lhs.graph = @loc.ppGraph++INCLUDE "TargetHaskell.ag"+INCLUDE "TargetJs.ag"+INCLUDE "TargetGraph.ag"+++ATTR Program AllFinal AllDataFields Itf ItfVisits ItfVisit Attrs Attr Type [ opts : Opts | | ]+ATTR Program [ pos : Pos | | ]+++--+-- Collect errors+--++-- errs0: data-type/itf based checks+-- errs1: rudamentary checks+-- errs2: child checks+-- errs3: attribute checks+-- errs4: cycle checks++SET AllDataFields = Data Cons Con Fields Field FieldType+SET AllCode = AllCodeWithoutAttrs AttrTypePat AttrTypeCode+SET AllCodeWithoutAttrs = Code Items Item DataSem AllVisitClauses Stmts Stmt+ MaybeBoundCode BoundCode Pats Pat ExprFields ExprField+ SemCons SemCon SemFields SemField+SET AllCodeBlocksWithoutAttrs = BlocksTop Blocks Block AllCodeWithoutAttrs+SET AllCodeBlocks = BlocksTop Blocks Block AllCode+SET AllVisitClauses = SemVisit ClausesTop Clauses Clause+SET AllFinal = AllCodeBlocks ImplStmts ImplStmt+SET AllVisFinal = AllVisitClauses ImplStmts ImplStmt Stmts Stmt Pats Pat AttrTypePat AttrTypeCode++ATTR Program AllCodeBlocks Data Type Cons Con Itf ItfVisits ItfVisit+ [ | | errs0,errs1,errs2,errs3,errs4,errs5 USE {Seq.><} {Seq.empty} : Errs ]+ATTR ImplStmts ImplStmt [ | | errs2,errs3,errs4,errs5 USE {Seq.><} {Seq.empty} : Errs ]++SEM Program+ | Program +errs0 = addDefErrs @blocks.gathItfs+ +errs0 = addDefErrs @blocks.gathVisits+ +errs0 = addDefErrs @blocks.gathInhs+ +errs0 = addDefErrs @blocks.gathSyns+ +errs1 = addDefErrs @blocks.gathNonterms+ +errs1 = addDefErrs @blocks.gathClauses+ +errs1 = addUseErrs @blocks.distItfs+ +errs1 = addUseErrs @blocks.distVisits+ +errs1 = addUseErrs @blocks.distChildDefs+ +errs0 = addDefErrs @blocks.gathDataCons+ +errs0 = addUseErrs @blocks.distDataCons+ +errs0 = addDefErrs' @blocks.gathDatas+ +errs0 = addUseErrs' @blocks.distDatas+ -- +errs0 = addDefErrs' @blocks.gathDataSems -- duplicate datasems allowed+ +errs1 = addUseErrs' @blocks.distDataSems+ +errs3 = addDefErrs'' @blocks.gathDefs+ +errs3 = addUseErrs'' @blocks.distDefs++{+addDefErrs :: Env QIdent v -> Errs -> Errs+addDefErrs env es+ = Seq.fromList (map (Err_Dup . map head) ds) Seq.>< es+ where ds = map (map fst) (dups env)++addUseErrs :: Env QIdent v -> Errs -> Errs+addUseErrs env es+ = Seq.fromList (map (Err_Missing . map head) ms) Seq.>< es+ where ms = missing env++addDefErrs' :: Env Ident v -> Errs -> Errs+addDefErrs' env es+ = Seq.fromList (map Err_Dup ds) Seq.>< es+ where ds = map (map fst) (dups env)++addUseErrs' :: Env Ident v -> Errs -> Errs+addUseErrs' env es+ = Seq.fromList (map Err_Missing ms) Seq.>< es+ where ms = missing env++addDefUseErrs' :: Env Ident v -> Errs -> Errs+addDefUseErrs' env = addDefErrs' env . addUseErrs' env++addDefErrs'' :: Env (Ident,Ident,Bool) v -> Errs -> Errs+addDefErrs'' env es+ = Seq.fromList (map mkDupErr ds) Seq.>< es+ where ds = map (map fst) (dups env)+ mkDupErr ((c,n,b):_) = Err_DupAttr b c n++addUseErrs'' :: Env (Ident,Ident,Bool) v -> Errs -> Errs+addUseErrs'' env es+ = Seq.fromList (map mkMissErr ms) Seq.>< es+ where ms = missing env+ mkMissErr ((c,n,b):_) = Err_MissingAttr b c n++addDefUseErrs'' :: Env (Ident,Ident,Bool) v -> Errs -> Errs+addDefUseErrs'' env = addDefErrs'' env . addUseErrs'' env+}++--+-- Standard duplication checks+--+++{+type ItfEnv = Env QIdent ()+}++ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | gathItfs : ItfEnv | ]++SEM Program | Program blocks.gathItfs = emptyEnv++SEM Itf | Itf +gathItfs = extend [@name] ()+SEM ItfVisit | Visit +gathItfs = extend @loc.coItf ()++ATTR ItfVisits ItfVisit Attrs Attr [ itf : {QIdent} | | ]+SEM Itf | Itf visits.itf = [@name]++{+type VisitEnv = Env QIdent ()+}++ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | gathVisits : VisitEnv | ]++SEM Program | Program blocks.gathVisits = emptyEnv++SEM ItfVisit | Visit+ +gathVisits = extend (@name : @lhs.itf) ()+ +gathVisits = extend (@name : @loc.coItf) ()+++ATTR Attrs Attr [ visit : {QIdent} coItf : {QIdent} | | ]+SEM ItfVisit | Visit+ attrs.visit = @name : @lhs.itf+ loc.coItf = [mkCoIdent (head @lhs.itf) @name]++{+mkCoIdent :: Ident -> Ident -> Ident+mkCoIdent itf vis = Ident ("Co_" ++ show itf ++ "_" ++ show vis) (identPos itf)+}++{+type AttrEnv = Env QIdent String+}++ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit Attrs Attr [ | gathInhs, gathSyns : AttrEnv | ]++SEM Program+ | Program blocks.gathInhs = emptyEnv+ blocks.gathSyns = emptyEnv++SEM Attr+ | Inh +gathInhs = extend (@name : @lhs.itf) @type+ +gathSyns = extend (@name : @lhs.coItf) @type+ | Syn +gathSyns = extend (@name : @lhs.itf) @type+ +gathInhs = extend (@name : @lhs.coItf) @type++ATTR VisitAttrs VisitAttr [ | gathChns : AttrEnv | ]++SEM SemVisit+ | Visit attrs.gathChns = emptyEnv+ +errs0 = addDefErrs @attrs.gathChns++SEM VisitAttr | Chn +gathChns = extend [@name] @type++{+type NontermEnv = Env QIdent ()+type ClausesEnv = Env QIdent ()+type DataSemEnv = Env Ident ()+}++ATTR AllCodeBlocks [ | gathNonterms : NontermEnv gathClauses : ClausesEnv | ]+ATTR AllCode ImplStmts ImplStmt [ nonterm : {QIdent} | | ]+ATTR ImplStmts ImplStmt [ gathNonterms : NontermEnv gathClauses : ClausesEnv | | ]++SEM Block | Section code.nonterm = [ident "<root>"]+ | Item item.nonterm = [ident "<root>"]+ | DataSem sem.nonterm = [ident "<root>"]++SEM DataSem | Sem clauses.nonterm = [@tp]++SEM Item | Sem CoSem+ first.nonterm = [@name]++SEM Program+ | Program blocks.gathNonterms = emptyEnv+ blocks.gathClauses = emptyEnv++SEM Item+ | Sem CoSem +gathNonterms = extend [@name] ()++SEM Clause+ | Clause +gathClauses = extend (@name : @lhs.nonterm) ()++ATTR ClausesTop Clauses Clause [ | | gathClauseNames USE {`Set.union`} {Set.empty} : {Set Ident} ]+SEM Clause | Clause lhs.gathClauseNames = Set.singleton @name++ATTR AllCodeBlocks [ | gathDataSems : DataSemEnv | ]+ATTR AllCodeBlocks [ | distDataSems : DataSemEnv | ]+ATTR ImplStmts ImplStmt [ distDataSems : DataEnv | | ]++SEM Program | Program+ blocks.gathDataSems = emptyEnv+ blocks.distDataSems = @blocks.gathDataSems++SEM DataSem | Sem+ +gathDataSems = extend @tp ()++ATTR AllCodeBlocks ImplStmts ImplStmt [ allVisits : {Set Ident} | | ]++SEM Program | Program+ blocks.allVisits = Set.empty++SEM Item | Sem CoSem+ first.allVisits = Set.union (Set.fromList @loc.nextVisits) @lhs.allVisits++SEM DataSem | Sem+ clauses.allVisits = Set.union (Set.fromList @loc.nextVisits) @lhs.allVisits++SEM Stmt | Attach -- check that visits and children have distinct names+ +errs1 = ( if @name `Set.member` @lhs.allVisits+ then Seq.singleton $ Err_NameClash @name+ else Seq.empty+ ) Seq.><++ATTR Cons Con Fields Field ExprFields ExprField [ data : Ident | | ]+ATTR Fields Field ExprFields ExprField [ con : Ident | | ]+SEM Data | Data cons.data = @name+SEM Con | Con fields.con = @name+SEM Item | Construct fields.data = @data+SEM Item | Construct fields.con = @con++{+type DataEnv = Env Ident ()+type ConEnv = Env QIdent FieldEnv+type FieldEnv = Env Ident (Int,Either Ident String)+}++ATTR BlocksTop Blocks Block Data Cons Con Type [ | gathDataCons : ConEnv | ]+ATTR AllCodeBlocks [ | distDataCons : ConEnv | ]+ATTR ImplStmts ImplStmt [ distDataCons : ConEnv | | ]++SEM Program | Program+ blocks.gathDataCons = emptyEnv+ blocks.distDataCons = @blocks.gathDataCons++SEM Con | Con+ +gathDataCons = extend [@name, @lhs.data] @fields.gathFields++ATTR BlocksTop Blocks Block Data Type [ | gathDatas : DataEnv | ]+SEM Program | Program blocks.gathDatas = emptyEnv+SEM Data | Data +gathDatas = extend @name ()++ATTR Fields Field [ | gathFields : FieldEnv | ]+SEM Con | Con+ fields.gathFields = emptyEnv+ +errs0 = addDefErrs' @fields.gathFields++SEM Field | Field+ +gathFields = extend @name (@lhs.nr, @type.fldType)++ATTR Cons Con Fields Field [ | nr : Int | ]+SEM Data | Data cons.nr = 0+SEM Con | Con fields.nr = 1 + @lhs.nr+SEM Field | Field lhs.nr = 1 + @lhs.nr++ATTR FieldType [ | | fldType : {Either Ident String} ]+SEM FieldType+ | Term lhs.fldType = Right @type+ | Nonterm lhs.fldType = Left @name++ATTR ExprFields ExprField [ fieldOrder : {Map Ident Int} | gathFields : FieldEnv | ]+SEM Item | Construct+ fields.gathFields = emptyEnv+ loc.gathFieldEnv = foldr (\(nm,_) -> snd . find nm (0,Right "")) @fields.gathFields @loc.fields+ +errs0 = addDefErrs' @loc.gathFieldEnv+ +errs0 = addUseErrs' @loc.gathFieldEnv+ fields.fieldOrder = Map.fromList (zip (map fst @loc.fields) [1..])++SEM ExprField | Field+ +gathFields = extend @name (0,Right "")+ loc.fieldIndex = Map.findWithDefault 0 @name @lhs.fieldOrder++{+type VarsEnv = Env Ident ()+}++ATTR Vars Var Cons Con ItfVisits ItfVisit [ | gathVarsEnv : VarsEnv | ]+SEM Var | Var+ +gathVarsEnv = extend @name ()++SEM Type | Alias+ vars.gathVarsEnv = emptyEnv+ +errs1 = addDefErrs' @vars.gathVarsEnv++SEM Data | Data+ vars.gathVarsEnv = emptyEnv+ +errs1 = addDefErrs' @cons.gathVarsEnv++SEM Cons | Cons+ (hd.gathVarsEnv, tl.gathVarsEnv) = split @lhs.gathVarsEnv+ (lhs.gathVarsEnv, loc.locGathVarsEnv) = merge @hd.gathVarsEnv @tl.gathVarsEnv+ +errs1 = addDefErrs' @loc.locGathVarsEnv++SEM Itf | Itf+ vars.gathVarsEnv = emptyEnv+ +errs1 = addDefErrs' @visits.gathVarsEnv++SEM ItfVisits | Cons+ (hd.gathVarsEnv, tl.gathVarsEnv) = split @lhs.gathVarsEnv+ (lhs.gathVarsEnv, loc.locGathVarsEnv) = merge @hd.gathVarsEnv @tl.gathVarsEnv+ +errs1 = addDefErrs' @loc.locGathVarsEnv++SEM Item | Sem CoSem+ vars.gathVarsEnv = emptyEnv+ +errs1 = addDefErrs' @vars.gathVarsEnv++SEM DataSem | Sem+ vars.gathVarsEnv = emptyEnv+ +errs1 = addDefErrs' @vars.gathVarsEnv++--+-- Standard usage checks+--++ATTR AllCodeBlocks [ | distItfs : ItfEnv | ]+ATTR ImplStmts ImplStmt [ distItfs : ItfEnv | | ]++SEM Program+ | Program blocks.distItfs = @blocks.gathItfs++SEM Item | Sem CoSem+ +distItfs = snd . find [@tp] ()++SEM Stmt | Attach+ +distItfs = snd . find [@type] ()++SEM DataSem | Sem+ +distItfs = snd . find [@tp] ()++ATTR AllCode Pats Pat AttrTypePat AttrTypeCode ImplStmts ImplStmt [ itf : QIdent coItf : Ident | | ]+SEM Block | Section Item DataSem+ loc.itf = [ident "<root>"]+ loc.coItf = ident "<root>"++SEM DataSem | Sem+ clauses.itf = [@tp]++SEM Item+ | Sem first.itf = [@tp]+ | CoSem first.itf = [@loc.coItf]+ loc.coItf = mkCoIdent @tp @visit+ first.coItf = @tp++ATTR AllCodeBlocks [ | distVisits : VisitEnv | ]+ATTR ImplStmts ImplStmt [ distVisits : VisitEnv | | ]++SEM Program+ | Program blocks.distVisits = @blocks.gathVisits++SEM SemVisit | Visit+ +distVisits = snd . find (@name : @lhs.itf) ()++SEM Stmt+ | Invoke loc.unqualChildItf = head @loc.childItf+ loc.childVisits = Map.findWithDefault [] @loc.unqualChildItf @lhs.distVisitOrder+ +errs1 = ( if null @loc.childVisits || @visit `elem` @loc.childVisits+ then Seq.empty else Seq.singleton (Err_UndefVisit @name @visit @loc.childVisits)) Seq.><+ | Attach loc.childVisits = Map.findWithDefault [] @type @lhs.distVisitOrder+ loc.visit = case @mbVisit of+ Nothing -> if null @loc.childVisits then Ident "<unknown>" @pos else head @loc.childVisits+ Just v -> v+ +errs1 = ( if null @loc.childVisits || @loc.visit `elem` @loc.childVisits+ then Seq.empty else Seq.singleton (Err_UndefVisit @name @loc.visit @loc.childVisits)) Seq.><++SEM ImplStmt+ | Invoke loc.childVisits = Map.findWithDefault [] @itf @lhs.distVisitOrder++SEM Pat | AttrCon+ (loc.fieldEnv, lhs.distDataCons) = find [@con, @dt] emptyEnv @lhs.distDataCons+ loc.fields = sortAssocs $ assocs @loc.fieldEnv++{+sortAssocs :: [(Ident, (Int, a))] -> [(Ident, a)]+sortAssocs = map (\(nm,(_,tp)) -> (nm,tp)) . sortBy (\(_,(n1,_)) (_,(n2,_)) -> compare n1 n2)+}++SEM Item | Construct+ (loc.fieldEnv, lhs.distDataCons) = find [@con, @data] emptyEnv @lhs.distDataCons+ loc.fields = sortAssocs $ assocs @loc.fieldEnv++SEM Stmt | Attach+ +distDataSems = if @code.isJust+ then id+ else snd . find @type ()++ATTR AllCodeBlocks Type AliasType AllDataFields [ | distDatas : DataEnv | ]+ATTR ImplStmts ImplStmt [ distDatas : DataEnv | | ] -- should perhaps turn into a changed attr++SEM Program | Program+ blocks.distDatas = @blocks.gathDatas++SEM DataSem | Sem+ +distDatas = snd . find @tp ()+ + +errs2 = if Map.member astIdent $ Map.findWithDefault Map.empty @loc.firstVisit+ $ Map.findWithDefault Map.empty @tp @lhs.distVisitInhAttrs+ then id+ else (Seq.singleton (Err_Missing [replPos @pos astIdent]) Seq.><)++SEM AliasType+ | Prod +distDatas = \env -> foldr (\tp -> snd . find tp ()) env @fields+ | List +distDatas = snd . find @type ()+ | Maybe +distDatas = snd . find @type ()++SEM FieldType | Nonterm +distDatas = snd . find @name ()+SEM Item | Construct +distDatas = snd . find @data ()+SEM Pat | AttrCon +distDatas = snd . find @dt ()++{+astIdent :: Ident+astIdent = Ident "ast" noPos+}++--+-- Children defined+--++ATTR AllCodeBlocksWithoutAttrs [ | gathChildDefs : {Env QIdent (QIdent, QIdent)} | ]+ATTR AllCodeBlocks [ | distChildDefs : {Env QIdent (QIdent,QIdent)} | ]+ATTR ImplStmts ImplStmt [ gathChildDefs, distChildDefs : {Env QIdent (QIdent,QIdent)} | | ] -- inherit only++SEM Program | Program blocks.gathChildDefs = emptyEnv+ blocks.distChildDefs = @blocks.gathChildDefs++SEM Item+ | Sem CoSem+ loc.firstVisit = if null @loc.nextVisits then unknIdent else head @loc.nextVisits+ first.gathChildDefs = extend locQIdent (locQIdent, locQIdent)+ $ extend visQIdent (visQIdent, visQIdent)+ $ extend lhsQIdent ([@tp], [@loc.firstVisit, @tp])+ $ enter @lhs.gathChildDefs+ (lhs.gathChildDefs, loc.localChildDefs) = leave @first.gathChildDefs+ -- don't addDefErrs on @loc.localChildDefs++ first.distChildDefs = enterWith @loc.localChildDefs @lhs.distChildDefs+ (lhs.distChildDefs, loc.localChildDefs') = leave @first.distChildDefs+ + +errs1 = addUseErrs @loc.localChildDefs'+ | Attr ((loc.childItf, loc.startVisit), lhs.distChildDefs) = find [@child] (unknQIdent,unknQIdent) @lhs.distChildDefs+ | Detach ((loc.childItf, loc.startVisit), lhs.distChildDefs) = find [@name] (unknQIdent,unknQIdent) @lhs.distChildDefs++SEM DataSem | Sem+ clauses.gathChildDefs = extend locQIdent (locQIdent, locQIdent)+ $ extend visQIdent (visQIdent, visQIdent)+ $ extend lhsQIdent ([@tp], [@loc.firstVisit, @tp])+ $ enter @lhs.gathChildDefs+ (lhs.gathChildDefs, loc.localChildDefs) = leave @clauses.gathChildDefs+ -- don't addDefErrs on @loc.localChildDefs++ clauses.distChildDefs = enterWith @loc.localChildDefs @lhs.distChildDefs+ (lhs.distChildDefs, loc.localChildDefs') = leave @clauses.distChildDefs+ + +errs1 = addUseErrs @loc.localChildDefs'++SEM Clauses+ | Cons (hd.gathChildDefs, tl.gathChildDefs) = split @lhs.gathChildDefs+ (lhs.gathChildDefs, loc.gathLChildDefs) = merge @hd.gathChildDefs @tl.gathChildDefs+ + (hd.distChildDefs, tl.distChildDefs) = splitWith @loc.gathLChildDefs @lhs.distChildDefs+ (lhs.distChildDefs, loc.distLChildDefs) = merge @hd.distChildDefs @tl.distChildDefs++ +errs1 = addUseErrs @loc.distLChildDefs++SEM Stmt+ | Attach +gathChildDefs = extend [@name] ([@type],[@loc.visit,@type])+ loc.allAttaches = findAll [@name] @lhs.distChildDefs+ loc.initType = head $ last ([@type] : map fst @loc.allAttaches)+ +errs1 = if @type /= @loc.initType+ then (Err_TypeConflict @type @loc.initType Seq.<|)+ else id+ | Invoke ((loc.childItf, loc.startVisit), code.distChildDefs) = find [@name] (unknQIdent,unknQIdent) @lhs.distChildDefs++SEM Pat+ | Attr ((loc.childItf, loc.startVisit), lhs.distChildDefs) = find [@child] (unknQIdent,unknQIdent) @lhs.distChildDefs+ | AttrCon +gathChildDefs = extendTail [@name] (locQIdent,locQIdent)+ ((loc.childItf, loc.startVisit), lhs.distChildDefs) = find [@name] (unknQIdent,unknQIdent) @lhs.distChildDefs++{+unknIdent :: Ident+unknIdent = ident "<undefined>"++unknQIdent :: QIdent+unknQIdent = [unknIdent]++locQIdent :: QIdent+locQIdent = [locIdent]++lhsQIdent :: QIdent+lhsQIdent = [lhsIdent]++visQIdent :: QIdent+visQIdent = [visIdent]+}+++--+-- Compute renames for each clause/visit+--+-- unchecked: source name must be in interface of child+-- unchecked: duplicate renames+-- unchecked: new name not in interface of child+--++{+type RenameMap = Map Ident (Map Ident Ident)+}++ATTR Stmts Stmt [ | | gathRenames USE {`unionWithUnion`} {mempty} : RenameMap ]+SEM Stmt | Rename+ lhs.gathRenames = Map.singleton @child @subst.gathRenames++ATTR Renames Rename [ | | gathRenames USE {`mappend`} {mempty} : {Map Ident Ident} ]+SEM Rename | Rename+ lhs.gathRenames = Map.fromList [ (@source, @dest), (@dest, @source) ]++ATTR AllFinal [ distRenames : RenameMap | | ]++SEM Program | Program blocks.distRenames = Map.empty+SEM DataSem | Sem clauses.distRenames = Map.empty+SEM Item | Sem CoSem first.distRenames = Map.empty++SEM Clause | Clause loc.distRenames = @stmts.gathRenames `unionWithUnion` @lhs.distRenames+SEM SemVisit | Visit loc.distRenames = @stmts.gathRenames `unionWithUnion` @lhs.distRenames+SEM SemVisit | Internal loc.distRenames = @stmts.gathRenames `unionWithUnion` @lhs.distRenames++{+renameAttr :: RenameMap -> Ident -> Ident -> Ident+renameAttr mp child nm = Map.findWithDefault nm nm $ Map.findWithDefault Map.empty child mp+renameAttrFwd = renameAttr+renameAttrBwd = renameAttr+}++SEM Item | Attr loc.origName = renameAttrBwd @lhs.distRenames @child @name+SEM Pat | Attr loc.origName = renameAttrBwd @lhs.distRenames @child @name+++--+-- Add and check additional instructions (children, etc.) for clauses+--++ATTR SemVisit ClausesTop Clauses Clause [ clauseExtras : {Map Ident Stmts} | | ]++SEM Clause | Clause next.clauseExtras = Map.empty+SEM Item | Sem CoSem first.clauseExtras = Map.empty++SEM DataSem | Sem+ clauses.clauseExtras = @cons.clauseExtras++ loc.consMap = Map.findWithDefault Map.empty @tp @lhs.distDataMap++ inst.cons : SemCons+ inst.cons = [ SemCon_Con @pos (replPos @pos c)+ [ SemField_Field @pos (replPos @pos nm) tp | (nm,tp) <- sortAssocs $ Map.assocs fs ]+ | (c,fs) <- sortAssocs $ Map.assocs @loc.consMap ]++ cons.itf = [@tp]++{+trim :: String -> String+trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace+} -- (Ident (trim (either show id tp)) @pos++ATTR SemCons SemCon [ | | clauseExtras USE {`Map.union`} {Map.empty} : {Map Ident Stmts} ]+ATTR SemFields SemField [ | | clauseExtras USE {++} {[]} : Stmts ]++SEM SemCon | Con+ lhs.clauseExtras = Map.singleton @name+ ( Stmt_Eval Mode_Match (Pat_AttrCon @name (replPos @pos locIdent) (head @lhs.itf))+ (BoundCode_Code Bind_Fun @pos $ Code_Code+ [Item_Attr @pos (replPos @pos lhsIdent) (replPos @pos astIdent) ])+ : @fields.clauseExtras )++SEM SemField | Field+ loc.isNonterm = case @type of+ Left nt -> Map.member nt @lhs.distDataMap+ Right _ -> False+ +distDataSems = case @type of+ Left nt | @loc.isNonterm -> snd . find nt ()+ _ -> id+ lhs.clauseExtras = case @type of+ Left nt | @loc.isNonterm ->+ [ Stmt_Attach @pos Nothing @name nt Nothing+ , Stmt_Eval Mode_Assert (Pat_Attr @name (replPos @pos astIdent))+ (BoundCode_Code Bind_Fun @pos (Code_Code [+ Item_Attr @pos (replPos @pos locIdent) @name ]))+ ]+ _ -> []++--+-- Check clauses defined when having this extraMap+--++SEM ClausesTop | Top+ +errs0 = if Map.null @lhs.clauseExtras+ then id+ else let reqKeys = Map.keysSet @lhs.clauseExtras+ impKeys = @clauses.gathClauseNames+ diffSet = (impKeys `Set.difference` reqKeys) `Set.union` (reqKeys `Set.difference` impKeys)+ diff = Set.elems diffSet+ errs = map (\nm -> Err_MissingClause (head @lhs.itf) nm) diff+ in (Seq.fromList errs Seq.><)++-- NOTE: This *must* be before inst.impls, otherwise the copy rule for available attributes goes wrong+SEM Clause | Clause+ inst.stmts : T_Stmts+ inst.stmts = \stmts -> foldr (\s r -> sem_Stmts_Cons (sem_Stmt s) r) stmts @loc.extraStmts ++ loc.extraStmts = Map.findWithDefault [] @name @lhs.clauseExtras++--+-- Count visits+--++ATTR AllVisitClauses [ visitNr : Int | | ]+SEM Item | Sem CoSem first.visitNr = 1+SEM DataSem | Sem clauses.visitNr = 1++SEM SemVisit | Visit loc.visitNr = @lhs.visitNr + 1++--+-- Visit order+--++ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | | gathVisitOrder USE {`mappend`} {mempty} : {Map Ident [Ident]} ]+ATTR ItfVisits ItfVisit [ | | gathVisitsOrder USE {++} {[]} : {[Ident]} ]++SEM Itf | Itf +gathVisitOrder = Map.insert @name @visits.gathVisitsOrder+SEM ItfVisit | Visit lhs.gathVisitsOrder = [@name]+ lhs.gathVisitOrder = Map.singleton (head @loc.coItf) [@name]++ATTR AllCodeBlocks ImplStmts ImplStmt [ distVisitOrder : {Map Ident [Ident]} doneVisits : {[Ident]} | | ]+ATTR SemVisit ClausesTop Clauses Clause [ nextVisits : {[Ident]} | | ]++SEM Program | Program blocks.distVisitOrder = @blocks.gathVisitOrder+SEM Item | Sem loc.nextVisits = Map.findWithDefault [] @tp @lhs.distVisitOrder+ | CoSem loc.nextVisits = Map.findWithDefault [] @loc.coItf @lhs.distVisitOrder+ | Detach loc.visitOrder = Map.findWithDefault [] @loc.unqualChildItf @lhs.distVisitOrder++SEM AttrTypePat | Child loc.visitOrder = Map.findWithDefault [] @lhs.childItf @lhs.distVisitOrder+SEM AttrTypeCode | Child loc.visitOrder = Map.findWithDefault [] @lhs.childItf @lhs.distVisitOrder++SEM DataSem | Sem loc.visits = Map.findWithDefault [] @tp @lhs.distVisitOrder+ loc.nextVisits = @loc.visits+ loc.firstVisit = case @loc.visits of+ [] -> Ident "unknown" @pos+ (x:_) -> x++SEM Program | Program blocks.doneVisits = []+SEM Item | Sem loc.doneVisits = []+ | CoSem loc.doneVisits = []+SEM DataSem | Sem loc.doneVisits = []++SEM SemVisit | Visit loc.doneVisits = @name : @lhs.doneVisits -- visits of the interface done++-- Insert empty visits to match the visits actually in the AST+SEM SemVisit+ | Visit loc.unqualItf = head @lhs.itf+ loc.itfVisits = Map.findWithDefault [] @loc.unqualItf @lhs.distVisitOrder+ (loc.sequenceErrs, clauses.nextVisits) = checkVisitSequence @pos @name @lhs.nextVisits+ +errs0 = if not (@name `elem` @loc.itfVisits)+ then (Err_UndeclVisit @pos @name @loc.unqualItf Seq.<|)+ else (@loc.sequenceErrs Seq.><)+ | Internal -- don't eat any of the expected visits+ loc.name = Ident (show @name ++ "_int" ++ show @loc.lexOrder) (identPos @name)+ loc.unqualItf = head @lhs.itf+ | Impl inst.actual : SemVisit+ inst.actual = prependEmptyVisits @lhs.basename @lhs.masterPos SemVisit_End @lhs.nextVisits+ | Prependable+ loc.missingVisits = if elem @name @lhs.nextVisits+ then takeWhile (/= @name) @lhs.nextVisits+ else []+ loc.remainingVisits = drop (length @loc.missingVisits) @lhs.nextVisits+ inst.visits : SemVisit+ inst.visits = if null @loc.remainingVisits || @name `elem` @lhs.doneVisits+ then SemVisit_End+ else prependEmptyVisits @lhs.basename @pos @actual @loc.missingVisits+ +errs0 = if null @loc.remainingVisits && not (null @lhs.nextVisits)+ then (Err_ExpVisit @pos @name (head @lhs.nextVisits) Seq.<|)+ else if @name `elem` @lhs.doneVisits+ then (Err_Dup [@name] Seq.<|)+ else id+ | End +errs0 = (if null @lhs.nextVisits then Seq.empty else Seq.singleton (Err_VisitsNotImpl @lhs.nonterm @lhs.nextVisits)) Seq.><++ATTR AllVisitClauses [ masterPos : Pos | | ]+SEM Item | Sem CoSem first.masterPos = @pos+SEM DataSem | Sem clauses.masterPos = @pos+SEM SemVisit | Visit Internal loc.masterPos = @pos+SEM Clause | Clause loc.masterPos = @pos++{+prependEmptyVisits _ _ t [] = t+prependEmptyVisits basename pos t (v:vs)+ = SemVisit_Visit pos v False [] [] (ClausesTop_Top [Clause_Clause pos (mkClauseName pos v basename) []+ (prependEmptyVisits basename pos t vs) ])++mkClauseName :: Pos -> Ident -> QIdent -> Ident+mkClauseName pos v vs+ = Ident (show v ++ concatMap (\v' -> "_" ++ show v') vs) pos++checkVisitSequence :: Pos -> Ident -> [Ident] -> (Errs, [Ident])+checkVisitSequence _ _ [] = (Seq.empty, []) -- dont report more errors if already erroneous+checkVisitSequence pos nm (nm' : nms)+ | nm == nm' = (Seq.empty, nms)+ | otherwise = (Seq.singleton $ Err_ExpVisit pos nm nm', []) -- mismatch+}++-- insert dummy clause if no clauses were given+SEM ClausesTop+ | Impl+ loc.pos = @lhs.masterPos+ loc.name = mkClauseName @loc.pos (Ident "impl" @loc.pos) @lhs.basename+ + inst.actual : ClausesTop+ inst.actual = if null @clauses+ then ClausesTop_Top [Clause_Clause @loc.pos @loc.name [] SemVisit_Impl ]+ else ClausesTop_Top @clauses+++{+unionWithPlusplus :: Ord k => Map k [v] -> Map k [v] -> Map k [v]+unionWithParallel, unionWithSequential :: (Ord k, Ord v) => Map k [[v]] -> Map k [[v]] -> Map k [[v]]++unionWithPlusplus = Map.unionWith (++)+unionWithParallel mp1 mp2 = Map.unionWith (++) mp1' mp2'+ where addleft = Map.map (const [[]]) (mp2 `Map.difference` mp1)+ addright = Map.map (const [[]]) (mp1 `Map.difference` mp2)+ mp1' = addleft `Map.union` mp1+ mp2' = addright `Map.union` mp2+unionWithSequential = Map.unionWith (\[h] t -> map (h++) t)++unionWithUnion :: (Ord k, Monoid v) => Map k v -> Map k v -> Map k v+unionWithUnion = Map.unionWith mappend+}++SEM Item+ | Detach loc.unqualChildItf = head @loc.childItf+ loc.childVisits = Map.findWithDefault [] @loc.unqualChildItf @lhs.distVisitOrder++{+nextAfterInvoked :: [Ident] -> [Ident] -> Ident+nextAfterInvoked (a:as) (b:bs)+ | a == b = nextAfterInvoked as bs+ | otherwise = b+}+++--+-- Check if all visits are uniquely named+--++ATTR AllVisitClauses [ | gathVisitNames : {Env Ident ()} | ]+SEM SemVisit | Visit Internal+ +gathVisitNames = extend @name ()++SEM Item | Sem CoSem first.gathVisitNames = emptyEnv+ +errs0 = addDefErrs' @first.gathVisitNames+SEM DataSem | Sem clauses.gathVisitNames = emptyEnv+ +errs0 = addDefErrs' @clauses.gathVisitNames++SEM Clauses | Cons+ (hd.gathVisitNames, tl.gathVisitNames) = split @lhs.gathVisitNames+ (lhs.gathVisitNames, loc.gathLVisitNames) = merge @hd.gathVisitNames @tl.gathVisitNames+ +errs1 = addDefErrs' @loc.gathLVisitNames++ATTR SemVisit [ | | isInternal : Bool ]+SEM SemVisit+ | Visit lhs.isInternal = False+ | Internal lhs.isInternal = True+ | End lhs.isInternal = False++SEM Clause | Clause+ loc.isDeepest = not @next.isInternal++--+-- Attribute information: all syn/inh attrs per nonterm and per visit+--++{+type AttrMap = Map Ident (Map Ident String)+type VisitAttrMap = Map Ident AttrMap+}++ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | | gathInhAttrs, gathSynAttrs USE {`mappend`} {mempty} : AttrMap ]+ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | | gathVisitInhAttrs, gathVisitSynAttrs USE {`mappend`} {mempty} : VisitAttrMap ]+ATTR ItfVisits ItfVisit [ | | gathVisitsInhAttrs, gathVisitsSynAttrs USE {`mappend`} {mempty} : AttrMap ]+ATTR Attrs Attr [ | | gathVisitInhAttrs, gathVisitSynAttrs USE {`mappend`} {mempty} : {Map Ident String} ]++SEM Attr+ | Inh lhs.gathVisitInhAttrs = Map.singleton @name @type+ | Syn lhs.gathVisitSynAttrs = Map.singleton @name @type++SEM ItfVisit+ | Visit lhs.gathVisitsInhAttrs = Map.singleton @name @attrs.gathVisitInhAttrs+ lhs.gathVisitsSynAttrs = Map.singleton @name @attrs.gathVisitSynAttrs+ lhs.gathVisitInhAttrs = Map.singleton (head @loc.coItf) (Map.singleton @name @attrs.gathVisitSynAttrs)+ lhs.gathVisitSynAttrs = Map.singleton (head @loc.coItf) (Map.singleton @name @attrs.gathVisitInhAttrs)+ lhs.gathInhAttrs = Map.singleton (head @loc.coItf) @attrs.gathVisitSynAttrs+ lhs.gathSynAttrs = Map.singleton (head @loc.coItf) @attrs.gathVisitInhAttrs++SEM Itf+ | Itf +gathVisitInhAttrs = Map.insert @name @visits.gathVisitsInhAttrs+ +gathVisitSynAttrs = Map.insert @name @visits.gathVisitsSynAttrs++ +gathInhAttrs = Map.insert @name $ Map.unions $ Map.elems @visits.gathVisitsInhAttrs+ +gathSynAttrs = Map.insert @name $ Map.unions $ Map.elems @visits.gathVisitsSynAttrs++ATTR AllCodeBlocks ImplStmts ImplStmt [ distInhAttrs, distSynAttrs : AttrMap distVisitInhAttrs, distVisitSynAttrs : VisitAttrMap | | ]++SEM Program | Program+ blocks.distInhAttrs = @blocks.gathInhAttrs+ blocks.distSynAttrs = @blocks.gathSynAttrs+ blocks.distVisitInhAttrs = @blocks.gathVisitInhAttrs+ blocks.distVisitSynAttrs = @blocks.gathVisitSynAttrs++ATTR VisitAttrs VisitAttr [ | | gathVisitLocalAttrs USE {`mappend`} {mempty} : {Map Ident String} ]+ATTR Clauses Clause ClausesTop SemVisit [ | | gathVisitAttrs USE {`mappend`} {mempty} : {Map Ident (Map Ident String)} ]+ATTR AllCodeBlocks ImplStmts ImplStmt [ directVisitAttrs : {Map Ident (Map Ident String)} | | ]++SEM SemVisit | Visit +gathVisitAttrs = Map.insert @name @attrs.gathVisitLocalAttrs+SEM VisitAttr | Chn lhs.gathVisitLocalAttrs = Map.singleton @name @type+SEM Program | Program blocks.directVisitAttrs = Map.empty+SEM Item | Sem CoSem first.directVisitAttrs = @first.gathVisitAttrs++ATTR AllCodeBlocks ImplStmts ImplStmt [ directVisitLocalAttrs : {Map Ident String} | | ]+SEM Program | Program blocks.directVisitLocalAttrs = Map.empty+SEM SemVisit | Visit stmts.directVisitLocalAttrs = @attrs.gathVisitLocalAttrs+ clauses.directVisitLocalAttrs = @attrs.gathVisitLocalAttrs++--+-- Dispatch to AttrType+--++ATTR AttrTypePat AttrTypeCode [ child, name, childItf : Ident | | ]++SEM Pat | Attr+ inst.tp : AttrTypePat+ inst.tp = case identName @child of+ s | s == "loc" -> AttrTypePat_ProdLocal+ | s == "lhs" -> AttrTypePat_Lhs+ | s == "vis" -> AttrTypePat_VisLocal+ | @child `Set.member` @lhs.allVisits -> AttrTypePat_Visit+ | @loc.childItf == locQIdent -> AttrTypePat_ProdLocal+ | otherwise -> AttrTypePat_Child+ tp.child = @child+ tp.name = @loc.origName+ tp.childItf = head @loc.childItf++SEM Item | Attr+ inst.tp : AttrTypeCode+ inst.tp = case identName @child of+ s | s == "loc" -> AttrTypeCode_ProdLocal+ | s == "lhs" -> AttrTypeCode_Lhs+ | s == "vis" -> AttrTypeCode_VisLocal+ | @child `Set.member` @lhs.allVisits -> AttrTypeCode_Visit+ | @loc.childItf == locQIdent -> AttrTypeCode_ProdLocal+ | otherwise -> AttrTypeCode_Child+ tp.child = @child+ tp.name = @loc.origName+ tp.childItf = head @loc.childItf++-- computation of defineable attributes+-- * all syn attrs of lhs+-- * inh attrs of visits of children+-- N.B. we may wish to check that we only define inherited attrs of+-- actually invoked children. However, this is too restrictive for+-- the programmer.+-- We now allow inh attrs to be defined on all visits not invoked yet+-- * any local attribute is defineable++SEM AttrTypePat+ | Lhs -- check if @lhs.name is a syn attr of @lhs.childItf+ loc.allowedDefs = Map.findWithDefault Map.empty (head @lhs.itf) @lhs.distSynAttrs+ | Child+ loc.visits = Set.toList $ Map.findWithDefault Set.empty @lhs.child @lhs.distChildEffRanges+ loc.inhMap = Map.findWithDefault Map.empty @lhs.childItf @lhs.distVisitInhAttrs+ loc.allowedDefs = Map.unions (map (\v -> Map.findWithDefault Map.empty v @loc.inhMap) @loc.visits)+ | Visit+ loc.allowedDefs = Map.findWithDefault Map.empty @lhs.child @lhs.directVisitAttrs+ | VisLocal+ loc.allowedDefs = @lhs.directVisitLocalAttrs+ | Lhs Child Visit VisLocal+ +errs2 = ( if Map.member @lhs.name @loc.allowedDefs+ then Seq.empty+ else Seq.singleton (Err_UndeclAttr @lhs.child @lhs.name) ) Seq.><++{+common :: [[Ident]] -> [Ident]+common [] = []+common [x] = x+common (x:xs) = x `intersect` common xs+}+++--+-- computation of available attributes+--+-- detect duplication + detect missing+-- we can use a single environment to keep track of the various+-- forms of attributes, because the "child"-name prevents overlap.+-- However, since scoping of visit-local attrs is different, we+-- put these in a separate environment+--++{+type At = (Ident,Ident,Bool) -- True: inherited attr, False: syn attr+type DefsEnv = Env At (Maybe String)++locIdent, lhsIdent, visIdent :: Ident+locIdent = ident "loc"+lhsIdent = ident "lhs"+visIdent = ident "vis"+}++ATTR AllCodeBlocks ImplStmts ImplStmt [ | gathDefs, gathVisLocalDefs, distDefs, distVisLocalDefs : DefsEnv | ]++SEM Program | Program blocks.gathDefs = emptyEnv+ blocks.gathVisLocalDefs = emptyEnv+ blocks.distDefs = @blocks.gathDefs+ blocks.distVisLocalDefs = @blocks.gathVisLocalDefs++-- scoping+SEM Item | Sem CoSem+ loc.gathDefsIn = enter @lhs.gathDefs+ first.gathDefs = @loc.gathDefsInh+ first.gathVisLocalDefs = enter @lhs.gathVisLocalDefs+ first.distDefs = enterWith @loc.localDefs @lhs.distDefs+ first.distVisLocalDefs = enterWith @loc.localVisLocalDefs @lhs.distVisLocalDefs+ + loc.gathDefsInh = Map.fold (flip (Map.foldWithKey (\n t -> extend (replPos @pos lhsIdent,replPos @pos n,True) (Just t)))) @loc.gathDefsIn @loc.inhAttrMap -- add all inherited attrs of all visits+ + (lhs.gathDefs, loc.localDefs) = leave @first.gathDefs+ (lhs.gathVisLocalDefs, loc.localVisLocalDefs) = leave @first.gathVisLocalDefs+ (lhs.distDefs, loc.localDefs') = leave @first.distDefs+ (lhs.distVisLocalDefs, loc.localVisLocalDefs') = leave @first.distVisLocalDefs+ + +errs3 = addDefErrs'' @loc.localDefs+ +errs3 = addDefErrs'' @loc.localVisLocalDefs+ +errs3 = addUseErrs'' @loc.localDefs'+ +errs3 = addUseErrs'' @loc.localVisLocalDefs'++SEM DataSem | Sem+ loc.gathDefsIn = enter @lhs.gathDefs+ clauses.gathDefs = @loc.gathDefsInh+ clauses.gathVisLocalDefs = enter @lhs.gathVisLocalDefs+ clauses.distDefs = enterWith @loc.localDefs @lhs.distDefs+ clauses.distVisLocalDefs = enterWith @loc.localVisLocalDefs @lhs.distVisLocalDefs+ + loc.gathDefsInh = Map.fold (flip (Map.foldWithKey (\n t -> extend (replPos @pos lhsIdent,replPos @pos n,True) (Just t)))) @loc.gathDefsIn @loc.inhAttrMap -- add all inherited attrs of all visits++ (lhs.gathDefs, loc.localDefs) = leave @clauses.gathDefs+ (lhs.gathVisLocalDefs, loc.localVisLocalDefs) = leave @clauses.gathVisLocalDefs+ (lhs.distDefs, loc.localDefs') = leave @clauses.distDefs+ (lhs.distVisLocalDefs, loc.localVisLocalDefs') = leave @clauses.distVisLocalDefs++ +errs3 = addDefErrs'' @loc.localDefs+ +errs3 = addDefErrs'' @loc.localVisLocalDefs+ +errs3 = addUseErrs'' @loc.localDefs'+ +errs3 = addUseErrs'' @loc.localVisLocalDefs'++SEM Clauses | Cons+ (hd.gathDefs, tl.gathDefs) = split @lhs.gathDefs+ (hd.gathVisLocalDefs, tl.gathVisLocalDefs) = split @lhs.gathVisLocalDefs+ (lhs.gathDefs, loc.gathLDefs) = merge @hd.gathDefs @tl.gathDefs+ (lhs.gathVisLocalDefs, loc.gathVisLocalLDefs) = merge @hd.gathVisLocalDefs @tl.gathVisLocalDefs+ hd.distDefs = enterWith @loc.gathLDefs @lhs.distDefs+ hd.distVisLocalDefs = enterWith @loc.gathVisLocalLDefs @lhs.distVisLocalDefs+ (tl.distDefs, loc.localDistDefs) = leave @hd.distDefs+ (tl.distVisLocalDefs, loc.localDistVisLocalDefs) = leave @hd.distVisLocalDefs++ +errs3 = addDefErrs'' @loc.gathLDefs+ +errs3 = addDefErrs'' @loc.gathVisLocalLDefs+ +errs3 = addUseErrs'' @loc.localDistDefs+ +errs3 = addUseErrs'' @loc.localDistVisLocalDefs++SEM SemVisit | Visit+ loc.ldefs1 = enter @lhs.gathVisLocalDefs+ stmts.gathVisLocalDefs = @loc.ldefs2+ (lhs.gathVisLocalDefs, loc.localVisLocalDefs) = leave @impls.gathVisLocalDefs+ stmts.distVisLocalDefs = enterWith @loc.localVisLocalDefs @lhs.distVisLocalDefs+ (lhs.distVisLocalDefs, loc.localVisLocalDefs') = leave @impls.distVisLocalDefs++ +errs3 = addDefErrs'' @loc.localVisLocalDefs+ +errs3 = addUseErrs'' @loc.localVisLocalDefs'+-- a SemVisit | Internal is just invisible in this case (treated as a nested tree of clauses)++-- collect the local additions to compute the intersection of them+ATTR Clauses [ | | gathDefsAdds, gathVisLocalDefsAdds : {[DefsEnv]} ]++SEM Clauses+ | Cons lhs.gathDefsAdds = @loc.gathLDefs : @tl.gathDefsAdds+ lhs.gathVisLocalDefsAdds = @loc.gathVisLocalLDefs : @tl.gathVisLocalDefsAdds+ | Nil lhs.gathDefsAdds = []+ lhs.gathVisLocalDefsAdds = []++SEM ClausesTop+ | Top +gathDefs = push (strip $ intersection @clauses.gathDefsAdds)+ +gathVisLocalDefs = push (strip $ intersection @clauses.gathVisLocalDefsAdds)++SEM Clause | Clause+ loc.enterF = if @loc.isDeepest then enter else id+ loc.leaveF = if @loc.isDeepest then leave else (\x -> (x, emptyEnv))+ loc.enterWithF = if @loc.isDeepest then enterWith else (\_ x -> x) ++ next.gathDefs = @loc.enterF @stmts.gathDefs+ (impls.gathDefs, loc.nextVisitLocDefs) = @loc.leaveF @next.gathDefs+ next.distDefs = @loc.enterWithF @loc.nextVisitLocDefs @stmts.distDefs+ (impls.distDefs, loc.nextVisitLocDefs') = @loc.leaveF @next.distDefs+ + +errs3 = addDefErrs'' @loc.nextVisitLocDefs+ +errs3 = addUseErrs'' @loc.nextVisitLocDefs'++ lhs.gathDefs = @impls.gathDefs+ lhs.gathVisLocalDefs = @next.gathVisLocalDefs -- impls can't have gathVisLocalDefs++-- Add chn attrs of visit and check that they are defined when we enter the next visit+SEM SemVisit | Visit+ loc.ldefs2 = Map.foldWithKey (\n t -> extend (replPos @pos visIdent,replPos @pos n,True) (Just t)) @loc.ldefs1 @attrs.gathVisitLocalAttrs++ATTR ClausesTop Clauses Clause SemVisit [ localAttrs : {Map Ident String} | | ]+SEM Item | Sem CoSem first.localAttrs = Map.empty+SEM DataSem | Sem clauses.localAttrs = Map.empty++SEM SemVisit | Visit clauses.localAttrs = @attrs.gathVisitLocalAttrs -- lhs.localAttrs thus refers to the local attrs of the parent++SEM Clause | Clause -- only when the clause is deepest.+ loc.missingLocalAttrMap = if @loc.isDeepest+ then Map.filterWithKey (\n _ -> not $+ defined (replPos @pos visIdent,replPos @pos n,False) @next.distVisLocalDefs) @lhs.localAttrs+ else Map.empty -- no default rules, maybe in deeper clause+ loc.deflLocalAttrMap = @loc.missingLocalAttrMap+ loc.deflLocalAttrs = Map.keys @loc.deflLocalAttrMap -- always use default rules for local attributes++SEM SemVisit | Visit+ loc.inhAttrMap = Map.findWithDefault Map.empty @name (Map.findWithDefault Map.empty (head @lhs.itf) @lhs.distVisitInhAttrs)++ATTR SemVisit ClausesTop Clauses Clause [ visit : Ident | | ]+SEM Item | Sem CoSem first.visit = @name -- some dummy value+SEM DataSem | Sem clauses.visit = @tp -- some dummy value+SEM SemVisit | Visit clauses.visit = @name -- internal visits are not passed as name++SEM Clause | Clause -- only when clause is deepest.+ loc.synAttrMap = Map.findWithDefault Map.empty @lhs.visit (Map.findWithDefault Map.empty (head @lhs.itf) @lhs.distVisitSynAttrs)+ loc.missingAttrMap = if @loc.isDeepest+ then Map.filterWithKey (\n _ -> not $ defined (replPos @pos lhsIdent,n,False) @lhs.distDefs) @loc.synAttrMap+ else Map.empty+ (loc.deflAttrMap, loc.undefAttrMap) = Map.partitionWithKey (\n _ -> Map.member n @loc.distDeflStmts) @loc.missingAttrMap+ lhs.distDefs = Map.foldWithKey (\n _ -> snd . find (replPos @pos lhsIdent,replPos @pos n,False) Nothing) @impls.distDefs @loc.undefAttrMap -- bypass inst.dflts+ loc.deflAttrs = [ (a, Map.findWithDefault (False,Nothing) a @loc.distDeflStmts) | a <- Map.keys @loc.deflAttrMap ]+ -- +errs1 = (debugMsg ("pos: " ++ show @pos ++ "\nall: " ++ show @lhs.distDefs ++ "\nundef: " ++ show @loc.undefAttrMap ++ "\ndefl: " ++ show @loc.deflAttrMap ++ "\ndefs: " ++ show @loc.distDeflStmts) Seq.><)++SEM AttrTypePat+ | VisLocal +gathVisLocalDefs = extend (@lhs.child, @lhs.name, False) Nothing+ | ProdLocal +gathDefs = extend (@lhs.child, @lhs.name, False) Nothing+ | Lhs +gathDefs = extend (@lhs.child, @lhs.name, False) Nothing+ | Child +gathDefs = extend (@lhs.child, @lhs.name, True) Nothing+ | Visit +gathDefs = extend (@lhs.child, @lhs.name, False) Nothing++SEM Pat | AttrCon+ +gathDefs = \env -> foldr (\(nm,tp) -> extend (@name, nm, not @loc.isLoc) (Just (either show id tp))) env @loc.fields++SEM AttrTypeCode+ | VisLocal +distVisLocalDefs = snd . find (@lhs.child, @lhs.name,True) Nothing+ | ProdLocal +distDefs = snd . find (@lhs.child, @lhs.name, False) Nothing+ | Lhs +distDefs = snd . find (@lhs.child, @lhs.name, True) Nothing+ | Child +distDefs = snd . find (@lhs.child, @lhs.name, False) Nothing+ | Visit +distDefs = snd . find (@lhs.child, @lhs.name, True) Nothing++{+replPos :: Pos -> Ident -> Ident+replPos p i = Ident (identName i) p+}++-- Invoke: bring attrs in scope (but not in the scope of rhs)+-- + compute attrs to "default"+SEM Stmt | Invoke+ loc.inhAttrMap = Map.findWithDefault Map.empty @visit (Map.findWithDefault Map.empty @loc.unqualChildItf @lhs.distVisitInhAttrs)+ loc.synAttrMap = Map.findWithDefault Map.empty @visit (Map.findWithDefault Map.empty @loc.unqualChildItf @lhs.distVisitSynAttrs)+ + loc.missingAttrMap = Map.filterWithKey (\n _ -> not $ defined (@name,n,True) @lhs.distDefs) @loc.inhAttrMap+ (loc.deflAttrMap, loc.undefAttrMap) = Map.partitionWithKey (\n _ -> Map.member n @lhs.distDeflStmts) @loc.missingAttrMap+ loc.deflAttrs = [ (a, Map.findWithDefault (False,Nothing) a @lhs.distDeflStmts) | a <- Map.keys @loc.deflAttrMap ]+ + -- watch out: copy rule would take deflts.distDefs too, resulting in a loop.+ lhs.distDefs = Map.foldWithKey (\n _ -> snd . find (@name,replPos @pos n,True) Nothing) @code.distDefs @loc.undefAttrMap+ lhs.gathDefs = Map.foldWithKey (\n t -> extend (@name,replPos @pos n,False) (Just t)) @code.gathDefs @loc.synAttrMap++-- Also in case of implicit invoke+SEM ImplStmt | Invoke+ loc.inhAttrMap = Map.findWithDefault Map.empty @visit (Map.findWithDefault Map.empty @itf @lhs.distVisitInhAttrs)+ loc.synAttrMap = Map.findWithDefault Map.empty @visit (Map.findWithDefault Map.empty @itf @lhs.distVisitSynAttrs)+ + loc.missingAttrMap = Map.filterWithKey (\n _ -> not $ defined (@child,n,True) @lhs.distDefs) @loc.inhAttrMap+ (loc.deflAttrMap, loc.undefAttrMap) = Map.partitionWithKey (\n _ -> Map.member n @lhs.distDeflStmts) @loc.missingAttrMap+ loc.deflAttrs = [ (a, Map.findWithDefault (False,Nothing) a @lhs.distDeflStmts) | a <- Map.keys @loc.deflAttrMap ]+ + -- watch out: copy rule would take deflts.distDefs too, resulting in a loop.+ lhs.distDefs = Map.foldWithKey (\n _ -> snd . find (@child,replPos @pos n,True) Nothing) @lhs.distDefs @loc.undefAttrMap+ lhs.gathDefs = Map.foldWithKey (\n t -> extend (@child,replPos @pos n,False) (Just t)) @lhs.gathDefs @loc.synAttrMap+-- +errs2 = debugMsg ("impl invoke: " ++ show @child ++ "." ++ show @visit ++ " base " ++ show @lhs.basename ++": " ++ show @loc.synAttrMap) Seq.><++--+-- Add implicit invokes. Watch out with assigning attributes to implicit statements.+-- Must be before the inst.deflts!+--++SEM Clause | Clause+ inst.impls : ImplStmts+ inst.impls = + [ ImplStmt_Invoke @pos nm s (findChild nm @lhs.distChildDefs)+ | (nm,vs) <- Map.assocs @loc.implicitInvokes, s <- Set.toList vs ]++SEM SemVisit | Visit Internal+ inst.impls : ImplStmts+ inst.impls = [ ImplStmt_Invoke @pos nm s (findChild nm @lhs.distChildDefs)+ | (nm,vs) <- Map.assocs @loc.implicitInvokes, s <- Set.toList vs ]++{+findChild nm env = itf+ where (([itf], _), _) = find [nm] (unknQIdent,unknQIdent) env+}++--+-- Deal with default rules+--++SEM Clause | Clause+ inst.deflts : ImplStmts+ inst.deflts = map (\(nm,(_,mbCode)) -> ImplStmt_DefaultSyn @pos True nm mbCode) @loc.deflAttrs+ ++ map (ImplStmt_DefaultVisLocal @pos) @loc.deflLocalAttrs++SEM Stmt | Invoke+ inst.deflts : ImplStmts+ inst.deflts = map (\(nm,(empty,mbCode)) -> ImplStmt_DefaultChild @pos empty @name nm mbCode) @loc.deflAttrs++SEM ImplStmt | Invoke+ inst.deflts : ImplStmts+ inst.deflts = map (\(nm,(empty,mbCode)) -> ImplStmt_DefaultChild @pos empty @child nm mbCode) @loc.deflAttrs++--+-- Determine children + input attributes for default rule+--++SEM ImplStmt | DefaultChild DefaultSyn+ loc.childrenOrdered = map fst $ sortBy (\(_,a) (_,b) -> a `compare` b) (Map.assocs @lhs.distChildOcc)+ loc.availChildren = [ (c,itf, findVisitOfAttr nm itf @lhs.distAttrVisMap)+ | c <- @loc.childrenOrdered+ , let ([itf], _) = fst $ find [c] (unknQIdent,unknQIdent) @lhs.distChildDefs+ nm = renameAttrFwd @lhs.distRenames c @name+ , hasSynAttr nm itf @lhs.distSynAttrs+ ]++SEM ImplStmt | DefaultChild loc.candidateChildren = takeWhile (\(nm,_,_) -> nm /= @child) @loc.availChildren+SEM ImplStmt | DefaultSyn loc.candidateChildren = @loc.availChildren++SEM ImplStmt | DefaultChild+-- +errs2 = debugMsg ("child: " ++ show @child ++ ", attr: " ++ show @name ++ ", children: " ++ show @loc.children) Seq.><++SEM ImplStmt | DefaultChild DefaultSyn+ (loc.children, loc.errChildren) = partition (\(c,itf,vis) -> visAvailable c itf vis @lhs.availInvokes @lhs.distVisitOrder)+ @loc.candidateChildren+ loc.childAttrs = map (\(c,_,_) -> (c, renameAttrFwd @lhs.distRenames c @name)) @loc.children+ +errs2 = \es -> foldr (\(c,itf,vis) -> (Err_ChildSynUnav @pos c itf vis @name Seq.<|)) es @loc.errChildren++SEM ImplStmt | DefaultChild+ +errs3 = if not @allowEmpty && null @loc.children && not @loc.lhsHasAttr+ then (Err_MissingAttr True @child (replPos @pos @name) Seq.<|)+ else id++SEM ImplStmt | DefaultSyn+ +errs3 = if not @allowEmpty && null @loc.children && not @loc.lhsHasAttr+ then (Err_MissingAttr False (replPos @pos lhsIdent) @name Seq.<|)+ else id++-- is there an lhs.name inh attribute?+-- if the lhs inh attr is in a later visit, this results in a cycle+SEM ImplStmt | DefaultChild DefaultSyn+ loc.unqualChildItf = head @lhs.itf+ loc.lhsHasAttr = isJust $ Map.lookup (True,@name) $+ Map.findWithDefault Map.empty @loc.unqualChildItf @lhs.distAttrVisMap++{+visAvailable child itf vis invokeMap orderMap+ = any (\start -> vis `elem` dropWhile (/= start) order) invokes+ where+ invokes = Set.toList $ Map.findWithDefault Set.empty child invokeMap+ order = Map.findWithDefault [] itf orderMap++hasSynAttr nm itf mp = Map.member nm $ Map.findWithDefault Map.empty itf mp+findVisitOfAttr nm itf mp = Map.findWithDefault (ident "<unknownvisit>") (False,nm) (Map.findWithDefault Map.empty itf mp)+}+++--+-- Lexical occurrence of statements+--++ATTR AllFinal [ | lexCounter : Int | ]++SEM Program | Program+ blocks.lexCounter = 1++SEM Stmt | *+ loc.lexOrder : UNIQUEREF lexCounter++SEM ImplStmt | *+ loc.lexOrder : UNIQUEREF lexCounter++SEM Clause | Clause loc.lexOrder : UNIQUEREF lexCounter+SEM SemVisit | Visit Internal loc.lexOrder : UNIQUEREF lexCounter++{+nextUnique :: Int -> (Int, Int)+nextUnique x = (x+1, x)+}++--+-- Lexical occurrence of children+-- (direct children of a clause)++ATTR Stmts Stmt [ | | gathChildOcc USE {`unionWithMin`} {Map.empty} : {Map Ident Int} ]+ATTR AllCodeBlocks ImplStmts ImplStmt [ distChildOcc : {Map Ident Int} | | ]++{+unionWithMin :: Map Ident Int -> Map Ident Int -> Map Ident Int+unionWithMin = Map.unionWith min+}++SEM Stmt | Attach lhs.gathChildOcc = Map.singleton @name @loc.lexOrder++SEM Program | Program blocks.distChildOcc = Map.empty+SEM Item | Sem CoSem first.distChildOcc = Map.empty+SEM DataSem | Sem clauses.distChildOcc = Map.empty++SEM SemVisit | Visit Internal loc.distChildOcc = @stmts.gathChildOcc `unionWithMin` @lhs.distChildOcc+SEM Clause | Clause loc.distChildOcc = @stmts.gathChildOcc `unionWithMin` @lhs.distChildOcc++--+-- Define clauses of DataSem in terms of a visit+--++SEM DataSem | Sem+ inst.clauses : T_SemVisit+ inst.clauses = sem_SemVisit_Visit @pos @loc.firstVisit @cyclic (sem_VisitAttrs_Nil) (sem_Stmts @stmts)++--+-- Some useful properties+--++ATTR ItfVisits ItfVisit [ | | firstVisit : Ident ]+SEM ItfVisit | Visit lhs.firstVisit = @name+SEM ItfVisits+ | Cons lhs.firstVisit = @hd.firstVisit+ | Nil lhs.firstVisit = ident "nofirstvisit"++SEM ItfVisit+ | Visit loc.itfNm = head @lhs.itf++SEM Attr+ | Inh Syn loc.itfNm = head @lhs.itf+ loc.visNm = head @lhs.visit++ATTR ItfVisit [ mbNextVisit : {Maybe Ident} | | ]+ATTR ItfVisits [ | | mbNextVisit : {Maybe Ident} ]++SEM ItfVisits+ | Cons hd.mbNextVisit = @tl.mbNextVisit+ lhs.mbNextVisit = Just @hd.firstVisit+ | Nil lhs.mbNextVisit = Nothing++SEM SemVisit | Visit Internal loc.itfNm = head @lhs.itf+SEM Clause | Clause loc.itfNm = head @lhs.itf++ATTR SemVisit [ | | mbNextVisit : {Maybe Ident} ]+SEM SemVisit+ | Visit Internal lhs.mbNextVisit = Just @name+ | End lhs.mbNextVisit = Nothing++ATTR MaybeBoundCode [ | | isJust : Bool ]+SEM MaybeBoundCode+ | Just lhs.isJust = True+ | Nothing lhs.isJust = False++ATTR Exts Ext [ | | gathExts USE {`Set.union`} {Set.empty} : {Set Ident} ]+SEM Ext | Ext lhs.gathExts = Set.singleton @name ++{+type AttrVisMap = Map Ident (Map (Bool,Ident) Ident)+}++ATTR BlocksTop Blocks Block Itf [ | | gathAttrVisMap USE {`Map.union`} {Map.empty} : AttrVisMap ]+ATTR ItfVisits ItfVisit Attrs Attr [ | | gathAttrVisMap USE {`Map.union`} {Map.empty} : {Map (Bool,Ident) Ident} ]+SEM Itf | Itf lhs.gathAttrVisMap = Map.singleton @name @visits.gathAttrVisMap+SEM Attr | Inh Syn lhs.gathAttrVisMap = Map.singleton (@loc.isInh, @name) (head @lhs.visit)+SEM Attr | Inh loc.isInh = True+ | Syn loc.isInh = False++ATTR AllCodeBlocks ImplStmts ImplStmt [ distAttrVisMap : AttrVisMap | | ]+SEM Program | Program blocks.distAttrVisMap = @blocks.gathAttrVisMap++{+type DataMap = Map Ident ConMap+type ConMap = Map Ident (Int, FieldMap)+type FieldMap = Map Ident (Int, Either Ident String)+}++ATTR BlocksTop Blocks Block Data Type [ | | gathDataMap USE {`Map.union`} {Map.empty} : DataMap ]+ATTR Cons Con [ | | gathConMap USE {`Map.union`} {Map.empty} : ConMap ]+ATTR Fields Field [ | | gathFieldMap USE {`Map.union`} {Map.empty} : FieldMap ]++SEM Data | Data lhs.gathDataMap = Map.singleton @name @cons.gathConMap+SEM Con | Con lhs.gathConMap = Map.singleton @name (@lhs.nr, @fields.gathFieldMap)+SEM Field | Field lhs.gathFieldMap = Map.singleton @name (@lhs.nr, @type.fldType)++ATTR AllCodeBlocks ImplStmts ImplStmt [ distDataMap : DataMap | | ]+SEM Program | Program blocks.distDataMap = @blocks.gathDataMap++-- Basename: a unique name for the current clause. VisitNames are shared.+ATTR AllFinal [ basename : QIdent | | ]+ATTR AllVisitClauses [ semBasename : QIdent | | ]++SEM Program | Program blocks.basename = [ident "<root>"]++SEM Item | Sem CoSem loc.basename = [@name]+ loc.semBasename = [@name]+SEM DataSem | Sem loc.basename = [@tp]+ loc.semBasename = [@tp]+SEM Clause | Clause loc.basename = @name : @lhs.basename++-- within the context of a cosem or not+ATTR AllVisitClauses [ withinCoSem : Bool | | ]++SEM Item | Sem first.withinCoSem = False+SEM Item | CoSem first.withinCoSem = True+SEM DataSem | Sem clauses.withinCoSem = False++-- mode of a Mode+ATTR Mode [ | | isMatch : Bool ]+SEM Mode | Match lhs.isMatch = True+ | Assert lhs.isMatch = False++-- position of a DataSem++ATTR DataSem [ | | pos : Pos ]+SEM DataSem | Sem lhs.pos = @pos+SEM Item | DataSem loc.pos = @sem.pos+++--+-- Convert type aliases to their structural representation+--++ATTR AliasType [ | | alias : SELF ]+ATTR BlocksTop Blocks Block Type [ | | gathAliasses USE {`Map.union`} {Map.empty} : {Map Ident AliasType} ]+ATTR AllCodeBlocks ImplStmts ImplStmt Data Cons Con Fields Field FieldType Type [ distAliasses : {Map Ident AliasType} | | ]++SEM Type | Alias lhs.gathAliasses = Map.singleton @name @type.alias+SEM Program | Program blocks.distAliasses = @blocks.gathAliasses++SEM Pat | AttrCon loc.mbAlias = Map.lookup @dt @lhs.distAliasses+SEM Item | Construct loc.mbAlias = Map.lookup @data @lhs.distAliasses+SEM FieldType | Nonterm loc.mbAlias = Map.lookup @name @lhs.distAliasses++SEM Type | Alias+inst.data : Data+inst.data = @type.data++ATTR AliasType [ pos : Pos name : Ident vars : Vars | | data : {Data} ]+SEM Type | Alias type.pos = @pos+ type.name = @name+ type.vars = @vars.self++SEM AliasType+ | Prod lhs.data = let mkFld i nm = Field_Field (Ident ("x" ++ show i) @lhs.pos) (FieldType_Nonterm nm)+ in Data_Data @lhs.pos @lhs.name @lhs.vars+ [Con_Con @lhs.pos (Ident "Prod" @lhs.pos) [] (zipWith mkFld [1..] @fields) ] []+ | List lhs.data = Data_Data @lhs.pos @lhs.name @lhs.vars+ [ Con_Con @lhs.pos (Ident "Cons" @lhs.pos) []+ [ Field_Field (Ident "hd" @lhs.pos) (FieldType_Nonterm @type)+ , Field_Field (Ident "tl" @lhs.pos) (FieldType_Nonterm @lhs.name)+ ]+ , Con_Con @lhs.pos (Ident "Nil" @lhs.pos) [] []+ ] []+ | Maybe lhs.data = Data_Data @lhs.pos @lhs.name @lhs.vars+ [ Con_Con @lhs.pos (Ident "Just" @lhs.pos) []+ [ Field_Field (Ident "just" @lhs.pos) (FieldType_Nonterm @type)+ ]+ , Con_Con @lhs.pos (Ident "Nothing" @lhs.pos) [] []+ ] []++ATTR Vars Var [ | | self : SELF vars USE {++} {[]} : {[Ident]} ]+SEM Var | Var lhs.vars = [@name]++--+-- Deal with type variables+--++-- todo+ATTR ItfVisits ItfVisit Cons Con [ vars : {[Ident]} | | ]++--+-- Extra Interfaces and semantics+--++ATTR Blocks Block Data Cons Con Itf ItfVisits ItfVisit [ | | extraBlocks USE {++} {[]} : {Blocks} ]++SEM BlocksTop | Top+ inst.extra : BlocksTop+ inst.extra = if null @blocks.extraBlocks+ then BlocksTop_None+ else BlocksTop_Top @blocks.extraBlocks++SEM Con | Con+ lhs.extraBlocks = if genConNonterms @lhs.opts+ then [@loc.constr, @loc.deconstr, @loc.constrSem, @loc.deconstrSem]+ else []+ loc.conItfNm = conItf @lhs.data @name+ loc.deconItfNm = deconItf @lhs.data @name+ loc.allVarNms = sort (@lhs.vars ++ @vars.vars)+ loc.allVars = map Var_Var @loc.allVarNms+ loc.constr = Block_Itf $+ Itf_Itf @pos @loc.conItfNm @loc.allVars [ItfVisit_Visit @pos (Ident "construct" @pos) False []+ ( Attr_Syn (Ident "data" @pos) (show @lhs.data)+ : [ Attr_Inh k (either show id t) | (k,t) <- sortAssocs $ assocs @fields.gathFields ] )]+ loc.deconstr = Block_Itf $+ Itf_Itf @pos @loc.deconItfNm @loc.allVars [ItfVisit_Visit @pos (Ident "deconstruct" @pos) False []+ ( Attr_Inh (Ident "data" @pos) (show @lhs.data)+ : [ Attr_Syn k (either show id t) | (k,t) <- sortAssocs $ assocs @fields.gathFields ] )]+ loc.constrSem = Block_Item @loc.conItfNm $+ Item_Sem @pos @loc.conItfNm @loc.conItfNm [] Nothing $+ SemVisit_Visit @pos (Ident "construct" @pos) False [] [] $ ClausesTop_Top [+ Clause_Clause @pos (Ident "dispatch" @pos) [+ Stmt_Eval Mode_Assert+ (Pat_Attr (Ident "lhs" @pos) (Ident "data" @pos))+ (BoundCode_Code Bind_Fun @pos $ Code_Code [+ Item_Construct @pos @lhs.data @name+ [ ExprField_Field k $ Code_Code [+ Item_Attr @pos (Ident "lhs" @pos) k+ ]+ | (k,_) <- assocs @fields.gathFields ]+ ] ) ] SemVisit_End ]+ loc.deconstrSem = Block_Item @loc.deconItfNm $+ Item_Sem @pos @loc.deconItfNm @loc.deconItfNm [] Nothing $+ SemVisit_Visit @pos (Ident "deconstruct" @pos) False [] [] $ ClausesTop_Top [+ Clause_Clause @pos (Ident "dispatch" @pos) [+ Stmt_Eval Mode_Match+ (Pat_AttrCon @name (Ident "lhs" @pos) @lhs.data)+ (BoundCode_Code Bind_Fun @pos $ Code_Code [+ Item_Attr @pos (Ident "lhs" @pos) (Ident "data" @pos)])+ ] SemVisit_End ]++{+conItf dt con = Ident ("Con_" ++ show dt ++ "_" ++ show con) (identPos con)+deconItf dt con = Ident ("Decon_" ++ show dt ++ "_" ++ show con) (identPos con)+noIterNm dt con = Ident ("NoIter_" ++ show dt ++ "_" ++ show con) (identPos con)+}++SEM ItfVisit | Visit+ lhs.extraBlocks = if genCoSems @lhs.opts+ then [@loc.noIterSem]+ else []+ loc.unqualItf = head @lhs.itf+ loc.noIterNm = noIterNm @loc.unqualItf @name+ loc.noIterSem = Block_Item @loc.noIterNm $+ Item_CoSem @pos @loc.noIterNm @loc.unqualItf @name [] Nothing $+ SemVisit_Visit @pos @name False [] [] $ ClausesTop_Top []++--+-- Compute the next visit of the (needed) children in scope+--++ATTR Stmts Stmt ImplStmts ImplStmt [ | gathNextVisits : {Map Ident (Maybe Ident)} | ]+ATTR SemVisit ClausesTop Clauses Clause [ distNextVisits : {Map Ident (Maybe Ident)} | | ]++SEM Item | Sem CoSem first.distNextVisits = Map.empty+SEM DataSem | Sem clauses.distNextVisits = Map.empty++SEM Stmt | Invoke loc.mbNextVisit = visitAfter @visit @loc.childVisits+SEM ImplStmt | Invoke loc.mbNextVisit = visitAfter @visit @loc.childVisits++SEM SemVisit | Visit Internal+ stmts.gathNextVisits = Map.empty+ clauses.distNextVisits = @impls.gathNextVisits `Map.union` @lhs.distNextVisits+SEM Clause | Clause+ stmts.gathNextVisits = Map.empty+ next.distNextVisits = let ks = Map.keysSet @next.allReqInvokes+ in Map.filter (maybe False (`Set.member` ks))+ (@impls.gathNextVisits `Map.union` @lhs.distNextVisits)++SEM Stmt | Invoke +gathNextVisits = Map.insertWith (laterVisit @loc.childVisits) @name @loc.mbNextVisit+SEM ImplStmt | Invoke +gathNextVisits = Map.insertWith (laterVisit @loc.childVisits) @child @loc.mbNextVisit++{+visitAfter :: Ident -> [Ident] -> Maybe Ident+visitAfter nm (a : b : nms)+ | nm == a = Just b+ | otherwise = visitAfter nm (b : nms)+visitAfter _ _ = Nothing++laterVisit :: [Ident] -> Maybe Ident -> Maybe Ident -> Maybe Ident+laterVisit _ Nothing Nothing = Nothing+laterVisit _ Nothing (Just x) = Just x+laterVisit _ (Just x) Nothing = Just x+laterVisit xs (Just l) (Just r) = Just $ laterVisit' xs l r++laterVisit' [] _ r = r+laterVisit' (x:xs) l r+ | x == l = l+ | x == r = r+ | otherwise = laterVisit' xs l r+}++ATTR SemVisit ClausesTop Clauses Clause [ myNextVisits : {Map Ident (Maybe Ident)} | | ]+SEM Item | Sem CoSem loc.myNextVisits = Map.empty+SEM DataSem | Sem loc.myNextVisits = Map.empty++SEM SemVisit | Visit+ loc.myNextVisits = Map.filter isJust @lhs.distNextVisits+++--+-- Computation of child ranges+-- (note: allDistChildMinRanges is passed to nested sems)+-- can be used to determine available children+--++ATTR AllCodeBlocks ImplStmts ImplStmt [ distAllChildMinRanges, distChildMinRanges : {Map Ident [Ident]} | | ]+ATTR AllCodeBlocks ImplStmts ImplStmt [ distChildEffRanges : {Map Ident (Set Ident)} | | ]+ATTR Stmts Stmt [ | | gathChildMinRanges USE {`unionWithPlusplus`} {Map.empty} : {Map Ident [Ident]} ]+ATTR Stmts Stmt [ | | gathChildEffRanges USE {`unionWithUnion`} {Map.empty} : {Map Ident (Set Ident)} ]++SEM Program | Program blocks.distChildMinRanges = Map.empty+ blocks.distAllChildMinRanges = Map.empty+ blocks.distChildEffRanges = Map.empty+SEM DataSem | Sem clauses.distChildMinRanges = Map.empty+ clauses.distChildEffRanges = Map.empty+SEM Item | Sem CoSem first.distChildMinRanges = Map.empty+ first.distChildEffRanges = Map.empty++SEM Clause | Clause+ loc.distChildMinRanges = @stmts.gathChildMinRanges `unionWithPlusplus` @lhs.distChildMinRanges+ loc.distAllChildMinRanges = @stmts.gathChildMinRanges `Map.union` @lhs.distAllChildMinRanges -- shadows+ loc.distChildEffRanges = @stmts.gathChildEffRanges `unionWithUnion` @lhs.distChildEffRanges+ next.distChildEffRanges = @loc.distChildEffRanges `diffInside` @loc.availInvokes+ loc.introChildren = Map.keysSet (Map.difference @stmts.gathChildMinRanges @lhs.distChildMinRanges)++SEM SemVisit | Visit Internal+ loc.distChildMinRanges = @stmts.gathChildMinRanges `unionWithPlusplus` @lhs.distChildMinRanges+ loc.distAllChildMinRanges = @stmts.gathChildMinRanges `Map.union` @lhs.distChildMinRanges -- shadows+ loc.distChildEffRanges = @stmts.gathChildEffRanges `unionWithUnion` @lhs.distChildEffRanges+ loc.introChildren = Map.keysSet (Map.difference @stmts.gathChildMinRanges @lhs.distAllChildMinRanges)++SEM Stmt | Attach+ lhs.gathChildMinRanges = Map.singleton @name [@visit]+ lhs.gathChildEffRanges = Map.singleton @name (Set.fromList $ dropWhile (/= @loc.visit) @loc.childVisits)++-- detect ambiguous child attachments+-- there may not be two attach-stmts in a scope simultaneously with the same start visit+SEM Stmt | Attach+ +errs2 = if (length $ filter (== @visit) $ Map.findWithDefault [] @name @lhs.distChildMinRanges) > 1+ then (Err_AmbAttach @name @visit Seq.<|)+ else id++--+-- Computation of implicit invokes+--++-- banned invokes: an invoke explicitly declared in some clause. May not be implicitly invoked higher-up+ATTR AllVisitClauses Stmts Stmt [ | | bannedInvokes USE {`unionWithUnion`} {Map.empty} : {Map Ident (Set Ident)} ]+ATTR Clauses Clause Stmts Stmt [ | | explInvokes USE {`unionWithUnion`} {Map.empty} : {Map Ident (Set Ident)} ]++SEM Stmt | Invoke lhs.explInvokes = Map.singleton @name (Set.singleton @visit)+SEM ClausesTop | Top +bannedInvokes = @clauses.explInvokes `unionWithUnion`+SEM SemVisit | Visit Internal +bannedInvokes = @stmts.explInvokes `unionWithUnion`++-- invokes needed on children+ATTR AllCodeBlocks [ | | minReqInvokes, allReqInvokes USE {`unionWithUnion`} {Map.empty} : {Map Ident (Set Ident)} ]+ATTR Clauses [ | | commonInvokes : {[Map Ident (Set Ident)]} ]++SEM Clauses+ | Cons lhs.commonInvokes = @hd.allReqInvokes : @tl.commonInvokes+ | Nil lhs.commonInvokes = []++SEM ClausesTop | Top+ lhs.minReqInvokes = intersectionsInvoke (@clauses.minReqInvokes : @clauses.commonInvokes) ++{+intersectionsInvoke [] = Map.empty+intersectionsInvoke [x] = x+intersectionsInvoke (x:xs) = Map.intersectionWith Set.intersection x (intersectionsInvoke xs)+}++SEM Clause | Clause+ loc.minReqInvokes1 = @stmts.minReqInvokes `unionWithUnion` @next.minReqInvokes -- all needed+ loc.allReqInvokes1 = @stmts.allReqInvokes `unionWithUnion` @next.allReqInvokes+ loc.minReqInvokes = Map.filterWithKey (\k _ -> not (Set.member k @loc.introChildren)) @loc.minReqInvokes1+ loc.allReqInvokes = Map.filterWithKey (\k _ -> not (Set.member k @loc.introChildren)) @loc.allReqInvokes1++SEM SemVisit | Visit Internal+ loc.minReqInvokes1 = @stmts.minReqInvokes `unionWithUnion` @clauses.minReqInvokes+ loc.allReqInvokes1 = @stmts.allReqInvokes `unionWithUnion` @clauses.allReqInvokes+ loc.minReqInvokes = Map.filterWithKey (\k _ -> not (Set.member k @loc.introChildren)) @loc.minReqInvokes1+ loc.allReqInvokes = Map.filterWithKey (\k _ -> not (Set.member k @loc.introChildren)) @loc.allReqInvokes1++-- register all needs for visits+SEM Item | Detach+ loc.minRanges = Set.fromList $ Map.findWithDefault [] @name @lhs.distAllChildMinRanges+ loc.potentialReqs = drop 1 $ dropWhile (/= @visit) $ reverse @loc.visitOrder+ loc.actualReqs = take (1 + length (takeWhile (\x -> not $ Set.member x @loc.minRanges) @loc.potentialReqs)) @loc.potentialReqs++ loc.invokeReqs = Map.singleton @name $ Set.fromList @loc.actualReqs+ lhs.minReqInvokes = @loc.invokeReqs+ lhs.allReqInvokes = @loc.invokeReqs++-- Introduces the need for all visits having the attribute+-- specified by the default of all children in scope+-- (iff not banned: checked higher up)+SEM Stmt | Default+ -- enumerate direct children and their itfs+ -- enumerate visits with attr name (use attrVisMap)+ -- add to minReqInvokes and allReqInvokes+ loc.visitReqs = [ Map.singleton child $ Set.fromList $ rangeUpTo (fromJust mbVis) range+ | child <- Map.keys @lhs.distChildMinRanges+ , let itf = findChild child @lhs.distChildDefs+ attrVisits = Map.findWithDefault Map.empty itf @lhs.distAttrVisMap+ childVisits = Map.findWithDefault [] itf @lhs.distVisitOrder+ minRanges = Set.fromList $ Map.findWithDefault [] child @lhs.distChildMinRanges+ range = dropWhile (\v -> not (v `Set.member` minRanges)) childVisits+ mbVis = Map.lookup (False,nm) attrVisits+ nm = renameAttrFwd @lhs.distRenames child @name+ , isJust mbVis+ ]+ loc.invokeReqs = Map.unionsWith Set.union @loc.visitReqs+ lhs.minReqInvokes = @loc.invokeReqs+ lhs.allReqInvokes = @loc.invokeReqs++SEM Stmt | Attach+ -- enumerate all defaults in scope+ -- lookup if syn attr exists for this child+ -- if yes, add a need on the visit+ loc.attrVisits = Map.findWithDefault Map.empty @type @lhs.distAttrVisMap+ loc.visitReqs = [ rangeUpTo (fromJust mbVis) $ dropWhile (/= @loc.visit) @loc.childVisits + | attr <- Map.keys @lhs.distDeflStmts+ , let mbVis = Map.lookup (False,attr) @loc.attrVisits+ , isJust mbVis ]+ loc.invokeReqs = Map.singleton @name $ Set.fromList (concat @loc.visitReqs)+ lhs.minReqInvokes = @loc.invokeReqs+ lhs.allReqInvokes = @loc.invokeReqs++{+rangeUpTo :: Ident -> [Ident] -> [Ident]+rangeUpTo _ [] = []+rangeUpTo vis (x:xs)+ | x == vis = [x]+ | otherwise = x : rangeUpTo vis xs+}++SEM AttrTypeCode | Child+ loc.visitOfAttr = Map.findWithDefault unknIdent (False,@lhs.name)+ (Map.findWithDefault Map.empty @lhs.childItf @lhs.distAttrVisMap)+ loc.minRanges = Set.fromList $ Map.findWithDefault [] @lhs.child @lhs.distAllChildMinRanges+ loc.potentialReqs = dropWhile (/= @loc.visitOfAttr) $ reverse @loc.visitOrder+ loc.actualReqs = take (1 + length (takeWhile (\x -> not $ Set.member x @loc.minRanges) @loc.potentialReqs)) @loc.potentialReqs+ + loc.invokeReqs = Map.singleton @lhs.child $ Set.fromList @loc.actualReqs+ lhs.minReqInvokes = @loc.invokeReqs+ lhs.allReqInvokes = @loc.invokeReqs++-- available invokes (two flavours: nested and not nested)+ATTR AllCodeBlocks ImplStmts ImplStmt [ availInvokes, allAvailInvokes : {Map Ident (Set Ident)} | | ]++SEM Program | Program blocks.availInvokes = Map.empty+ blocks.allAvailInvokes = Map.empty++SEM DataSem | Sem clauses.availInvokes = Map.empty+SEM Item | Sem CoSem first.availInvokes = Map.empty++SEM SemVisit | Visit Internal+ loc.implicitInvokes = @loc.minReqInvokes1 `diffInside` @lhs.availInvokes+ `diffInside` @stmts.explInvokes+ `diffInside` @clauses.bannedInvokes+ loc.additionalInvokes = @loc.minReqInvokes1 `diffInside` @clauses.bannedInvokes `unionWithUnion` @stmts.explInvokes+ loc.availInvokes = @loc.additionalInvokes `unionWithUnion` @lhs.availInvokes+ loc.allAvailInvokes = @loc.additionalInvokes `unionWithUnion` (+ Map.filterWithKey (notIn @loc.introChildren) @lhs.allAvailInvokes )+-- +errs1 = debugMsg ("visit: " ++ show @name ++ "\n impl: " ++ show @loc.implicitInvokes ++"\n banned: " ++ show @clauses.bannedInvokes) Seq.><++SEM Clause | Clause+ loc.implicitInvokes = @loc.minReqInvokes1 `diffInside` @lhs.availInvokes+ `diffInside` @stmts.explInvokes+ `diffInside` @next.bannedInvokes+ loc.additionalInvokes = @loc.minReqInvokes1 `diffInside` @next.bannedInvokes `unionWithUnion` @stmts.explInvokes+ loc.availInvokes = @loc.additionalInvokes `unionWithUnion` @lhs.availInvokes+ loc.allAvailInvokes = @loc.additionalInvokes `unionWithUnion` (+ Map.filterWithKey (notIn @loc.introChildren) @lhs.allAvailInvokes )+ +-- +errs1 = debugMsg ("clause: " ++ show @name ++ "\n impl: " ++ show @loc.implicitInvokes ++"\n banned: " ++ show @next.bannedInvokes) Seq.><++{+notIn :: Ord a => Set a -> a -> b -> Bool+notIn s k _ = not (k `Set.member` s)++diffInside :: Map Ident (Set Ident) -> Map Ident (Set Ident) -> Map Ident (Set Ident)+diffInside = Map.differenceWith f where+ f a b = let r = Set.difference a b+ in if Set.null r then Nothing else Just r+}++-- Report errors for missing invokes+ATTR Code Items Item AllVisitClauses Stmts Stmt+ MaybeBoundCode BoundCode AttrTypeCode+ [ | | gathMissingInvokes USE {`Set.union`} {Set.empty} : {Set (Ident,Ident)}]+ +SEM Item | Detach+ lhs.gathMissingInvokes = Set.fromList [ (k, v) | (k,vs) <- Map.assocs (@loc.invokeReqs `diffInside` @lhs.allAvailInvokes)+ , v <- Set.toList vs ]++SEM AttrTypeCode | Child+ lhs.gathMissingInvokes = Set.fromList [ (k, v) | (k,vs) <- Map.assocs (@loc.invokeReqs `diffInside` @lhs.allAvailInvokes)+ , v <- Set.toList vs ]++SEM SemVisit | Visit Internal+ loc.missingInvokes = Set.toList (@stmts.gathMissingInvokes `Set.difference` @clauses.gathMissingInvokes)+ +errs2 = Seq.fromList (map (\(nm,vs) -> Err_MissingVisit @pos nm vs) @loc.missingInvokes) Seq.><++SEM Clause | Clause+ loc.missingInvokes = Set.toList (@stmts.gathMissingInvokes `Set.difference` @next.gathMissingInvokes)+ +errs2 = Seq.fromList (map (\(nm,vs) -> Err_MissingVisit @pos nm vs) @loc.missingInvokes) Seq.><++--+-- Propagate default-stmts in scope+--++ATTR AllCodeBlocks ImplStmts ImplStmt [ distDeflStmts : {Map Ident (Bool,Maybe Int)} | | ]+ATTR Stmts Stmt [ | | gathDeflStmts USE {`Map.union`} {Map.empty} : {Map Ident (Bool,Maybe Int)} ]++SEM Program | Program blocks.distDeflStmts = Map.empty+SEM Item | Sem CoSem first.distDeflStmts = Map.empty+SEM DataSem | Sem clauses.distDeflStmts = Map.empty++SEM Stmt | Default loc.codeId : UNIQUEREF codeIdCounter+ loc.mbCodeId = if @mbCode.isJust then Just @loc.codeId else Nothing+ lhs.gathDeflStmts = Map.singleton @name (@allowEmpty,@mbCodeId)+SEM SemVisit | Visit Internal loc.distDeflStmts = @stmts.gathDeflStmts `Map.union` @lhs.distDeflStmts+SEM Clause | Clause loc.distDeflStmts = @stmts.gathDeflStmts `Map.union` @lhs.distDeflStmts++ATTR AllCodeBlocks [ | codeIdCounter : Int | ]+SEM Program | Program blocks.codeIdCounter = 1++SEM Stmt | Default+ +errs1 = if Map.findWithDefault (@allowEmpty,@mbCodeId) @name @lhs.distDeflStmts /= (@allowEmpty,@mbCodeId)+ then (Err_AmbDefault @pos @name Seq.<|)+ else id++--+-- Gather visit starts and ends in lexical order+--++ATTR AllCodeBlocks [ | | gathVisitStarts, gathVisitEnds USE {Seq.><} {Seq.empty} : {Seq DepItem} ]+SEM SemVisit | Visit Internal+ +gathVisitStarts = @loc.scopeDep Seq.<|+ +gathVisitEnds = @loc.visitEndDep Seq.<|++--+-- Gather semantics starts and ends (in lexical order)+--++ATTR AllCodeBlocks [ | | gathSemStarts USE {Seq.><} {Seq.empty} : {Seq DepItem} ]+SEM SemVisit | Visit+ +gathSemStarts = if @lhs.visitNr == 1+ then (@loc.scopeDep Seq.<|)+ else id+++--+-- Determine visit start rank+--++ATTR AllVisitClauses [ | | gathVisRankMap USE {`mappend`} {mempty} : {IntMap Ident} ]+ATTR AllVisitClauses Stmts Stmt ImplStmts ImplStmt [ distVisRankMap : {IntMap Ident} | | ]++SEM SemVisit | Visit Internal+ +gathVisRankMap = IntMap.insert @loc.rank @name++SEM Item | Sem CoSem first.distVisRankMap = @first.gathVisRankMap+SEM DataSem | Sem clauses.distVisRankMap = @clauses.gathVisRankMap++SEM Stmt | * loc.destVisit = getDestVisit @loc.rank @lhs.distVisRankMap+SEM ImplStmt | * loc.destVisit = getDestVisit @loc.rank @lhs.distVisRankMap++{+getDestVisit :: Int -> IntMap Ident -> Ident+getDestVisit rank ranks+ = maybe (ident "unknownDestVisit") fst mbMax+ where (smaller, _) = IntMap.split rank ranks+ mbMax = IntMap.maxView smaller+}++--+-- Cyclic visit information+--++{+type CycVisMap = Map Ident (Set Ident)+}++ATTR BlocksTop Blocks Block Itf [ | | gathCycVisMap USE {`Map.union`} {Map.empty} : CycVisMap ]+ATTR ItfVisits ItfVisit [ | | gathCycVisits USE {`Set.union`} {Set.empty} : {Set Ident}]+ATTR Attrs Attr [ visCyclic : Bool | | ]+ATTR AllFinal [ distCycVisMap : CycVisMap | | ]++SEM ItfVisit | Visit lhs.gathCycVisits = if @cyclic then Set.singleton @name else Set.empty+ loc.visCyclic = @cyclic+SEM Itf | Itf lhs.gathCycVisMap = Map.singleton @name @visits.gathCycVisits+SEM Program | Program blocks.distCycVisMap = @blocks.gathCycVisMap++ATTR SemVisit ClausesTop Clauses Clause Stmts Stmt ImplStmts ImplStmt [ fullCyclicVisits : {Set Ident} | | ]+ATTR SemVisit ClausesTop Clauses Clause [ fullCyclic : Bool | | ]++SEM Item | Sem CoSem first.fullCyclicVisits = Map.findWithDefault Set.empty @tp @lhs.distCycVisMap+ first.fullCyclic = False+SEM DataSem | Sem clauses.fullCyclicVisits = Map.findWithDefault Set.empty @tp @lhs.distCycVisMap+ clauses.fullCyclic = False++SEM SemVisit | Visit+ loc.fullCyclic = Set.member @name @lhs.fullCyclicVisits+ loc.allowCycles = @cyclic || @lhs.fullCyclic++SEM SemVisit | Internal -- may not occur in a full cyclic visit+ loc.fullCyclic = False+ loc.allowCycles = @cyclic+ +errs3 = if @lhs.fullCyclic+ then (Err_InternalInCyclic @pos @name Seq.<|)+ else id++ATTR SemVisit ClausesTop Clauses Clause [ | | gathAllowCycVisits USE {`mappend`} {mempty} : {Set Ident} ]+ATTR SemVisit ClausesTop Clauses Clause Stmts Stmt ImplStmts ImplStmt [ allowCycVisits : {Set Ident} | | ]++SEM Item | Sem CoSem first.allowCycVisits = @first.gathAllowCycVisits+SEM DataSem | Sem clauses.allowCycVisits = @clauses.gathAllowCycVisits+SEM SemVisit | Visit +gathAllowCycVisits = if @loc.allowCycles then Set.insert @name else id+ | Internal +gathAllowCycVisits = if @loc.allowCycles then Set.insert @loc.name else id++SEM Stmt | * loc.fullCyclic = Set.member @loc.destVisit @lhs.fullCyclicVisits + loc.allowCycles = Set.member @loc.destVisit @lhs.allowCycVisits+SEM ImplStmt | * loc.fullCyclic = Set.member @loc.destVisit @lhs.fullCyclicVisits+ loc.allowCycles = Set.member @loc.destVisit @lhs.allowCycVisits++SEM Stmt | Invoke+ loc.visitCyclic = Set.member @visit (Map.findWithDefault Set.empty @loc.unqualChildItf @lhs.distCycVisMap)+ loc.behaveCyclic = @loc.fullCyclic || @loc.visitCyclic++SEM ImplStmt | Invoke+ loc.visitCyclic = Set.member @visit (Map.findWithDefault Set.empty @itf @lhs.distCycVisMap)+ loc.behaveCyclic = @loc.fullCyclic || @loc.visitCyclic++-- sanity check+SEM Stmt+ | Eval +errs5 = if @loc.isCyclic && @mode.isMatch+ then (Err_MatchCyclic @loc.pos Seq.<|)+ else id+ +errs5 = if @loc.isCyclic && not @code.isFun+ then (Err_EffCyclic @loc.pos Seq.<|)+ else id+ | Attach +errs5 = if @loc.isCyclic && @code.isJust && not @code.isFun+ then (Err_EffCyclic @pos Seq.<|)+ else id+ | Invoke +errs5 = if @loc.isCyclic && @code.isJust && not @code.isFun+ then (Err_EffCyclic @pos Seq.<|)+ else id+ | Default +errs5 = if @loc.isCyclic && @mbCode.isJust && not @mbCode.isFun+ then (Err_EffCyclic @pos Seq.<|)+ else id++SEM Stmt | Invoke+ +errs5 = if @loc.isCyclic && not @loc.visitCyclic+ then (Err_VisExpCyclic @visit @name Seq.<|)+ else id+ +errs5 = if @code.isJust && @loc.isCyclic+ then (Err_IterCyclic @pos Seq.<|)+ else id++SEM ImplStmt | Invoke+ +errs5 = if @loc.isCyclic && not @loc.visitCyclic+ then (Err_VisExpCyclic @visit @child Seq.<|)+ else id++SEM SemVisit | Visit Internal+ loc.nClauses = Set.size @clauses.gathClauseNames+ +errs1 = if @loc.fullCyclic && @loc.nClauses /= 1 && not @lhs.withinCoSem+ then (Err_ClausesCyclic @pos @name @loc.nClauses Seq.<|)+ else id++ATTR ClausesTop Clauses [ | | nClauses : Int ]+SEM Clauses+ | Cons +nClauses = (+1)+ | Nil lhs.nClauses = 0++ATTR MaybeBoundCode BoundCode Bind [ | | isFun : Bool ]+SEM Bind+ | Fun lhs.isFun = True+ | Monadic lhs.isFun = False++SEM MaybeBoundCode | Nothing lhs.isFun = False++-- Visits to avoid+ATTR AllCodeBlocks [ | | gathAvoidVisits USE {`Set.union`} {Set.empty} : {Set DepItem} ]+SEM SemVisit | Visit+ +gathAvoidVisits = if @loc.fullCyclic+ then Set.insert @loc.visitEndDep+ else id++-- What item belongs to what visit+ATTR AllFinal [ | | gathItemVisits USE {`Map.union`} {Map.empty} : {Map DepItem DepItem} ]+SEM SemVisit | Visit Internal +gathItemVisits = Map.insert @loc.scopeDep @loc.scopeDep+SEM Clause | Clause +gathItemVisits = Map.insert @loc.scopeDep @lhs.visitBeginDep+SEM Stmt | * +gathItemVisits = Map.insert @loc.stmtSource @lhs.visitBeginDep+SEM ImplStmt | * +gathItemVisits = Map.insert @loc.stmtSource @lhs.visitBeginDep++ATTR AllFinal [ | | gathLegalCycStmts USE {`Set.union`} {Set.empty} : {Set DepItem} ]+SEM Stmt | * +gathLegalCycStmts = if @loc.allowCycles then Set.insert @loc.stmtSource else id+SEM ImplStmt | * +gathLegalCycStmts = if @loc.allowCycles then Set.insert @loc.stmtSource else id+++--+-- Dependency analysis+--++-- Dependable items and their ordening+{+unknDepItem :: DepItem+unknDepItem = DepVisStart [ident "errorunknown"]+}++-- Pass down the source of a statement+ATTR AllFinal [ stmtSource : DepItem | | ]++SEM Program | Program blocks.stmtSource = DepMatch (-999)+SEM Stmt+ | Eval loc.stmtSource = if @mode.isMatch then DepMatch @loc.lexOrder else DepAssert @loc.lexOrder+ | Default loc.stmtSource = DepDefault @loc.codeId+ | Attach loc.stmtSource = DepAttach @loc.lexOrder+ | Invoke loc.stmtSource = DepInvoke (@visit : @name : @lhs.basename)+ | Rename loc.stmtSource = DepAssert @loc.lexOrder++SEM ImplStmt+ | Invoke loc.stmtSource = DepInvoke (@visit : @child : @lhs.basename)+ | DefaultChild DefaultSyn DefaultVisLocal+ loc.stmtSource = DepAssert @loc.lexOrder++ATTR AllFinal [ | | gathStmtPosMap USE {`Map.union`} {Map.empty} : {Map DepItem Pos} ]+SEM Stmt | Eval loc.pos = @code.pos+SEM Stmt | * +gathStmtPosMap = Map.insert @loc.stmtSource @pos+SEM ImplStmt | * +gathStmtPosMap = Map.insert @loc.stmtSource @pos++ATTR Pats Pat BoundCode [ | | pos : Pos ]+SEM Pat | Con lhs.pos = identPos @name+ | AttrCon lhs.pos = identPos @dt+ | Attr lhs.pos = identPos @child+ | Tup lhs.pos = @pats.pos+ | List lhs.pos = @pats.pos+ | Cons lhs.pos = @hd.pos+ | Underscore lhs.pos = @pos+SEM Pats | Cons lhs.pos = @hd.pos+ | Nil lhs.pos = noPos+SEM BoundCode | Code lhs.pos = @pos++-- Determines: "Where is each attribute defined? What is its source?"+{+type AttrSourceMap = Map (Bool,Ident,Ident) DepItem -- Bool: True = inherited attr+}++ATTR AllFinal [ distAttrSource : AttrSourceMap | | ]+ATTR AllVisFinal [ | | gathAttrSource USE {`Map.union`} {Map.empty} : AttrSourceMap ]+ATTR AllVisitClauses [ | | gathSemAttrSource USE {`Map.union`} {Map.empty} : AttrSourceMap ] -- global to entire SEM++SEM Program | Program blocks.distAttrSource = Map.empty+SEM SemVisit | Visit loc.distAttrSource = Map.unions [ @loc.gathChnAttrSource+ , @stmts.gathAttrSource+ , @loc.gathVisAttrSource+ , @impls.gathAttrSource+ , @lhs.distAttrSource ]+SEM SemVisit | Internal loc.distAttrSource = Map.unions [ @stmts.gathAttrSource+ , @impls.gathAttrSource+ , @lhs.distAttrSource ]+SEM Clause | Clause loc.distAttrSource = Map.unions [ @stmts.gathAttrSource+ , @deflts.gathAttrSource+ , @impls.gathAttrSource+ , @lhs.distAttrSource ]++SEM SemVisit | Visit+ loc.gathChnAttrSource = Map.fromList [ ((True,visIdent,attr), @loc.scopeDep) | attr <- Map.keys @attrs.gathVisitLocalAttrs ]+ loc.gathVisAttrSource = Map.fromList [ ((False,@name,attr), @loc.visitEndDep) | attr <- Map.keys @attrs.gathVisitLocalAttrs ]++-- soures of lhs-inherited attributes+SEM Item | Sem CoSem+ loc.inhAttrMap = Map.findWithDefault Map.empty @tp @lhs.distVisitInhAttrs+ loc.inhAttrSource = Map.fromList [ ((True,lhsIdent,attr), DepVisStart (visit : @loc.semBasename))+ | (visit,mp) <- Map.assocs @loc.inhAttrMap, attr <- Map.keys mp ]+ first.distAttrSource = Map.union @loc.inhAttrSource @lhs.distAttrSource++SEM DataSem | Sem+ loc.inhAttrMap = Map.findWithDefault Map.empty @tp @lhs.distVisitInhAttrs+ loc.inhAttrSource = Map.fromList [ ((True,lhsIdent,attr), DepVisStart (visit : @loc.semBasename))+ | (visit,mp) <- Map.assocs @loc.inhAttrMap, attr <- Map.keys mp ]+ clauses.distAttrSource = Map.union @loc.inhAttrSource @lhs.distAttrSource++SEM Stmt | Invoke -- child visit+ +gathAttrSource = Map.union $ Map.fromList [ ((False,@name,attr), @loc.stmtSource) | attr <- Map.keys @loc.synAttrMap ]++SEM ImplStmt | Invoke -- child visit+ +gathAttrSource = Map.union $ Map.fromList [ ((False,@child,attr), @loc.stmtSource) | attr <- Map.keys @loc.synAttrMap ]++SEM AttrTypePat | VisLocal ProdLocal Lhs+ +gathAttrSource = Map.insert (False,@lhs.child,@lhs.name) @lhs.stmtSource+SEM AttrTypePat | Child Visit+ +gathAttrSource = Map.insert (True,@lhs.child,@lhs.name) @lhs.stmtSource++SEM ImplStmt+ | DefaultSyn +gathAttrSource = Map.insert (False,lhsIdent,@name) @loc.stmtSource+ | DefaultChild +gathAttrSource = Map.insert (True,@child,@name) @loc.stmtSource+ | DefaultVisLocal +gathAttrSource = Map.insert (False,visIdent,@name) @loc.stmtSource++SEM Pat | AttrCon+ loc.isLoc = @name == locIdent || @loc.childItf == locQIdent+ +gathAttrSource = Map.union (Map.fromList [ ((not @loc.isLoc, @name, nm), @lhs.stmtSource) | (nm,_) <- @loc.fields ])++-- Determines: "Where is each child defined. What is its start visit?"+{+type ChildSourceMap = Map Ident (Map Ident DepItem)+}++ATTR AllFinal [ distChildSource : ChildSourceMap | | ]+ATTR AllVisFinal [ | | gathChildSource USE {`unionWithUnion`} {Map.empty} : ChildSourceMap ]++SEM Program | Program blocks.distChildSource = Map.empty+SEM SemVisit | Visit Internal+ loc.distChildSource = Map.unionsWith mappend [ @stmts.gathChildSource+ , Map.filterWithKey (notIn @loc.introChildren) @lhs.distChildSource ]+SEM Clause | Clause+ loc.distChildSource = Map.unionsWith mappend [ @stmts.gathChildSource+ , Map.filterWithKey (notIn @loc.introChildren) @lhs.distChildSource ]++SEM Stmt | Attach+ +gathChildSource = Map.insertWith mappend @name (Map.singleton @loc.visit @loc.stmtSource)++-- Determines: "Where is each invoke defined?"+{+type VisitSourceMap = Map Ident (Map Ident DepItem)+}++ATTR AllFinal [ distVisitSource : VisitSourceMap | | ]+ATTR AllVisFinal [ | | gathVisitSource USE {`unionWithUnion`} {Map.empty} : VisitSourceMap ]++SEM Program | Program blocks.distVisitSource = Map.empty+SEM SemVisit | Visit Internal+ loc.distVisitSource = Map.unionsWith mappend [ @stmts.gathVisitSource+ , Map.filterWithKey (notIn @loc.introChildren) @lhs.distVisitSource ]++SEM Clause | Clause+ loc.distVisitSource = Map.unionsWith mappend [ @stmts.gathVisitSource+ , @impls.gathVisitSource+ , Map.filterWithKey (notIn @loc.introChildren) @lhs.distVisitSource ]++SEM Stmt | Invoke+ +gathVisitSource = Map.insertWith mappend @name (Map.singleton @visit @loc.stmtSource)++SEM ImplStmt | Invoke+ +gathVisitSource = Map.insertWith mappend @child (Map.singleton @visit @loc.stmtSource)++-- Context: in what clause or visit are we in scope?+ATTR AllFinal [ scopeReason, visitEndReason : Reason scopeDep, visitBeginDep, visitEndDep : DepItem | | ]+SEM Program | Program+ blocks.scopeReason = ReasonScopeVisit (ident "<root>")+ blocks.scopeDep = DepVisStart [ident "<root>"]+ blocks.visitBeginDep = DepVisStart [ident "<root>"]+ blocks.visitEndDep = DepVisEnd [ident "<root>"]+ blocks.visitEndReason = ReasonScopeEnd (ident "<root>")++SEM SemVisit | Visit+ loc.scopeReason = ReasonScopeVisit @name+ loc.scopeDep = DepVisStart (@name : @lhs.semBasename)+ loc.visitBeginDep = DepVisStart (@name : @lhs.semBasename)+ loc.visitEndDep = DepVisEnd (@name : @lhs.semBasename)+ loc.visitEndReason = ReasonScopeEnd @name++SEM SemVisit | Internal+ loc.scopeReason = ReasonScopeVisit @name+ loc.scopeDep = DepVisStart (@loc.name : @lhs.semBasename)+ loc.visitBeginDep = DepVisStart (@loc.name : @lhs.semBasename)+ loc.visitEndDep = DepVisEnd (@loc.name : @lhs.semBasename)+ loc.visitEndReason = ReasonScopeEnd @name++SEM Clause | Clause+ loc.scopeReason = ReasonScopeClause @name+ loc.scopeDep = DepClause @loc.basename++-- Gather dependencies+{+data Dep = Dep !DepItem !Reason !([DepItem])+ deriving (Eq,Ord,Show)++type Deps = Seq Dep++addDep :: DepItem -> Reason -> [DepItem] -> Deps -> Deps+addDep item reason deps = (Seq.<|) (Dep item reason deps)++unknDep :: Dep+unknDep = Dep unknDepItem ReasonError [unknDepItem]+}++ATTR AllFinal [ | | gathDeps USE {Seq.><} {Seq.empty} : Deps ]++-- dependency on source of attr+SEM AttrTypeCode | VisLocal ProdLocal Lhs Child Visit+ +gathDeps = addDep @lhs.stmtSource (ReasonAttrReq @lhs.child @lhs.name) [@loc.attrDep]+ loc.attrDep = Map.findWithDefault (mkUnknownDep @loc.depKey) @loc.depKey @lhs.distAttrSource++SEM AttrTypeCode | VisLocal Lhs+ loc.depKey = (True,@lhs.child,@lhs.name)++SEM AttrTypeCode | Child Visit ProdLocal+ loc.depKey = (False,@lhs.child,@lhs.name)++{+mkUnknownDep :: Show a => a -> DepItem+mkUnknownDep s = DepVisStart [ident ("unknown" ++ show s)]+}++-- dependency on syn and vis attrs of visit. Must be defined before visit end.+SEM Clause | Clause -- lhs.scopeDep is identifier of visit+ +gathDeps = if @loc.isDeepest+ then (Seq.fromList [ Dep @lhs.visitEndDep (ReasonAttrReq lhsIdent attr) + [Map.findWithDefault (trace ("Clause.Clause.unknown.syn: " ++ show (attr, @loc.distAttrSource) ) unknDepItem) (False,lhsIdent,attr) @loc.distAttrSource]+ | attr <- Map.keys @loc.synAttrMap ] Seq.><)+ else id+ +gathDeps = if @loc.isDeepest+ then (Seq.fromList [ Dep @lhs.visitEndDep (ReasonAttrReq visIdent attr) + [Map.findWithDefault (trace "Clause.Clause.unknown.loc" unknDepItem) (False,visIdent,attr) @loc.distAttrSource]+ | attr <- Map.keys @lhs.localAttrs ] Seq.><)+ else id++SEM Stmt | * -- dependency on start of visit or clause+ +gathDeps = addDep @loc.stmtSource @lhs.scopeReason [@lhs.scopeDep]++SEM ImplStmt | * -- dependency on start of visit or clause+ +gathDeps = addDep @loc.stmtSource @lhs.scopeReason [@lhs.scopeDep]++SEM ImplStmt | DefaultChild DefaultSyn -- dependency on default stmt if reference to code+ +gathDeps = case @mbCodeRef of+ Nothing -> id+ Just ref -> addDep @loc.stmtSource (ReasonDefault @name) [DepDefault ref]++SEM Stmt | Eval -- dependency: must be before end of visit for match statements+ +gathDeps = if @mode.isMatch+ then addDep @lhs.visitEndDep @lhs.visitEndReason [@loc.stmtSource]+ else id++SEM Stmt | Invoke -- depends on: * previous invokes, nearest child, and defs for inh attrs+ loc.mbVisitSource = nearestVisitEntry False @visit @loc.childVisits $ Map.findWithDefault Map.empty @name @lhs.distVisitSource+ loc.mbChildSource = nearestVisitEntry True @visit @loc.childVisits $ Map.findWithDefault Map.empty @name @lhs.distChildSource+ +gathDeps = case @loc.mbVisitSource of+ Nothing -> id+ Just (_,d) -> addDep @loc.stmtSource (ReasonInvokeReq @visit) [d]+ +gathDeps = case @loc.mbChildSource of+ Nothing -> id+ Just (_,d) -> addDep @loc.stmtSource (ReasonChildReq @name) [d]+ +gathDeps = Seq.fromList [ Dep @loc.stmtSource (ReasonAttrReq @name attr)+ [Map.findWithDefault (trace "Stmt.Invoke.unknown.inh" unknDepItem) (True,@name,attr) @lhs.distAttrSource]+ | attr <- Map.keys @loc.inhAttrMap ] Seq.><+ +gathDeps = addDep @lhs.visitEndDep @lhs.visitEndReason [@loc.stmtSource]++SEM ImplStmt | Invoke -- depends on: * previous invokes, nearest child, and defs for inh attrs+ loc.mbVisitSource = nearestVisitEntry False @visit @loc.childVisits $ Map.findWithDefault Map.empty @child @lhs.distVisitSource+ loc.mbChildSource = nearestVisitEntry True @visit @loc.childVisits $ Map.findWithDefault Map.empty @child @lhs.distChildSource+ +gathDeps = case @loc.mbVisitSource of+ Nothing -> id+ Just (_,d) -> addDep @loc.stmtSource (ReasonInvokeReq @visit) [d]+ +gathDeps = case @loc.mbChildSource of+ Nothing -> id+ Just (_,d) -> addDep @loc.stmtSource (ReasonChildReq @child) [d]+ +gathDeps = Seq.fromList [ Dep @loc.stmtSource (ReasonAttrReq @child attr)+ [Map.findWithDefault (trace "ImplStmt.Invoke.unknown.inh" unknDepItem) (True,@child,attr) @lhs.distAttrSource]+ | attr <- Map.keys @loc.inhAttrMap ] Seq.><+ -- +errs2 = debugMsg ("Impl invoke: " ++ show @child ++ ", visit: " ++ show @visit ++ ", inh attrs: " ++ show @loc.inhAttrMap ++ "\nsource: " ++ show @lhs.distAttrSource) Seq.><++{+nearestVisitEntry :: Bool -> Ident -> [Ident] -> Map Ident DepItem -> Maybe (Ident,DepItem)+nearestVisitEntry inclusive vis order mp+ = case [ (b, Map.findWithDefault (trace "nearestVisitEntry.unknown" unknDepItem) b mp) | b <- befores, Map.member b mp ] of+ [] -> Nothing+ (e:_) -> Just e+ where+ entries = Map.assocs mp+ befores = reverse $ (takeWhile (/= vis) order ++ (if inclusive then [vis] else []))+}++-- deal with previous attach+SEM Stmt | Attach+ loc.childSources = Map.findWithDefault Map.empty @name @lhs.distChildSource+ loc.mbPrevEntry = nearestVisitEntry False @loc.visit @loc.childVisits @loc.childSources+ +gathDeps = case @loc.mbPrevEntry of+ Nothing -> id+ Just (_,d) -> addDep @loc.stmtSource (ReasonAttach @name @loc.visit) [d]++-- deal with detach+SEM Item | Detach -- depends on: prev visits and children+ loc.mbVisitSource = nearestVisitEntry False @visit @loc.childVisits $ Map.findWithDefault Map.empty @name @lhs.distVisitSource+ loc.mbChildSource = nearestVisitEntry False @visit @loc.childVisits $ Map.findWithDefault Map.empty @name @lhs.distChildSource+ +gathDeps = case @loc.mbVisitSource of+ Nothing -> id+ Just (_,d) -> addDep @lhs.stmtSource (ReasonDetach @name @visit) [d]+ +gathDeps = case @loc.mbChildSource of+ Nothing -> id+ Just (_,d) -> addDep @lhs.stmtSource (ReasonDetach @name @visit) [d]++SEM SemVisit | Visit -- depends on end of prev visit, end depends on begin+ +gathDeps = if null @lhs.doneVisits+ then id+ else addDep @loc.scopeDep @lhs.visitEndReason [@lhs.visitEndDep]++ +gathDeps = addDep @loc.visitEndDep (ReasonScopeVisit @name) [@loc.scopeDep]++SEM SemVisit | Internal -- depends on end of prev visit, end depends on begin+ +gathDeps = addDep @loc.scopeDep @lhs.visitEndReason [@lhs.visitEndDep]+ +gathDeps = addDep @loc.visitEndDep (ReasonScopeVisit @name) [@loc.scopeDep]++SEM Clause | Clause -- should be in between visit start and end+ +gathDeps = addDep @loc.scopeDep @lhs.scopeReason [@lhs.scopeDep]+ +gathDeps = addDep @lhs.visitEndDep @lhs.visitEndReason [@loc.scopeDep]++SEM ImplStmt | DefaultChild DefaultSyn -- depend on generated stmt+ +gathDeps = case @mbCodeRef of+ Nothing -> id+ Just ref -> addDep @loc.stmtSource (ReasonDefault @name) [DepDefault ref]++SEM ImplStmt | DefaultVisLocal -- may not escape visit+ +gathDeps = addDep @lhs.visitEndDep @lhs.visitEndReason [@loc.stmtSource]++SEM ImplStmt -- depend on children + inh attrs+ | DefaultChild DefaultSyn+ +gathDeps = if @loc.lhsHasAttr+ then addDep @loc.stmtSource (ReasonAttrReq lhsIdent @name)+ [Map.findWithDefault (trace "ImplStmt.Default.lhsinh" unknDepItem) (True,lhsIdent,@name) @lhs.distAttrSource]+ else id+ +gathDeps = Seq.fromList [ Dep @loc.stmtSource (ReasonAttrReq c a)+ [Map.findWithDefault (trace "ImplStmt.Default.childsyn" unknDepItem) (False,c,a) @lhs.distAttrSource]+ | (c,a) <- @loc.childAttrs ] Seq.><+ -- +errs2 = debugMsg ("dependencies: " ++ show @loc.stmtSource ++ ", attr: " ++ show @name ++ ", children: " ++ show @loc.children) Seq.><++ATTR AllFinal [ distRanks : {Map DepItem (Bool,Int)} | | ]++SEM Program | Program+ loc.unqDeps = Map.fromListWith (\(r1,as) (r2,bs) -> (mostDescriptiveReason r1 r2,nub (as ++ bs)))+ [ (from, (reason,tos)) | (Dep from reason tos) <- toList @blocks.gathDeps ]+ `Map.union`+ (Map.fromList [ (i, (ReasonSink,[])) | i <- @loc.unqItems ])+ loc.unqItems = Set.toList $ Set.fromList $ concatMap (\(Dep from _ tos) -> from : tos) $ toList @blocks.gathDeps+ loc.components = analyze (toList @blocks.gathSemStarts) (toList @blocks.gathVisitStarts) (toList @blocks.gathVisitEnds) @blocks.gathAvoidVisits $+ map (\(from,(reason,tos)) -> (reason,from,tos)) $ Map.assocs @unqDeps+ loc.distRanks = let merge rank (AcyclicSCC d) = [(d,(False,rank))]+ merge rank (CyclicSCC ps) = zip ps (repeat (True,rank))+ mp = Map.fromList $ concat $ zipWith merge [1..] @loc.components+ in mp+ + loc.cyclicComps = let isCyclicSCC (CyclicSCC _) = True+ isCyclicSCC _ = False+ fromCyclicSCC (CyclicSCC xs) = xs+ in [ fromCyclicSCC c | c <- @loc.components, isCyclicSCC c ]+ loc.cyclicItems = Set.fromList $ concat @loc.cyclicComps+ loc.cyclicErrComps = let isLegalComp items+ = length vis <= 1 && all isLegal items && any isInvoke items+ where vis = nub [ Map.findWithDefault item item @blocks.gathItemVisits | item <- items ]+ + isLegal (DepClause _) = True+ isLegal (DepVisStart _) = True+ isLegal (DepVisEnd _) = True+ isLegal item = Set.member item @blocks.gathLegalCycStmts+ + isInvoke (DepInvoke _) = True+ isInvoke _ = False+ in filter (not . isLegalComp) @loc.cyclicComps++ +errs4 = Seq.fromList (map (Err_Cyclic @lhs.pos @blocks.gathStmtPosMap) @loc.cyclicErrComps) Seq.><++{+mostDescriptiveReason r1 r2+ = case r2 of+ ReasonAttrReq _ _ -> r2+ _ -> r1++instance Show a => Show (SCC a) where+ show (CyclicSCC xs) = unwords (map show xs)+ show (AcyclicSCC x) = show x+}++ATTR Stmt ImplStmt [ | | rank : Int ]+ATTR Pats Pat [ isCyclic : Bool | | ]++SEM Stmt | *+ (loc.isOnCycle, loc.rank) = Map.findWithDefault (False,@loc.lexOrder) @loc.stmtSource @lhs.distRanks+ loc.isCyclic = @loc.fullCyclic || @loc.isOnCycle++SEM ImplStmt | *+ (loc.isOnCycle, loc.rank) = Map.findWithDefault (False,@loc.lexOrder) @loc.stmtSource @lhs.distRanks+ loc.isCyclic = @loc.fullCyclic || @loc.isOnCycle++SEM SemVisit | Visit Internal+ (loc.isOnCycle, loc.rank) = Map.findWithDefault (False,@loc.lexOrder) @loc.scopeDep @lhs.distRanks+ loc.isCyclic = @loc.fullCyclic || @loc.isOnCycle++SEM Clause | Clause+ (loc.isOnCycle, loc.rank) = Map.findWithDefault (False,@loc.lexOrder) @loc.scopeDep @lhs.distRanks+ loc.isCyclic = @lhs.fullCyclic || @loc.isOnCycle++-- Max rank of clauses+ATTR AllVisitClauses [ | | minRank USE {`min`} {maxBound} : Int ]++SEM Clause | Clause lhs.minRank = @loc.rank+SEM SemVisit | Visit Internal lhs.minRank = @loc.rank++--+-- Pretty-print of the AST+--++{+instance PP Ident where+ pp = text . identName+}++ATTR Block Itf ItfVisit Attr Data Type AliasType Con Field FieldType DataSem MaybeBoundCode BoundCode Code Item+ SemVisit VisitAttr Clause Stmt ImplStmt Mode Bind Pat ExprField+ [ | | pp : {PP_Doc} ]++SEM Program+ | Program loc.ppId = vlist @blocks.pps++SEM Block+ | Section lhs.pp = "{" >-< @code.pp >-< "}"+ | Itf lhs.pp = @itf.pp+ | Data lhs.pp = @data.pp+ | Type lhs.pp = @type.pp+ | Item lhs.pp = @name >#< "=" >-< indent 2 @item.pp+ | DataSem lhs.pp = @sem.pp++SEM Itf+ | Itf lhs.pp = "itf" >#< @name+ >-< indent 2 (vlist @visits.pps)++SEM ItfVisit+ | Visit lhs.pp = "visit" >#< @name >#< (if @cyclic then text "cyclic" else empty)+ >-< indent 2 (vlist @attrs.pps) ++SEM Attr+ | Inh lhs.pp = "inh" >#< @name >#< "::" >#< @type+ | Syn lhs.pp = "syn" >#< @name >#< "::" >#< @type++SEM Data | Data+ lhs.pp = "data" >#< @name >-< indent 2 ( vlist @cons.pps )++SEM Con | Con+ lhs.pp = "con" >#< @name >-< indent 2 (vlist @fields.pps)++SEM Field | Field+ lhs.pp = @name >#< @type.pp++SEM FieldType+ | Term lhs.pp = "::" >#< @type+ | Nonterm lhs.pp = ":" >#< show @name++SEM Type | Alias+ lhs.pp = "type" >#< show @name >#< ":" >#< @type.pp++SEM AliasType+ | Prod lhs.pp = pp_block "(" ")" "," (map (text . show) @fields)+ | List lhs.pp = pp_brackets (text $ show @type)+ | Maybe lhs.pp = "Maybe" >#< show @type++SEM DataSem | Sem+ lhs.pp = "datasem" >#< show @tp >-< indent 2 @clauses.pp++SEM BoundCode+ | Code lhs.pp = @bind.pp >#< @code.pp++SEM MaybeBoundCode+ | Nothing lhs.pp = empty++SEM Code+ | Code lhs.pp = vlist @items.pps++SEM Item+ | Plain loc.pp = vlist (modifySpacing @loc.diff @lhs.indent @txt)+ | Attr lhs.pp = addSpaces @loc.diff (@child >|< "." >|< @name)+ | Sem lhs.pp = addSpaces @loc.diff ("sem" >#< @name >#< ":" >#< @tp+ >-< indent 2 @first.pp)+ | CoSem lhs.pp = addSpaces @loc.diff ("cosem" >#< @name >#< ":" >#< @tp >#< @visit+ >-< indent 2 @first.pp)+ | Detach lhs.pp = addSpaces @loc.diff ("detach" >#< @name >#< "of" >#< @visit)+ | Brackets lhs.pp = addSpaces @loc.diff (text "{")+ >-< vlist @items.pps+ >-< addSpaces @loc.diff2 (text "}")+ | Construct lhs.pp = addSpaces @loc.diff (show @data >|< "." >|< show @con >#< pp_block "{" "}" "," @fields.pps)++ATTR Code Items Item ExprFields ExprField DataSem SemVisit Stmts ClausesTop Clauses Clause Stmt+ [ indent : Int | | ]++SEM Block | Section code.indent = 1+ | Item item.indent = 1+ | DataSem sem.indent = 1+SEM BoundCode | Code code.indent = column @pos + @bind.width++SEM Item+ | * loc.diff = column @pos - @lhs.indent+ | Brackets loc.diff2 = column @posEnd - @lhs.indent++{+modifySpacing :: Int -> Int -> String -> [String]+modifySpacing n m s+ = take (length ls) (r : rs)+ where+ ls = lines s+ (f : fs) = ls ++ [""]+ r = shift n f+ rs = map (drop (m-1)) fs+ +shift :: Int -> String -> String+shift n+ | n <= 0 = drop n+ | n > 0 = (replicate n ' ' ++)++addSpaces :: Int -> PP_Doc -> PP_Doc+addSpaces n d = text (replicate n ' ') >|< d+}++SEM SemVisit+ | Visit lhs.pp = "visit" >#< @name+ >-< indent 2 ( vlist @attrs.pps+ >-< vlist @stmts.pps+ >-< vlist @impls.pps+ >-< vlist @clauses.pps+ )+ | Internal lhs.pp = "internal" >#< @name+ >-< indent 2 ( vlist @stmts.pps+ >-< vlist @clauses.pps+ )+ | End lhs.pp = empty++SEM VisitAttr+ | Chn lhs.pp = "chn" >#< @name >#< "::" >#< @type++SEM Clause+ | Clause lhs.pp = "clause" >#< @name+ >-< indent 2 ( vlist @stmts.pps+ >-< vlist @impls.pps+ >-< vlist @deflts.pps+ >-< @next.pp+ )++SEM Stmt+ | Eval lhs.pp = @mode.pp >|< @pat.pp >#< @code.pp+ | Attach lhs.pp = "attach" >#< @loc.visit >#< "of" >#< @name >#< ":" >#< @type >#< @code.pp+ | Invoke lhs.pp = vlist @deflts.pps+ >-< "invoke" >#< @visit >#< "of" >#< @name >#< @code.pp+ | Default lhs.pp = "default" >#< @name >#< "..."+ | Rename lhs.pp = empty++SEM ImplStmt+ | Invoke lhs.pp = vlist @deflts.pps+ >-< "invoke" >#< show @visit >#< "of" >#< show @child >#< "-- implicit"+ | DefaultChild lhs.pp = "default" >#< show @child >|< "." >|< show @name >#< pp_block "(" ")" "," (reverse @loc.ppInps)+ | DefaultSyn lhs.pp = "default lhs." >|< show @name >#< pp_block "(" ")" "," (reverse @loc.ppInps)+ | DefaultVisLocal+ lhs.pp = "default local." >|< show @name+ + | DefaultChild DefaultSyn+ loc.ppInps = (if @loc.lhsHasAttr then [text "lhs"] else []) ++ map (\(c,_,_) -> text $ show c) @loc.children++SEM Mode+ | Match lhs.pp = text "match "+ | Assert lhs.pp = empty++SEM Bind+ | Fun lhs.pp = text "="+ | Monadic lhs.pp = text "<-"++ATTR Bind [ | | width : Int ]+SEM Bind+ | Fun lhs.width = 1+ | Monadic lhs.width = 2++SEM Pat+ | Con loc.needPar = needParens PrioCon @lhs.prio @lhs.isRight+ | Cons loc.needPar = needParens PrioCons @lhs.prio @lhs.isRight++SEM Pat+ | Con lhs.pp = addParens @loc.needPar (@name >#< hlist_sp @pats.pps)+ | AttrCon lhs.pp = show @dt >|< "." >|< show @con >|< "@" >|< @name+ | Attr lhs.pp = @child >|< "." >|< @name+ | Tup lhs.pp = pp_block "(" ")" "," @pats.pps+ | List lhs.pp = pp_block "[" "]" "," @pats.pps+ | Cons lhs.pp = addParens @loc.needPar (@hd.pp >#< ":" >#< @tl.pp)+ | Underscore lhs.pp = text "_"++ATTR Pat Pats [ prio : Prio | | ]+ATTR Pat [ isRight : Bool | | ]++SEM Stmt | Eval pat.prio = PrioTop+ pat.isRight = False++SEM Pat+ | Con pats.prio = PrioCon+ | Tup pats.prio = PrioTop+ | List pats.prio = PrioTop+ | Cons hd.prio = PrioCons+ tl.prio = PrioCons++SEM Pats | Cons hd.isRight = False++SEM Pat+ | Cons hd.isRight = False+ tl.isRight = True++{+data Prio+ = PrioTop | PrioCons | PrioCon+ deriving (Eq, Ord)++needParens :: Prio -> Prio -> Bool -> Bool+needParens myPrio lhsPrio isRight = myPrio <= lhsPrio && (myPrio /= lhsPrio || isRight)++addParens :: Bool -> PP_Doc -> PP_Doc+addParens True = pp_parens+addParens False = id+}++SEM ExprField | Field+ lhs.pp = @name >-< indent 2 ("=" >#< pp_parens @code.pp)++ATTR BlocksTop Blocks ItfVisits Attrs Items VisitAttrs ClausesTop Clauses Stmts ImplStmts Pats Cons Fields ExprFields+ [ | | pps : {[PP_Doc]} ]++SEM BlocksTop+ | Top lhs.pps = @blocks.pps ++ @extra.pps+ | None lhs.pps = []++SEM Blocks+ | Cons lhs.pps = @hd.pp : @tl.pps+ | Nil lhs.pps = []++SEM ItfVisits+ | Cons lhs.pps = @hd.pp : @tl.pps+ | Nil lhs.pps = []++SEM Attrs+ | Cons lhs.pps = @hd.pp : @tl.pps+ | Nil lhs.pps = []++SEM Cons+ | Cons lhs.pps = @hd.pp : @tl.pps+ | Nil lhs.pps = []++SEM Fields+ | Cons lhs.pps = @hd.pp : @tl.pps+ | Nil lhs.pps = []++SEM Items+ | Cons lhs.pps = @hd.pp : @tl.pps+ | Nil lhs.pps = []++SEM VisitAttrs+ | Cons lhs.pps = @hd.pp : @tl.pps+ | Nil lhs.pps = []++SEM Clauses+ | Cons lhs.pps = @hd.pp : @tl.pps+ | Nil lhs.pps = []++SEM Stmts+ | Cons lhs.pps = @hd.pp : @tl.pps+ | Nil lhs.pps = []++SEM ImplStmts+ | Cons lhs.pps = @hd.pp : @tl.pps+ | Nil lhs.pps = []++SEM Pats+ | Cons lhs.pps = @hd.pp : @tl.pps+ | Nil lhs.pps = []++SEM ExprFields+ | Cons lhs.pps = @hd.pp : @tl.pps+ | Nil lhs.pps = []
+ uuagc_options view
@@ -0,0 +1,8 @@+file: "src/Ast.ag" +options: data, rename, strictdata + +file: "src/Transform.ag" +options: catas, rename, semfuns, signatures, pretty, strictwrap + +file: "src/Errs.ag" +options: data, rename, catas, semfuns, signatures, optimize, strictdata, strictwrap