diff --git a/dist/build/Language/Lua/Annotated/Lexer.hs b/dist/build/Language/Lua/Annotated/Lexer.hs
new file mode 100644
--- /dev/null
+++ b/dist/build/Language/Lua/Annotated/Lexer.hs
@@ -0,0 +1,691 @@
+{-# LANGUAGE CPP,MagicHash #-}
+{-# LINE 1 "src/Language/Lua/Annotated/Lexer.x" #-}
+
+{-# OPTIONS_GHC -w #-}
+
+module Language.Lua.Annotated.Lexer
+  ( llex
+  , llexFile
+  , LTok
+  , AlexPosn(..)
+  ) where
+
+import Language.Lua.Annotated.Syntax
+import Language.Lua.Token
+import Control.Applicative ((<$>))
+import Control.Monad (forM_, unless, when)
+
+#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
+{-# LINE 1 "templates/wrappers.hs" #-}
+{-# LINE 1 "templates/wrappers.hs" #-}
+{-# LINE 1 "<command-line>" #-}
+{-# LINE 1 "templates/wrappers.hs" #-}
+-- -----------------------------------------------------------------------------
+-- Alex wrapper code.
+--
+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use
+-- it for any purpose whatsoever.
+
+import Data.Word (Word8)
+{-# LINE 22 "templates/wrappers.hs" #-}
+
+import qualified Data.Bits
+
+-- | Encode a Haskell String to a list of Word8 values, in UTF8 format.
+utf8Encode :: Char -> [Word8]
+utf8Encode = map fromIntegral . go . ord
+ where
+  go oc
+   | oc <= 0x7f       = [oc]
+
+   | oc <= 0x7ff      = [ 0xc0 + (oc `Data.Bits.shiftR` 6)
+                        , 0x80 + oc Data.Bits..&. 0x3f
+                        ]
+
+   | oc <= 0xffff     = [ 0xe0 + (oc `Data.Bits.shiftR` 12)
+                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)
+                        , 0x80 + oc Data.Bits..&. 0x3f
+                        ]
+   | otherwise        = [ 0xf0 + (oc `Data.Bits.shiftR` 18)
+                        , 0x80 + ((oc `Data.Bits.shiftR` 12) Data.Bits..&. 0x3f)
+                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)
+                        , 0x80 + oc Data.Bits..&. 0x3f
+                        ]
+
+
+
+type Byte = Word8
+
+-- -----------------------------------------------------------------------------
+-- The input type
+
+
+type AlexInput = (AlexPosn,     -- current position,
+                  Char,         -- previous char
+                  [Byte],       -- pending bytes on current char
+                  String)       -- current input string
+
+ignorePendingBytes :: AlexInput -> AlexInput
+ignorePendingBytes (p,c,ps,s) = (p,c,[],s)
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar (p,c,bs,s) = c
+
+alexGetByte :: AlexInput -> Maybe (Byte,AlexInput)
+alexGetByte (p,c,(b:bs),s) = Just (b,(p,c,bs,s))
+alexGetByte (p,c,[],[]) = Nothing
+alexGetByte (p,_,[],(c:s))  = let p' = alexMove p c 
+                                  (b:bs) = utf8Encode c
+                              in p' `seq`  Just (b, (p', c, bs, s))
+
+
+{-# LINE 89 "templates/wrappers.hs" #-}
+
+{-# LINE 103 "templates/wrappers.hs" #-}
+
+{-# LINE 118 "templates/wrappers.hs" #-}
+
+-- -----------------------------------------------------------------------------
+-- Token positions
+
+-- `Posn' records the location of a token in the input text.  It has three
+-- fields: the address (number of chacaters preceding the token), line number
+-- and column of a token within the file. `start_pos' gives the position of the
+-- start of the file and `eof_pos' a standard encoding for the end of file.
+-- `move_pos' calculates the new position after traversing a given character,
+-- assuming the usual eight character tab stops.
+
+
+data AlexPosn = AlexPn !Int !Int !Int
+        deriving (Eq,Show)
+
+alexStartPos :: AlexPosn
+alexStartPos = AlexPn 0 1 1
+
+alexMove :: AlexPosn -> Char -> AlexPosn
+alexMove (AlexPn a l c) '\t' = AlexPn (a+1)  l     (((c+7) `div` 8)*8+1)
+alexMove (AlexPn a l c) '\n' = AlexPn (a+1) (l+1)   1
+alexMove (AlexPn a l c) _    = AlexPn (a+1)  l     (c+1)
+
+
+-- -----------------------------------------------------------------------------
+-- Default monad
+
+
+data AlexState = AlexState {
+        alex_pos :: !AlexPosn,  -- position at current input location
+        alex_inp :: String,     -- the current input
+        alex_chr :: !Char,      -- the character before the input
+        alex_bytes :: [Byte],
+        alex_scd :: !Int        -- the current startcode
+
+      , alex_ust :: AlexUserState -- AlexUserState will be defined in the user program
+
+    }
+
+-- Compile with -funbox-strict-fields for best results!
+
+runAlex :: String -> Alex a -> Either String a
+runAlex input (Alex f) 
+   = case f (AlexState {alex_pos = alexStartPos,
+                        alex_inp = input,       
+                        alex_chr = '\n',
+                        alex_bytes = [],
+
+                        alex_ust = alexInitUserState,
+
+                        alex_scd = 0}) of Left msg -> Left msg
+                                          Right ( _, a ) -> Right a
+
+newtype Alex a = Alex { unAlex :: AlexState -> Either String (AlexState, a) }
+
+instance Monad Alex where
+  m >>= k  = Alex $ \s -> case unAlex m s of 
+                                Left msg -> Left msg
+                                Right (s',a) -> unAlex (k a) s'
+  return a = Alex $ \s -> Right (s,a)
+
+alexGetInput :: Alex AlexInput
+alexGetInput
+ = Alex $ \s@AlexState{alex_pos=pos,alex_chr=c,alex_bytes=bs,alex_inp=inp} -> 
+        Right (s, (pos,c,bs,inp))
+
+alexSetInput :: AlexInput -> Alex ()
+alexSetInput (pos,c,bs,inp)
+ = Alex $ \s -> case s{alex_pos=pos,alex_chr=c,alex_bytes=bs,alex_inp=inp} of
+                  s@(AlexState{}) -> Right (s, ())
+
+alexError :: String -> Alex a
+alexError message = Alex $ \s -> Left message
+
+alexGetStartCode :: Alex Int
+alexGetStartCode = Alex $ \s@AlexState{alex_scd=sc} -> Right (s, sc)
+
+alexSetStartCode :: Int -> Alex ()
+alexSetStartCode sc = Alex $ \s -> Right (s{alex_scd=sc}, ())
+
+
+alexGetUserState :: Alex AlexUserState
+alexGetUserState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s,ust)
+
+alexSetUserState :: AlexUserState -> Alex ()
+alexSetUserState ss = Alex $ \s -> Right (s{alex_ust=ss}, ())
+
+
+alexMonadScan = do
+  inp <- alexGetInput
+  sc <- alexGetStartCode
+  case alexScan inp sc of
+    AlexEOF -> alexEOF
+    AlexError ((AlexPn _ line column),_,_,_) -> alexError $ "lexical error at line " ++ (show line) ++ ", column " ++ (show column)
+    AlexSkip  inp' len -> do
+        alexSetInput inp'
+        alexMonadScan
+    AlexToken inp' len action -> do
+        alexSetInput inp'
+        action (ignorePendingBytes inp) len
+
+-- -----------------------------------------------------------------------------
+-- Useful token actions
+
+type AlexAction result = AlexInput -> Int -> Alex result
+
+-- just ignore this token and scan another one
+-- skip :: AlexAction result
+skip input len = alexMonadScan
+
+-- ignore this token, but set the start code to a new value
+-- begin :: Int -> AlexAction result
+begin code input len = do alexSetStartCode code; alexMonadScan
+
+-- perform an action for this token, and set the start code to a new value
+andBegin :: AlexAction result -> Int -> AlexAction result
+(action `andBegin` code) input len = do alexSetStartCode code; action input len
+
+token :: (AlexInput -> Int -> token) -> AlexAction token
+token t input len = return (t input len)
+
+
+
+-- -----------------------------------------------------------------------------
+-- Monad (with ByteString input)
+
+{-# LINE 328 "templates/wrappers.hs" #-}
+
+
+-- -----------------------------------------------------------------------------
+-- Basic wrapper
+
+{-# LINE 355 "templates/wrappers.hs" #-}
+
+
+-- -----------------------------------------------------------------------------
+-- Basic wrapper, ByteString version
+
+{-# LINE 373 "templates/wrappers.hs" #-}
+
+{-# LINE 386 "templates/wrappers.hs" #-}
+
+
+-- -----------------------------------------------------------------------------
+-- Posn wrapper
+
+-- Adds text positions to the basic model.
+
+{-# LINE 403 "templates/wrappers.hs" #-}
+
+
+-- -----------------------------------------------------------------------------
+-- Posn wrapper, ByteString version
+
+{-# LINE 418 "templates/wrappers.hs" #-}
+
+
+-- -----------------------------------------------------------------------------
+-- GScan wrapper
+
+-- For compatibility with previous versions of Alex, and because we can.
+
+alex_base :: AlexAddr
+alex_base = AlexA# "\xf8\xff\xff\xff\x4a\x00\x00\x00\x05\x01\x00\x00\x05\x02\x00\x00\xc9\x02\x00\x00\xdc\xff\xff\xff\xfb\xff\xff\xff\x37\x00\x00\x00\xc9\xff\xff\xff\xc6\x01\x00\x00\x00\x00\x00\x00\xfe\x02\x00\x00\x00\x00\x00\x00\x7e\x03\x00\x00\xfe\x03\x00\x00\xfe\x04\x00\x00\x89\x02\x00\x00\x7e\x05\x00\x00\x3e\x05\x00\x00\xc1\xff\xff\xff\x3e\x06\x00\x00\xfe\x05\x00\x00\x00\x00\x00\x00\xfe\x06\x00\x00\xbe\x06\x00\x00\xbe\x07\x00\x00\x82\x08\x00\x00\x52\x00\x00\x00\x1b\x01\x00\x00\x0e\x08\x00\x00\xd7\x08\x00\x00\xee\x08\x00\x00\x27\x09\x00\x00\xdd\xff\xff\xff\x69\x00\x00\x00\x79\x00\x00\x00\x89\x00\x00\x00\x6e\x00\x00\x00\x4d\x09\x00\x00\x27\x08\x00\x00\x9a\x09\x00\x00\x33\x01\x00\x00\xa4\x09\x00\x00\x3d\x01\x00\x00\xe3\x09\x00\x00\x09\x0a\x00\x00\x2f\x0a\x00\x00\x46\x0a\x00\x00\x00\x00\x00\x00\xb7\x0a\x00\x00\x7b\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x66\x00\x00\x00\xbc\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\xbd\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x00\x00\xef\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\xe1\xff\xff\xff\x3f\x00\x00\x00\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x40\x09\x00\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+alex_table :: AlexAddr
+alex_table = AlexA# "\x00\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x49\x00\x5c\x00\x22\x00\x34\x00\x22\x00\x13\x00\x13\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x3f\x00\x25\x00\x05\x00\x1a\x00\x47\x00\x3a\x00\x45\x00\x4a\x00\x03\x00\x4f\x00\x50\x00\x43\x00\x41\x00\x58\x00\x42\x00\x59\x00\x44\x00\x28\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x57\x00\x56\x00\x4c\x00\x4e\x00\x4d\x00\x35\x00\x06\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x53\x00\x3e\x00\x54\x00\x46\x00\x26\x00\x36\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x51\x00\x07\x00\x52\x00\x08\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x4b\x00\x1d\x00\x48\x00\x1d\x00\x55\x00\x5b\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x00\x00\x00\x00\x25\x00\x3c\x00\x00\x00\x00\x00\x40\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x06\x00\x24\x00\x3b\x00\x24\x00\x07\x00\x05\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x36\x00\x00\x00\x40\x00\x35\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x14\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x15\x00\x0e\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x09\x00\x0d\x00\x0c\x00\x0c\x00\x0c\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x37\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x33\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x04\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x0f\x00\x10\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x32\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x04\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x0f\x00\x10\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x14\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x00\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x31\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x19\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2a\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x23\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x30\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x19\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1f\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x1c\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x5a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x2a\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x20\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x00\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x30\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x19\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x33\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x04\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x3d\x00\x46\x00\x2b\x00\x0a\x00\x2d\x00\x4f\x00\x4f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\x20\x00\x3d\x00\x22\x00\x23\x00\x2d\x00\x25\x00\x3d\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x5b\x00\x3d\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\x0a\x00\x5d\x00\x5e\x00\x5f\x00\x5d\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\x3d\x00\x7d\x00\x7e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x3d\x00\x2b\x00\x3d\x00\x2d\x00\x3a\x00\x2e\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x20\x00\x45\x00\xff\xff\xff\xff\x5b\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3d\x00\x2b\x00\x5b\x00\x2d\x00\x3d\x00\x3d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x5d\x00\xff\xff\x5b\x00\x5b\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x45\x00\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\x5d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xc2\x00\xc3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xc2\x00\xc3\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\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\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\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\xc3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x65\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x2b\x00\xff\xff\x2d\x00\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\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\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\xc3\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\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\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x78\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\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\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\xc3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\xc3\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x3d\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x16\x00\x0a\x00\x0a\x00\xff\xff\xff\xff\x03\x00\x03\x00\x1a\x00\x1a\x00\xff\xff\x3d\x00\x3d\x00\x3d\x00\x39\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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,92) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAcc (alex_action_1),AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_8),AlexAcc (alex_action_8),AlexAcc (alex_action_9),AlexAcc (alex_action_9),AlexAcc (alex_action_10),AlexAcc (alex_action_10),AlexAcc (alex_action_11),AlexAcc (alex_action_12),AlexAcc (alex_action_12),AlexAcc (alex_action_12),AlexAcc (alex_action_13),AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAcc (alex_action_15),AlexAcc (alex_action_16),AlexAcc (alex_action_16),AlexAcc (alex_action_17),AlexAcc (alex_action_18),AlexAcc (alex_action_19),AlexAcc (alex_action_20),AlexAcc (alex_action_21),AlexAcc (alex_action_22),AlexAcc (alex_action_23),AlexAcc (alex_action_24),AlexAcc (alex_action_25),AlexAcc (alex_action_26),AlexAcc (alex_action_27),AlexAcc (alex_action_28),AlexAcc (alex_action_29),AlexAcc (alex_action_30),AlexAcc (alex_action_31),AlexAcc (alex_action_32),AlexAcc (alex_action_33),AlexAcc (alex_action_34),AlexAcc (alex_action_35),AlexAcc (alex_action_36),AlexAcc (alex_action_37),AlexAcc (alex_action_38),AlexAcc (alex_action_39),AlexAcc (alex_action_40),AlexAcc (alex_action_41),AlexAcc (alex_action_42),AlexAcc (alex_action_43),AlexAcc (alex_action_44)]
+{-# LINE 102 "src/Language/Lua/Annotated/Lexer.x" #-}
+
+
+data AlexUserState = AlexUserState { stringState     :: !Bool
+                                   , stringDelimLen  :: !Int
+                                   , stringPosn      :: !AlexPosn
+                                   , stringValue     :: !String
+                                   -- comments
+                                   , commentState    :: !Bool
+                                   }
+
+alexInitUserState :: AlexUserState
+alexInitUserState = AlexUserState { stringState     = False
+                                  , stringDelimLen  = 0
+                                  , stringPosn      = AlexPn 0 0 0
+                                  , stringValue     = ""
+                                  , commentState    = False
+                                  }
+
+initString :: Int -> AlexPosn -> Alex ()
+initString i posn = Alex $ \s -> Right(s{alex_ust=(alex_ust s){stringState=True,stringValue="",stringDelimLen=i,stringPosn=posn}}, ())
+
+initComment :: Alex ()
+initComment = Alex $ \s -> Right(s{alex_ust=(alex_ust s){commentState=True}}, ())
+
+getStringDelimLen :: Alex Int
+getStringDelimLen = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringDelimLen ust)
+
+getStringPosn :: Alex AlexPosn
+getStringPosn = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringPosn ust)
+
+getStringValue :: Alex String
+getStringValue = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringValue ust)
+
+getStringState :: Alex Bool
+getStringState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringState ust)
+
+getCommentState :: Alex Bool
+getCommentState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, commentState ust)
+
+addCharToStringValue :: Char -> Alex ()
+addCharToStringValue c = Alex $ \s -> Right (s{alex_ust=(alex_ust s){stringValue=c:stringValue (alex_ust s)}}, ())
+
+enterString :: AlexAction LTok
+enterString (posn,_,_,s) len = do
+  initString (if (s !! (len-1) == '\n') then len-1 else len) posn
+  alexMonadScan'
+
+enterComment :: AlexAction LTok
+enterComment _ _ = do
+  initComment
+  alexMonadScan'
+
+addString :: AlexAction LTok
+addString (_,_,_,s) len = do
+  forM_ (take len s) addCharToStringValue
+  alexMonadScan'
+
+addCharToString :: AlexAction LTok
+addCharToString (_,_,_,s) len = do
+  addCharToStringValue (head s)
+  alexMonadScan'
+
+endString :: Alex ()
+endString = Alex $ \s -> Right(s{alex_ust=(alex_ust s){stringState=False}}, ())
+
+endComment :: Alex ()
+endComment = Alex $ \s -> Right(s{alex_ust=(alex_ust s){commentState=False}}, ())
+
+testAndEndComment :: AlexAction LTok
+testAndEndComment _ _ = do
+  ss <- getStringState
+  if ss then alexMonadScan' else endComment >> alexSetStartCode 0 >> alexMonadScan'
+
+testAndEndString :: AlexAction LTok
+testAndEndString (_,_,_,s) len = do
+  startlen <- getStringDelimLen
+  if startlen /= len
+    then do forM_ (take len s) addCharToStringValue
+            alexMonadScan'
+    else do endString
+            alexSetStartCode 0
+            cs <- getCommentState
+            if cs
+              then do
+                endComment
+                alexMonadScan'
+              else do
+                val  <- getStringValue
+                posn <- getStringPosn
+                return (LTokSLit (reverse val), posn)
+
+data EOF = EOF deriving Show
+
+-- | Lua token with position information.
+type LTok = (LToken, AlexPosn)
+
+-- type AlexAction result = AlexInput -> Int -> Alex result
+
+-- Helper to make LTokens with string value (like LTokNum, LTokSLit etc.)
+tokWValue :: (String -> LToken) -> AlexInput -> Int -> Alex LTok
+tokWValue tok (posn,_,_,s) len = return (tok (take len s), posn)
+
+tok :: LToken -> AlexInput -> Int -> Alex LTok
+tok t (posn,_,_,_) _ = return (t, posn)
+
+{-# INLINE ident #-}
+ident :: AlexAction LTok
+ident (posn,_,_,s) len = return (tok, posn)
+  where tok = case (take len s) of
+          "and"      -> LTokAnd
+          "break"    -> LTokBreak
+          "do"       -> LTokDo
+          "else"     -> LTokElse
+          "elseif"   -> LTokElseIf
+          "end"      -> LTokEnd
+          "false"    -> LTokFalse
+          "for"      -> LTokFor
+          "function" -> LTokFunction
+          "goto"     -> LTokGoto
+          "if"       -> LTokIf
+          "in"       -> LTokIn
+          "local"    -> LTokLocal
+          "nil"      -> LTokNil
+          "not"      -> LTokNot
+          "or"       -> LTokOr
+          "repeat"   -> LTokRepeat
+          "return"   -> LTokReturn
+          "then"     -> LTokThen
+          "true"     -> LTokTrue
+          "until"    -> LTokUntil
+          "while"    -> LTokWhile
+          ident'     -> LTokIdent ident'
+
+--data AlexPosn = AlexPn !Int  -- absolute character offset
+--                       !Int  -- line number
+--                       !Int  -- column number
+--
+--type AlexInput = (AlexPosn,     -- current position,
+--                  Char,         -- previous char
+--                  [Byte],       -- rest of the bytes for the current char
+--                  String)       -- current input string
+
+alexEOF :: Alex LTok
+alexEOF = return (LTokEof, AlexPn (-1) (-1) (-1))
+
+alexMonadScan' :: Alex LTok
+alexMonadScan' = do
+  inp <- alexGetInput
+  sc <- alexGetStartCode
+  case alexScan inp sc of
+    AlexEOF -> do cs <- getCommentState
+                  when cs endString
+                  alexEOF
+    AlexError ((AlexPn _ line col),ch,_,_) -> alexError $ concat
+        [ "lexical error near line: " , show line , " col: " , show col , " at char " , [ch] ]
+    AlexSkip  inp' len -> do
+        alexSetInput inp'
+        alexMonadScan'
+    AlexToken inp' len action -> do
+        alexSetInput inp'
+        action (ignorePendingBytes inp) len
+
+scanner :: String -> Either String [LTok]
+scanner str = runAlex str loop
+  where loop = do
+          t@(tok, _) <- alexMonadScan'
+          if tok == LTokEof
+            then do stringState <- getStringState
+                    if stringState
+                      then alexError "String not closed at end of file"
+                      else return [t]
+            else do toks <- loop
+                    return (t:toks)
+
+-- | Lua lexer.
+llex :: String -> [LTok]
+llex s = case scanner s of
+           Left err -> error err
+           Right r  -> r
+
+-- | Run Lua lexer on a file.
+llexFile :: FilePath -> IO [LTok]
+llexFile p = llex <$> readFile p
+
+
+state_comment,state_string :: Int
+state_comment = 1
+state_string = 2
+alex_action_1 =  ident 
+alex_action_2 =  tokWValue LTokNum 
+alex_action_3 =  tokWValue LTokNum 
+alex_action_4 =  tokWValue LTokNum 
+alex_action_5 =  tokWValue LTokNum 
+alex_action_6 =  tokWValue LTokNum 
+alex_action_7 =  tokWValue LTokNum 
+alex_action_8 =  \(posn,_,_,s) l -> return (LTokSLit (tail . init $ take l s), posn) 
+alex_action_9 =  \(posn,_,_,s) l -> return (LTokSLit (tail . init $ take l s), posn) 
+alex_action_10 =  enterString `andBegin` state_string 
+alex_action_11 =  testAndEndString 
+alex_action_12 =  addCharToString 
+alex_action_13 =  enterComment `andBegin` state_comment 
+alex_action_15 =  testAndEndComment 
+alex_action_16 =  enterString `andBegin` state_string 
+alex_action_17 =  tok LTokPlus 
+alex_action_18 =  tok LTokMinus 
+alex_action_19 =  tok LTokStar 
+alex_action_20 =  tok LTokSlash 
+alex_action_21 =  tok LTokPercent 
+alex_action_22 =  tok LTokExp 
+alex_action_23 =  tok LTokSh 
+alex_action_24 =  tok LTokEqual 
+alex_action_25 =  tok LTokNotequal 
+alex_action_26 =  tok LTokLEq 
+alex_action_27 =  tok LTokGEq 
+alex_action_28 =  tok LTokLT 
+alex_action_29 =  tok LTokGT 
+alex_action_30 =  tok LTokAssign 
+alex_action_31 =  tok LTokLParen 
+alex_action_32 =  tok LTokRParen 
+alex_action_33 =  tok LTokLBrace 
+alex_action_34 =  tok LTokRBrace 
+alex_action_35 =  tok LTokLBracket 
+alex_action_36 =  tok LTokRBracket 
+alex_action_37 =  tok LTokDColon 
+alex_action_38 =  tok LTokSemic 
+alex_action_39 =  tok LTokColon 
+alex_action_40 =  tok LTokComma 
+alex_action_41 =  tok LTokDot 
+alex_action_42 =  tok LTokDDot 
+alex_action_43 =  tok LTokEllipsis 
+alex_action_44 =  tok LTokEof 
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# 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 21 "templates/GenericTemplate.hs" #-}
+
+
+
+
+
+#if __GLASGOW_HASKELL__ > 706
+#define GTE(n,m) (tagToEnum# (n >=# m))
+#define EQ(n,m) (tagToEnum# (n ==# m))
+#else
+#define GTE(n,m) (n >=# m)
+#define EQ(n,m) (n ==# m)
+#endif
+{-# LINE 50 "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 alexGetByte 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 alexGetByte input of
+     Nothing -> (new_acc, input)
+     Just (c, new_input) -> 
+
+
+
+      case fromIntegral c of { (I# (ord_c)) ->
+        let
+                base   = alexIndexInt32OffAddr alex_base s
+                offset = (base +# ord_c)
+                check  = alexIndexInt16OffAddr alex_check offset
+		
+                new_s = if GTE(offset,0#) && EQ(check,ord_c)
+			  then alexIndexInt16OffAddr alex_table offset
+			  else alexIndexInt16OffAddr alex_deflt s
+	in
+        case new_s of
+	    -1# -> (new_acc, input)
+		-- on an error, we want to keep the input *before* the
+		-- character that failed, not after.
+    	    _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)
+                                                -- note that the length is increased ONLY if this is the 1st byte in a char encoding)
+			new_input new_s new_acc
+      }
+  where
+	check_accs (AlexAccNone) = last_acc
+	check_accs (AlexAcc a  ) = AlexLastAcc a input (I# (len))
+	check_accs (AlexAccSkip) = AlexLastSkip  input (I# (len))
+{-# LINE 196 "templates/GenericTemplate.hs" #-}
+
+data AlexLastAcc a
+  = AlexNone
+  | AlexLastAcc a !AlexInput !Int
+  | AlexLastSkip  !AlexInput !Int
+
+instance Functor AlexLastAcc where
+    fmap f AlexNone = AlexNone
+    fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z
+    fmap f (AlexLastSkip x y) = AlexLastSkip x y
+
+data AlexAcc a user
+  = AlexAccNone
+  | AlexAcc a
+  | AlexAccSkip
+{-# LINE 240 "templates/GenericTemplate.hs" #-}
+
+-- used by wrappers
+iUnbox (I# (i)) = i
diff --git a/language-lua.cabal b/language-lua.cabal
--- a/language-lua.cabal
+++ b/language-lua.cabal
@@ -2,7 +2,12 @@
 Description:         Lua 5.2 lexer, parser and pretty-printer. Documentation: (<https://osa1.github.com/language-lua>)
                      .
                      Changelog:
+                     \0.3.0:
+                     .
+                     - Added non-annotated syntax to make code-generation easier.
+                     .
                      \0.2.3:
+                     .
                      - Minor internal changes.
                      .
                      \0.2.2:
@@ -12,7 +17,7 @@
                      \0.2.0:
                      .
                      - Syntax tree is annotated. All parsers(`parseText`, `parseFile`) annotate resulting tree with source positions.
-Version:             0.2.3
+Version:             0.3.0
 Synopsis:            Lua parser and pretty-printer
 Homepage:            http://github.com/osa1/language-lua
 Bug-reports:         http://github.com/osa1/language-lua/issues
@@ -34,17 +39,23 @@
 Library
   Hs-source-dirs:    src
 
-  Exposed-modules:   Language.Lua,
-                     Language.Lua.Types,
-                     Language.Lua.Token,
-                     Language.Lua.Parser,
-                     Language.Lua.Lexer,
+  Exposed-modules:   Language.Lua
+                     Language.Lua.Token
+                     Language.Lua.Syntax
+                     Language.Lua.Parser
                      Language.Lua.PrettyPrinter
+                     Language.Lua.Annotated
+                     Language.Lua.Annotated.Syntax
+                     Language.Lua.Annotated.Parser
+                     Language.Lua.Annotated.Simplify
                      Text.Parsec.LTok
 
-  Other-modules:     Text.PrettyPrint.Leijen
+  Other-modules:     Language.Lua.Annotated.Lexer
+                     Text.PrettyPrint.Leijen
 
-  Build-depends:     base >= 4.5 && < 4.7,
+  Build-depends:     base >= 4.5 && < 4.8,
                      mtl >= 2.0 && < 2.2,
                      parsec >= 3.1.3 && < 3.2,
-                     array >= 0.4 && < 0.5
+                     array >= 0.4 && < 0.6
+
+  ghc-options:       -Wall
diff --git a/src/Language/Lua.hs b/src/Language/Lua.hs
--- a/src/Language/Lua.hs
+++ b/src/Language/Lua.hs
@@ -1,19 +1,14 @@
 module Language.Lua
-  ( parseText
+  ( module Language.Lua.Syntax
+  , parseText
   , parseFile
-  , llex
-  , llexFile
   , stat
   , exp
   , chunk
-  , Block(..)
-  , Stat(..)
-  , Exp(..)
   , pprint
   ) where
 
 import Prelude hiding (exp)
-import Language.Lua.Types
-import Language.Lua.Lexer
+import Language.Lua.Syntax
 import Language.Lua.Parser
 import Language.Lua.PrettyPrinter
diff --git a/src/Language/Lua/Annotated.hs b/src/Language/Lua/Annotated.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Lua/Annotated.hs
@@ -0,0 +1,12 @@
+module Language.Lua.Annotated
+  ( module Language.Lua.Annotated.Syntax
+  , parseText
+  , parseFile
+  , stat
+  , exp
+  , chunk
+  ) where
+
+import Prelude hiding (exp)
+import Language.Lua.Annotated.Syntax
+import Language.Lua.Annotated.Parser
diff --git a/src/Language/Lua/Annotated/Lexer.x b/src/Language/Lua/Annotated/Lexer.x
new file mode 100644
--- /dev/null
+++ b/src/Language/Lua/Annotated/Lexer.x
@@ -0,0 +1,285 @@
+{
+{-# OPTIONS_GHC -w #-}
+
+module Language.Lua.Annotated.Lexer
+  ( llex
+  , llexFile
+  , LTok
+  , AlexPosn(..)
+  ) where
+
+import Language.Lua.Annotated.Syntax
+import Language.Lua.Token
+import Control.Applicative ((<$>))
+import Control.Monad (forM_, unless, when)
+}
+
+%wrapper "monadUserState"
+
+$space = [ \ \t ]                        -- horizontal white space
+
+$letter      = [a-zA-Z_]                 -- first letter of variables
+$identletter = [a-zA-Z_0-9]              -- letters for rest of variables
+
+$digit    = 0-9                          -- decimal digits
+$octdigit = 0-7                          -- octal digits
+$hexdigit = [0-9a-fA-F]                  -- hexadecimal digits
+
+$dqstr    = \0-\255 # [ \" \n ]          -- valid character in a string literal with dquotes
+$sqstr    = \0-\255 # [ \' \n ]          -- valid character in a string literal with quotes
+$longstr  = \0-\255                      -- valid character in a long string
+
+-- escape characters
+@charescd  = \\ ([ntvbrfaeE\\\?\"] | $octdigit{1,3} | x$hexdigit+ | X$hexdigit+)
+@charescs  = \\ ([ntvbrfaeE\\\?\'] | $octdigit{1,3} | x$hexdigit+ | X$hexdigit+)
+
+@digits    = $digit+
+@hexdigits = $hexdigit+
+
+@mantpart = (@digits \. @digits) | @digits \. | \. @digits
+@exppart  = [eE][\+\-]? @digits
+
+@hexprefix = 0x | 0X
+@mantparthex = (@hexdigits \. @hexdigits) | @hexdigits \. | \. @hexdigits
+@expparthex  = [pP][\+\-]? @hexdigits
+
+tokens :-
+
+    <0> $white+  ;
+
+    <0> $letter $identletter* { ident }
+
+    <0> @digits                              { tokWValue LTokNum }
+    <0> @digits @exppart                     { tokWValue LTokNum }
+    <0> @mantpart @exppart?                  { tokWValue LTokNum }
+    <0> @hexprefix @hexdigits                { tokWValue LTokNum }
+    <0> @hexprefix @hexdigits @expparthex    { tokWValue LTokNum }
+    <0> @hexprefix @mantparthex @expparthex? { tokWValue LTokNum }
+
+    <0> \"($dqstr|@charescd)*\" { \(posn,_,_,s) l -> return (LTokSLit (tail . init $ take l s), posn) }
+    <0> \'($sqstr|@charescs)*\' { \(posn,_,_,s) l -> return (LTokSLit (tail . init $ take l s), posn) }
+
+    -- long strings
+    <0> \[ \=* \[ \n?        { enterString `andBegin` state_string }
+    <state_string> \] \=* \] { testAndEndString }
+    <state_string> $longstr  { addCharToString }
+
+    <0> "--"                      { enterComment `andBegin` state_comment }
+    <state_comment> . # \n        ;
+    <state_comment> \n            { testAndEndComment }
+    <state_comment> \[ \=* \[ \n? { enterString `andBegin` state_string }
+
+    <0> "+"   { tok LTokPlus }
+    <0> "-"   { tok LTokMinus }
+    <0> "*"   { tok LTokStar }
+    <0> "/"   { tok LTokSlash }
+    <0> "%"   { tok LTokPercent }
+    <0> "^"   { tok LTokExp }
+    <0> "#"   { tok LTokSh }
+    <0> "=="  { tok LTokEqual }
+    <0> "~="  { tok LTokNotequal }
+    <0> "<="  { tok LTokLEq }
+    <0> ">="  { tok LTokGEq }
+    <0> "<"   { tok LTokLT }
+    <0> ">"   { tok LTokGT }
+    <0> "="   { tok LTokAssign }
+    <0> "("   { tok LTokLParen }
+    <0> ")"   { tok LTokRParen }
+    <0> "{"   { tok LTokLBrace }
+    <0> "}"   { tok LTokRBrace }
+    <0> "["   { tok LTokLBracket }
+    <0> "]"   { tok LTokRBracket }
+    <0> "::"  { tok LTokDColon }
+    <0> ";"   { tok LTokSemic }
+    <0> ":"   { tok LTokColon }
+    <0> ","   { tok LTokComma }
+    <0> "."   { tok LTokDot }
+    <0> ".."  { tok LTokDDot }
+    <0> "..." { tok LTokEllipsis }
+
+    \EOF  { tok LTokEof }
+
+{
+
+data AlexUserState = AlexUserState { stringState     :: !Bool
+                                   , stringDelimLen  :: !Int
+                                   , stringPosn      :: !AlexPosn
+                                   , stringValue     :: !String
+                                   -- comments
+                                   , commentState    :: !Bool
+                                   }
+
+alexInitUserState :: AlexUserState
+alexInitUserState = AlexUserState { stringState     = False
+                                  , stringDelimLen  = 0
+                                  , stringPosn      = AlexPn 0 0 0
+                                  , stringValue     = ""
+                                  , commentState    = False
+                                  }
+
+initString :: Int -> AlexPosn -> Alex ()
+initString i posn = Alex $ \s -> Right(s{alex_ust=(alex_ust s){stringState=True,stringValue="",stringDelimLen=i,stringPosn=posn}}, ())
+
+initComment :: Alex ()
+initComment = Alex $ \s -> Right(s{alex_ust=(alex_ust s){commentState=True}}, ())
+
+getStringDelimLen :: Alex Int
+getStringDelimLen = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringDelimLen ust)
+
+getStringPosn :: Alex AlexPosn
+getStringPosn = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringPosn ust)
+
+getStringValue :: Alex String
+getStringValue = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringValue ust)
+
+getStringState :: Alex Bool
+getStringState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringState ust)
+
+getCommentState :: Alex Bool
+getCommentState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, commentState ust)
+
+addCharToStringValue :: Char -> Alex ()
+addCharToStringValue c = Alex $ \s -> Right (s{alex_ust=(alex_ust s){stringValue=c:stringValue (alex_ust s)}}, ())
+
+enterString :: AlexAction LTok
+enterString (posn,_,_,s) len = do
+  initString (if (s !! (len-1) == '\n') then len-1 else len) posn
+  alexMonadScan'
+
+enterComment :: AlexAction LTok
+enterComment _ _ = do
+  initComment
+  alexMonadScan'
+
+addString :: AlexAction LTok
+addString (_,_,_,s) len = do
+  forM_ (take len s) addCharToStringValue
+  alexMonadScan'
+
+addCharToString :: AlexAction LTok
+addCharToString (_,_,_,s) len = do
+  addCharToStringValue (head s)
+  alexMonadScan'
+
+endString :: Alex ()
+endString = Alex $ \s -> Right(s{alex_ust=(alex_ust s){stringState=False}}, ())
+
+endComment :: Alex ()
+endComment = Alex $ \s -> Right(s{alex_ust=(alex_ust s){commentState=False}}, ())
+
+testAndEndComment :: AlexAction LTok
+testAndEndComment _ _ = do
+  ss <- getStringState
+  if ss then alexMonadScan' else endComment >> alexSetStartCode 0 >> alexMonadScan'
+
+testAndEndString :: AlexAction LTok
+testAndEndString (_,_,_,s) len = do
+  startlen <- getStringDelimLen
+  if startlen /= len
+    then do forM_ (take len s) addCharToStringValue
+            alexMonadScan'
+    else do endString
+            alexSetStartCode 0
+            cs <- getCommentState
+            if cs
+              then do
+                endComment
+                alexMonadScan'
+              else do
+                val  <- getStringValue
+                posn <- getStringPosn
+                return (LTokSLit (reverse val), posn)
+
+data EOF = EOF deriving Show
+
+-- | Lua token with position information.
+type LTok = (LToken, AlexPosn)
+
+-- type AlexAction result = AlexInput -> Int -> Alex result
+
+-- Helper to make LTokens with string value (like LTokNum, LTokSLit etc.)
+tokWValue :: (String -> LToken) -> AlexInput -> Int -> Alex LTok
+tokWValue tok (posn,_,_,s) len = return (tok (take len s), posn)
+
+tok :: LToken -> AlexInput -> Int -> Alex LTok
+tok t (posn,_,_,_) _ = return (t, posn)
+
+{-# INLINE ident #-}
+ident :: AlexAction LTok
+ident (posn,_,_,s) len = return (tok, posn)
+  where tok = case (take len s) of
+          "and"      -> LTokAnd
+          "break"    -> LTokBreak
+          "do"       -> LTokDo
+          "else"     -> LTokElse
+          "elseif"   -> LTokElseIf
+          "end"      -> LTokEnd
+          "false"    -> LTokFalse
+          "for"      -> LTokFor
+          "function" -> LTokFunction
+          "goto"     -> LTokGoto
+          "if"       -> LTokIf
+          "in"       -> LTokIn
+          "local"    -> LTokLocal
+          "nil"      -> LTokNil
+          "not"      -> LTokNot
+          "or"       -> LTokOr
+          "repeat"   -> LTokRepeat
+          "return"   -> LTokReturn
+          "then"     -> LTokThen
+          "true"     -> LTokTrue
+          "until"    -> LTokUntil
+          "while"    -> LTokWhile
+          ident'     -> LTokIdent ident'
+
+--data AlexPosn = AlexPn !Int  -- absolute character offset
+--                       !Int  -- line number
+--                       !Int  -- column number
+--
+--type AlexInput = (AlexPosn,     -- current position,
+--                  Char,         -- previous char
+--                  [Byte],       -- rest of the bytes for the current char
+--                  String)       -- current input string
+
+alexEOF :: Alex LTok
+alexEOF = return (LTokEof, AlexPn (-1) (-1) (-1))
+
+alexMonadScan' :: Alex LTok
+alexMonadScan' = do
+  inp <- alexGetInput
+  sc <- alexGetStartCode
+  case alexScan inp sc of
+    AlexEOF -> do cs <- getCommentState
+                  when cs endString
+                  alexEOF
+    AlexError ((AlexPn _ line col),ch,_,_) -> alexError $ concat
+        [ "lexical error near line: " , show line , " col: " , show col , " at char " , [ch] ]
+    AlexSkip  inp' len -> do
+        alexSetInput inp'
+        alexMonadScan'
+    AlexToken inp' len action -> do
+        alexSetInput inp'
+        action (ignorePendingBytes inp) len
+
+scanner :: String -> Either String [LTok]
+scanner str = runAlex str loop
+  where loop = do
+          t@(tok, _) <- alexMonadScan'
+          if tok == LTokEof
+            then do stringState <- getStringState
+                    if stringState
+                      then alexError "String not closed at end of file"
+                      else return [t]
+            else do toks <- loop
+                    return (t:toks)
+
+-- | Lua lexer.
+llex :: String -> [LTok]
+llex s = case scanner s of
+           Left err -> error err
+           Right r  -> r
+
+-- | Run Lua lexer on a file.
+llexFile :: FilePath -> IO [LTok]
+llexFile p = llex <$> readFile p
+}
diff --git a/src/Language/Lua/Annotated/Parser.hs b/src/Language/Lua/Annotated/Parser.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Lua/Annotated/Parser.hs
@@ -0,0 +1,410 @@
+{-# OPTIONS_GHC -fno-warn-hi-shadowing
+                -fno-warn-name-shadowing
+                -fno-warn-unused-do-bind #-}
+module Language.Lua.Annotated.Parser
+  ( parseText
+  , parseFile
+  , stat
+  , exp
+  , chunk
+  ) where
+
+import Prelude hiding (exp, LT, GT, EQ, repeat)
+
+import Language.Lua.Annotated.Lexer
+import Language.Lua.Annotated.Syntax
+import Language.Lua.Token
+
+import Text.Parsec hiding (string)
+import Text.Parsec.LTok
+import Text.Parsec.Expr
+import Control.Applicative ((<*), (<$>), (<*>))
+import Control.Monad (liftM)
+
+-- | Runs Lua lexer before parsing. Use @parseText stat@ to parse
+-- statements, and @parseText exp@ to parse expressions.
+parseText :: Parser a -> String -> Either ParseError a
+parseText p s = parse p "<string>" (llex s)
+
+-- | Parse a Lua file. You can use @parseText chunk@ to parse a file from a string.
+parseFile :: FilePath -> IO (Either ParseError (Block SourcePos))
+parseFile path = parse chunk path . llex <$> readFile path
+
+parens :: Monad m => ParsecT [LTok] u m a -> ParsecT [LTok] u m a
+parens = between (tok LTokLParen) (tok LTokRParen)
+
+brackets :: Monad m => ParsecT [LTok] u m a -> ParsecT [LTok] u m a
+brackets = between (tok LTokLBracket) (tok LTokRBracket)
+
+name :: Parser (Name SourcePos)
+name = do
+    pos <- getPosition
+    str <- tokenValue <$> anyIdent
+    return $ Name pos str
+
+number :: Parser String
+number = tokenValue <$> anyNum
+
+
+data PrimaryExp a
+    = PName a (Name a)
+    | PParen a (Exp a)
+    deriving (Show, Eq)
+
+data SuffixedExp a
+    = SuffixedExp a (PrimaryExp a) [SuffixExp a]
+    deriving (Show, Eq)
+
+data SuffixExp a
+    = SSelect a (Name a)
+    | SSelectExp a (Exp a)
+    | SSelectMethod a (Name a) (FunArg a)
+    | SFunCall a (FunArg a)
+    deriving (Show, Eq)
+
+primaryExp :: Parser (PrimaryExp SourcePos)
+primaryExp = do
+    pos <- getPosition
+    PName pos <$> name <|> PParen pos <$> parens exp
+
+suffixedExp :: Parser (SuffixedExp SourcePos)
+suffixedExp = SuffixedExp <$> getPosition <*> primaryExp <*> many suffixExp
+
+suffixExp :: Parser (SuffixExp SourcePos)
+suffixExp = selectName <|> selectExp <|> selectMethod <|> funarg
+  where selectName   = SSelect <$> getPosition <*> (tok LTokDot >> name)
+        selectExp    = SSelectExp <$> getPosition <*> brackets exp
+        selectMethod = do
+          pos <- getPosition
+          tok LTokColon
+          SSelectMethod pos <$> name <*> funArg
+        funarg       = SFunCall <$> getPosition <*> funArg
+
+sexpToPexp :: SuffixedExp SourcePos -> PrefixExp SourcePos
+sexpToPexp (SuffixedExp _ t r) = case r of
+    []                                -> t'
+    (SSelect pos sname:xs)            -> iter xs (PEVar     pos (SelectName pos t' sname))
+    (SSelectExp pos sexp:xs)          -> iter xs (PEVar     pos (Select pos t' sexp))
+    (SSelectMethod pos mname args:xs) -> iter xs (PEFunCall pos (MethodCall pos t' mname args))
+    (SFunCall pos args:xs)            -> iter xs (PEFunCall pos (NormalFunCall pos t' args))
+
+  where t' :: PrefixExp SourcePos
+        t' = case t of
+               PName pos name -> PEVar pos (VarName pos name)
+               PParen pos exp -> Paren pos exp
+
+        iter :: [SuffixExp SourcePos] -> PrefixExp SourcePos -> PrefixExp SourcePos
+        iter [] pe                                = pe
+        iter (SSelect pos sname:xs) pe            = iter xs (PEVar pos (SelectName pos pe sname))
+        iter (SSelectExp pos sexp:xs) pe          = iter xs (PEVar pos (Select pos pe sexp))
+        iter (SSelectMethod pos mname args:xs) pe = iter xs (PEFunCall pos (MethodCall pos pe mname args))
+        iter (SFunCall pos args:xs) pe            = iter xs (PEFunCall pos (NormalFunCall pos pe args))
+
+-- TODO: improve error messages.
+sexpToVar :: SuffixedExp SourcePos -> Parser (Var SourcePos)
+sexpToVar (SuffixedExp pos (PName _ name) []) = return (VarName pos name)
+sexpToVar (SuffixedExp _ _ []) = fail "syntax error"
+sexpToVar sexp = case sexpToPexp sexp of
+                   PEVar _ var -> return var
+                   _ -> fail "syntax error"
+
+sexpToFunCall :: SuffixedExp SourcePos -> Parser (FunCall SourcePos)
+sexpToFunCall (SuffixedExp _ _ []) = fail "syntax error"
+sexpToFunCall sexp = case sexpToPexp sexp of
+                       PEFunCall _ funcall -> return funcall
+                       _ -> fail "syntax error"
+
+var :: Parser (Var SourcePos)
+var = suffixedExp >>= sexpToVar
+
+funCall :: Parser (FunCall SourcePos)
+funCall = suffixedExp >>= sexpToFunCall
+
+stringlit :: Parser String
+stringlit = tokenValue <$> string
+
+funArg :: Parser (FunArg SourcePos)
+funArg = tableArg <|> stringArg <|> arglist
+  where tableArg  = TableArg <$> getPosition <*> table
+        stringArg = StringArg <$> getPosition <*> stringlit
+        arglist   = do
+          pos <- getPosition
+          parens (do exps <- exp `sepBy` tok LTokComma
+                     return $ Args pos exps)
+
+funBody :: Parser (FunBody SourcePos)
+funBody = do
+    pos <- getPosition
+    (params, vararg) <- arglist
+    body <- block
+    tok LTokEnd
+    return $ FunBody pos params vararg body
+
+  where lastarg = do
+          pos <- getPosition
+          arg <- optionMaybe (tok LTokEllipsis <|> tok LTokComma)
+          case arg of
+            Just LTokEllipsis -> return (Just pos)
+            _ -> return Nothing
+
+        arglist = parens $ do
+          vars <- name `sepEndBy` tok LTokComma
+          vararg <- lastarg
+          return (vars, vararg)
+
+block :: Parser (Block SourcePos)
+block = do
+  pos <- getPosition
+  stats <- many stat
+  ret <- optionMaybe retstat
+  return $ Block pos stats ret
+
+retstat :: Parser [Exp SourcePos]
+retstat = do
+  tok LTokReturn
+  exps <- exp `sepBy` tok LTokComma
+  optional (tok LTokSemic)
+  return exps
+
+tableField :: Parser (TableField SourcePos)
+tableField = choice [ expField, try namedField, field ]
+  where expField :: Parser (TableField SourcePos)
+        expField = do
+            pos <- getPosition
+            e1 <- brackets exp
+            tok LTokAssign
+            e2 <- exp
+            return $ ExpField pos e1 e2
+
+        namedField :: Parser (TableField SourcePos)
+        namedField = do
+            pos <- getPosition
+            name' <- name
+            tok LTokAssign
+            val <- exp
+            return $ NamedField pos name' val
+
+        field :: Parser (TableField SourcePos)
+        field = Field <$> getPosition <*> exp
+
+table :: Parser (Table SourcePos)
+table = do
+    pos <- getPosition
+    between (tok LTokLBrace)
+            (tok LTokRBrace)
+            (do fields <- tableField `sepEndBy` fieldSep
+                return $ Table pos fields)
+  where fieldSep = tok LTokComma <|> tok LTokSemic
+
+-----------------------------------------------------------------------
+---- Expressions
+
+nilExp, boolExp, numberExp, stringExp, varargExp, fundefExp,
+  prefixexpExp, tableconstExp, exp, exp' :: Parser (Exp SourcePos)
+
+nilExp = (Nil <$> getPosition) <* tok LTokNil
+
+boolExp = do
+    pos <- getPosition
+    tOrF <- tok LTokTrue <|> tok LTokFalse
+    return $ Bool pos (tOrF == LTokTrue)
+
+numberExp = Number <$> getPosition <*> number
+
+stringExp = String <$> getPosition <*> stringlit
+
+varargExp = (Vararg <$> getPosition) <* tok LTokEllipsis
+
+fundefExp = do
+  pos <- getPosition
+  tok LTokFunction
+  body <- funBody
+  return $ EFunDef pos (FunDef (ann body) body)
+
+prefixexpExp = PrefixExp <$> getPosition <*> liftM sexpToPexp suffixedExp
+
+tableconstExp = TableConst <$> getPosition <*> table
+
+binary :: Monad m => LToken -> (SourcePos -> a -> a -> a) -> Assoc -> Operator [LTok] u m a
+binary op fun = Infix (do pos <- getPosition; tok op; return $ fun pos)
+
+prefix :: Monad m => LToken -> (SourcePos -> a -> a) -> Operator [LTok] u m a
+prefix op fun = Prefix (do pos <- getPosition; tok op; return $ fun pos)
+
+opTable :: Monad m => SourcePos -> [[Operator [LTok] u m (Exp SourcePos)]]
+opTable pos = [ [ binary LTokExp       (Binop pos . Exp)    AssocRight ]
+              , [ prefix LTokNot       (Unop pos . Not)
+                , prefix LTokSh        (Unop pos . Len)
+                , prefix LTokMinus     (Unop pos . Neg)
+                ]
+              , [ binary LTokStar      (Binop pos . Mul)    AssocLeft
+                , binary LTokSlash     (Binop pos . Div)    AssocLeft
+                , binary LTokPercent   (Binop pos . Mod)    AssocLeft
+                ]
+              , [ binary LTokPlus      (Binop pos . Add)    AssocLeft
+                , binary LTokMinus     (Binop pos . Sub)    AssocLeft
+                ]
+              , [ binary LTokDDot      (Binop pos . Concat) AssocRight ]
+              , [ binary LTokGT        (Binop pos . GT)     AssocLeft
+                , binary LTokLT        (Binop pos . LT)     AssocLeft
+                , binary LTokGEq       (Binop pos . GTE)    AssocLeft
+                , binary LTokLEq       (Binop pos . LTE)    AssocLeft
+                , binary LTokNotequal  (Binop pos . NEQ)    AssocLeft
+                , binary LTokEqual     (Binop pos . EQ)     AssocLeft
+                ]
+              , [ binary LTokAnd       (Binop pos . And)    AssocLeft ]
+              , [ binary LTokOr        (Binop pos . Or)     AssocLeft ]
+              ]
+opExp :: SourcePos -> Parser (Exp SourcePos)
+opExp pos = buildExpressionParser (opTable pos) exp' <?> "opExp"
+
+exp' = choice [ nilExp, boolExp, numberExp, stringExp, varargExp,
+                fundefExp, prefixexpExp, tableconstExp ]
+
+-- | Expression parser.
+exp = choice [ opExp =<< getPosition, nilExp, boolExp, numberExp, stringExp, varargExp,
+               fundefExp, prefixexpExp, tableconstExp ]
+
+-----------------------------------------------------------------------
+---- Statements
+
+emptyStat, assignStat, funCallStat, labelStat, breakStat, gotoStat,
+    doStat, whileStat, repeatStat, ifStat, forRangeStat, forInStat,
+    funAssignStat, localFunAssignStat, localAssignStat, stat :: Parser (Stat SourcePos)
+
+emptyStat = (EmptyStat <$> getPosition) <* tok LTokSemic
+
+assignStat = do
+  pos <- getPosition
+  vars <- var `sepBy` tok LTokComma
+  tok LTokAssign
+  exps <- exp `sepBy` tok LTokComma
+  return $ Assign pos vars exps
+
+funCallStat = FunCall <$> getPosition <*> funCall
+
+labelStat = Label <$> getPosition <*> label
+  where label = between (tok LTokDColon) (tok LTokDColon) name
+
+breakStat = (Break <$> getPosition) <* tok LTokBreak
+
+gotoStat = Goto <$> getPosition <*> (tok LTokGoto >> name)
+
+doStat = Do <$> getPosition <*> between (tok LTokDo) (tok LTokEnd) block
+
+whileStat = do
+  pos <- getPosition
+  between (tok LTokWhile)
+          (tok LTokEnd)
+          (do cond <- exp
+              tok LTokDo
+              body <- block
+              return $ While pos cond body)
+
+repeatStat = do
+  pos <- getPosition
+  tok LTokRepeat
+  body <- block
+  tok LTokUntil
+  cond <- exp
+  return $ Repeat pos body cond
+
+ifStat = do
+    pos <- getPosition
+    between (tok LTokIf)
+            (tok LTokEnd)
+            (do f <- ifPart
+                conds <- many elseifPart
+                l <- optionMaybe elsePart
+                return $ If pos (f:conds) l)
+
+  where ifPart :: Parser (Exp SourcePos, Block SourcePos)
+        ifPart = cond
+
+        elseifPart :: Parser (Exp SourcePos, Block SourcePos)
+        elseifPart = tok LTokElseIf >> cond
+
+        cond :: Parser (Exp SourcePos, Block SourcePos)
+        cond = do
+            cond <- exp
+            tok LTokThen
+            body <- block
+            return (cond, body)
+
+        elsePart :: Parser (Block SourcePos)
+        elsePart = tok LTokElse >> block
+
+forRangeStat = do
+  pos <- getPosition
+  between (tok LTokFor)
+          (tok LTokEnd)
+          (do name' <- name
+              tok LTokAssign
+              start <- exp
+              tok LTokComma
+              end <- exp
+              range <- optionMaybe $ tok LTokComma >> exp
+              tok LTokDo
+              body <- block
+              return $ ForRange pos name' start end range body)
+
+forInStat = do
+  pos <- getPosition
+  between (tok LTokFor)
+          (tok LTokEnd)
+          (do names <- name `sepBy` tok LTokComma
+              tok LTokIn
+              exps <- exp `sepBy` tok LTokComma
+              tok LTokDo
+              body <- block
+              return $ ForIn pos names exps body)
+
+funAssignStat = do
+    pos <- getPosition
+    tok LTokFunction
+    name' <- funName
+    body <- funBody
+    return $ FunAssign pos name' body
+  where funName :: Parser (FunName SourcePos)
+        funName = FunName <$> getPosition
+                          <*> name
+                          <*> many (tok LTokDot >> name)
+                          <*> optionMaybe (tok LTokColon >> name)
+
+localFunAssignStat = do
+  pos <- getPosition
+  tok LTokLocal
+  tok LTokFunction
+  name' <- name
+  body <- funBody
+  return $ LocalFunAssign pos name' body
+
+localAssignStat = do
+  pos <- getPosition
+  tok LTokLocal
+  names <- name `sepBy` tok LTokComma
+  rest <- optionMaybe $ tok LTokAssign >> exp `sepBy` tok LTokComma
+  return $ LocalAssign pos names rest
+
+-- | Statement parser.
+stat =
+  choice [ emptyStat
+         , try assignStat
+         , try funCallStat
+         , labelStat
+         , breakStat
+         , gotoStat
+         , doStat
+         , whileStat
+         , repeatStat
+         , ifStat
+         , try forRangeStat
+         , forInStat
+         , funAssignStat
+         , try localFunAssignStat
+         , localAssignStat
+         ]
+
+-- | Lua file parser.
+chunk :: Parser (Block SourcePos)
+chunk = block <* tok LTokEof
diff --git a/src/Language/Lua/Annotated/Simplify.hs b/src/Language/Lua/Annotated/Simplify.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Lua/Annotated/Simplify.hs
@@ -0,0 +1,103 @@
+-- | Remove annotations.
+module Language.Lua.Annotated.Simplify where
+
+import qualified Language.Lua.Annotated.Syntax as A
+import Language.Lua.Syntax
+
+import Prelude hiding (LT, EQ, GT)
+
+sName :: A.Name a -> Name
+sName (A.Name _ s) = s
+
+sStat :: A.Stat a -> Stat
+sStat (A.Assign _ vs es) = Assign (map sVar vs) (map sExp es)
+sStat (A.FunCall _ fc) = FunCall (sFunCall fc)
+sStat (A.Label _ n) = Label (sName n)
+sStat (A.Break _) = Break
+sStat (A.Goto _ n) = Goto (sName n)
+sStat (A.Do _ b) = Do (sBlock b)
+sStat (A.While _ e b) = While (sExp e) (sBlock b)
+sStat (A.Repeat _ b e) = Repeat (sBlock b) (sExp e)
+sStat (A.If _ conds else_) = If (map sCond conds) (fmap sBlock else_)
+  where sCond (e, b) = (sExp e, sBlock b)
+sStat (A.ForRange _ n e1 e2 oe3 b) =
+    ForRange (sName n) (sExp e1) (sExp e2) (fmap sExp oe3) (sBlock b)
+sStat (A.ForIn _ ns es b) = ForIn (map sName ns) (map sExp es) (sBlock b)
+sStat (A.FunAssign _ fn fb) = FunAssign (sFunName fn) (sFunBody fb)
+sStat (A.LocalFunAssign _ n fb) = LocalFunAssign (sName n) (sFunBody fb)
+sStat (A.LocalAssign _ ns es) = LocalAssign (map sName ns) (fmap (map sExp) es)
+sStat (A.EmptyStat _) = EmptyStat
+
+sExp :: A.Exp a -> Exp
+sExp (A.Nil _) = Nil
+sExp (A.Bool _ b) = Bool b
+sExp (A.Number _ n) = Number n
+sExp (A.String _ s) = String s
+sExp (A.Vararg _) = Vararg
+sExp (A.EFunDef _ fd) = EFunDef (sFunDef fd)
+sExp (A.PrefixExp _ pe) = PrefixExp (sPrefixExp pe)
+sExp (A.TableConst _ t) = TableConst (sTable t)
+sExp (A.Binop _ bop e1 e2) = Binop (sBinop bop) (sExp e1) (sExp e2)
+sExp (A.Unop _ uop e) = Unop (sUnop uop) (sExp e)
+
+sBlock :: A.Block a -> Block
+sBlock (A.Block _ ss oes) = Block (map sStat ss) (fmap (map sExp) oes)
+
+sVar :: A.Var a -> Var
+sVar (A.VarName _ n) = VarName (sName n)
+sVar (A.Select _ pe e) = Select (sPrefixExp pe) (sExp e)
+sVar (A.SelectName _ pe n) = SelectName (sPrefixExp pe) (sName n)
+
+sFunCall :: A.FunCall a -> FunCall
+sFunCall (A.NormalFunCall _ pe a) = NormalFunCall (sPrefixExp pe) (sFunArg a)
+sFunCall (A.MethodCall _ pe n a) = MethodCall (sPrefixExp pe) (sName n) (sFunArg a)
+
+sFunName :: A.FunName a -> FunName
+sFunName (A.FunName _ n ns on) = FunName (sName n) (map sName ns) (fmap sName on)
+
+sFunBody :: A.FunBody a -> FunBody
+sFunBody (A.FunBody _ ns vararg b) =
+    FunBody (map sName ns) (maybe False (const True) vararg) (sBlock b)
+
+sFunDef :: A.FunDef a -> FunDef
+sFunDef (A.FunDef _ fb) = FunDef (sFunBody fb)
+
+sPrefixExp :: A.PrefixExp a -> PrefixExp
+sPrefixExp (A.PEVar _ v) = PEVar (sVar v)
+sPrefixExp (A.PEFunCall _ fc) = PEFunCall (sFunCall fc)
+sPrefixExp (A.Paren _ e) = Paren (sExp e)
+
+sTable :: A.Table a -> Table
+sTable (A.Table _ fs) = Table (map sTableField fs)
+
+sBinop :: A.Binop a -> Binop
+sBinop A.Add{} = Add
+sBinop A.Sub{} = Sub
+sBinop A.Mul{} = Mul
+sBinop A.Div{} = Div
+sBinop A.Exp{} = Exp
+sBinop A.Mod{} = Mod
+sBinop A.Concat{} = Concat
+sBinop A.LT{} = LT
+sBinop A.LTE{} = LTE
+sBinop A.GT{} = GT
+sBinop A.GTE{} = GTE
+sBinop A.EQ{} = EQ
+sBinop A.NEQ{} = NEQ
+sBinop A.And{} = And
+sBinop A.Or{} = Or
+
+sUnop :: A.Unop a -> Unop
+sUnop A.Neg{} = Neg
+sUnop A.Not{} = Not
+sUnop A.Len{} = Len
+
+sFunArg :: A.FunArg a -> FunArg
+sFunArg (A.Args _ es) = Args (map sExp es)
+sFunArg (A.TableArg _ t) = TableArg (sTable t)
+sFunArg (A.StringArg _ s) = StringArg s
+
+sTableField :: A.TableField a -> TableField
+sTableField (A.ExpField _ e1 e2) = ExpField (sExp e1) (sExp e2)
+sTableField (A.NamedField _ n e) = NamedField (sName n) (sExp e)
+sTableField (A.Field _ e) = Field (sExp e)
diff --git a/src/Language/Lua/Annotated/Syntax.hs b/src/Language/Lua/Annotated/Syntax.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Lua/Annotated/Syntax.hs
@@ -0,0 +1,262 @@
+{-# LANGUAGE DeriveFunctor #-}
+
+-- | Lua 5.2 syntax tree, as specified in <http://www.lua.org/manual/5.2/manual.html#9>.
+-- Annotation implementation is inspired by haskell-src-exts.
+module Language.Lua.Annotated.Syntax where
+
+import Prelude hiding (LT, EQ, GT)
+
+data Name a = Name a String deriving (Show, Eq, Functor)
+
+data Stat a
+    = Assign a [Var a] [Exp a] -- ^var1, var2 .. = exp1, exp2 ..
+    | FunCall a (FunCall a) -- ^function call
+    | Label a (Name a) -- ^label for goto
+    | Break a -- ^break
+    | Goto a (Name a) -- ^goto label
+    | Do a (Block a) -- ^do .. end
+    | While a (Exp a) (Block a) -- ^while .. do .. end
+    | Repeat a (Block a) (Exp a) -- ^repeat .. until ..
+    | If a [(Exp a, Block a)] (Maybe (Block a)) -- ^if .. then .. [elseif ..] [else ..] end
+    | ForRange a (Name a) (Exp a) (Exp a) (Maybe (Exp a)) (Block a) -- ^for x=start, end [, step] do .. end
+    | ForIn a [Name a] [Exp a] (Block a) -- ^for x in .. do .. end
+    | FunAssign a (FunName a) (FunBody a) -- ^function \<var\> (..) .. end
+    | LocalFunAssign a (Name a) (FunBody a) -- ^local function \<var\> (..) .. end
+    | LocalAssign a [Name a] (Maybe [Exp a]) -- ^local var1, var2 .. = exp1, exp2 ..
+    | EmptyStat a -- ^/;/
+    deriving (Show, Eq, Functor)
+
+data Exp a
+    = Nil a
+    | Bool a Bool
+    | Number a String
+    | String a String
+    | Vararg a -- ^/.../
+    | EFunDef a (FunDef a) -- ^/function (..) .. end/
+    | PrefixExp a (PrefixExp a)
+    | TableConst a (Table a) -- ^table constructor
+    | Binop a (Binop a) (Exp a) (Exp a) -- ^binary operators, /+ - * ^ % .. < <= > >= == ~= and or/
+    | Unop a (Unop a) (Exp a) -- ^unary operators, /- not #/
+    deriving (Show, Eq, Functor)
+
+data Var a
+    = VarName a (Name a) -- ^variable
+    | Select a (PrefixExp a) (Exp a) -- ^/table[exp]/
+    | SelectName a (PrefixExp a) (Name a) -- ^/table.variable/
+    deriving (Show, Eq, Functor)
+
+data Binop a = Add a | Sub a | Mul a | Div a | Exp a | Mod a | Concat a
+    | LT a | LTE a | GT a | GTE a | EQ a | NEQ a | And a | Or a
+    deriving (Show, Eq, Functor)
+
+data Unop a = Neg a | Not a | Len a
+    deriving (Show, Eq, Functor)
+
+data PrefixExp a
+    = PEVar a (Var a)
+    | PEFunCall a (FunCall a)
+    | Paren a (Exp a)
+    deriving (Show, Eq, Functor)
+
+data Table a = Table a [TableField a] -- ^list of table fields
+    deriving (Show, Eq, Functor)
+
+data TableField a
+    = ExpField a (Exp a) (Exp a) -- ^/[exp] = exp/
+    | NamedField a (Name a) (Exp a) -- ^/name = exp/
+    | Field a (Exp a)
+    deriving (Show, Eq, Functor)
+
+-- | A block is list of statements with optional return statement.
+data Block a = Block a [Stat a] (Maybe [Exp a])
+    deriving (Show, Eq, Functor)
+
+data FunName a = FunName a (Name a) [Name a] (Maybe (Name a))
+    deriving (Show, Eq, Functor)
+
+data FunDef a = FunDef a (FunBody a)
+    deriving (Show, Eq, Functor)
+
+data FunBody a = FunBody a [Name a] (Maybe a) (Block a) -- ^(args, vararg, block)
+    deriving (Show, Eq, Functor)
+
+data FunCall a
+    = NormalFunCall a (PrefixExp a) (FunArg a) -- ^/prefixexp ( funarg )/
+    | MethodCall a (PrefixExp a) (Name a) (FunArg a) -- ^/prefixexp : name ( funarg )/
+    deriving (Show, Eq, Functor)
+
+data FunArg a
+    = Args a [Exp a] -- ^list of args
+    | TableArg a (Table a) -- ^table constructor
+    | StringArg a String -- ^string
+    deriving (Show, Eq, Functor)
+
+
+class Functor ast => Annotated ast where
+    -- | Retrieve the annotation of an AST node.
+    ann :: ast l -> l
+    -- | Change the annotation of an AST node. Note that only the annotation of
+    --   the node itself is affected, and not the annotations of any child nodes.
+    --   if all nodes in the AST tree are to be affected, use 'fmap'.
+    amap :: (l -> l) -> ast l -> ast l
+
+instance Annotated Stat where
+    ann (Assign a _ _) = a
+    ann (FunCall a _) = a
+    ann (Label a _) = a
+    ann (Break a) = a
+    ann (Goto a _) = a
+    ann (Do a _) = a
+    ann (While a _ _) = a
+    ann (Repeat a _ _) = a
+    ann (If a _ _) = a
+    ann (ForRange a _ _ _ _ _) = a
+    ann (ForIn a _ _ _) = a
+    ann (FunAssign a _ _) = a
+    ann (LocalFunAssign a _ _) = a
+    ann (LocalAssign a _ _) = a
+    ann (EmptyStat a) = a
+
+    amap f (Assign a x1 x2) = Assign (f a) x1 x2
+    amap f (FunCall a x1) = FunCall (f a) x1
+    amap f (Label a x1) = Label (f a) x1
+    amap f (Break a) = Break (f a)
+    amap f (Goto a x1) = Goto (f a) x1
+    amap f (Do a x1) = Do (f a) x1
+    amap f (While a x1 x2) = While (f a) x1 x2
+    amap f (Repeat a x1 x2) = Repeat (f a) x1 x2
+    amap f (If a x1 x2) = If (f a) x1 x2
+    amap f (ForRange a x1 x2 x3 x4 x5) = ForRange (f a) x1 x2 x3 x4 x5
+    amap f (ForIn a x1 x2 x3) = ForIn (f a) x1 x2 x3
+    amap f (FunAssign a x1 x2) = FunAssign (f a) x1 x2
+    amap f (LocalFunAssign a x1 x2) = LocalFunAssign (f a) x1 x2
+    amap f (LocalAssign a x1 x2) = LocalAssign (f a) x1 x2
+    amap f (EmptyStat a) = EmptyStat (f a)
+
+instance Annotated Exp where
+    ann (Nil a) = a
+    ann (Bool a _) = a
+    ann (Number a _) = a
+    ann (String a _) = a
+    ann (Vararg a) = a
+    ann (EFunDef a _) = a
+    ann (PrefixExp a _) = a
+    ann (TableConst a _) = a
+    ann (Binop a _ _ _) = a
+    ann (Unop a _ _) = a
+
+    amap f (Nil a) = Nil (f a)
+    amap f (Bool a x1) = Bool (f a) x1
+    amap f (Number a x1) = Number (f a) x1
+    amap f (String a x1) = String (f a) x1
+    amap f (Vararg a) = Vararg (f a)
+    amap f (EFunDef a x1) = EFunDef (f a) x1
+    amap f (PrefixExp a x1) = PrefixExp (f a) x1
+    amap f (TableConst a x1) = TableConst (f a) x1
+    amap f (Binop a x1 x2 x3) = Binop (f a) x1 x2 x3
+    amap f (Unop a x1 x2) = Unop (f a) x1 x2
+
+instance Annotated Var where
+    ann (VarName a _) = a
+    ann (Select a _ _) = a
+    ann (SelectName a _ _) = a
+
+    amap f (VarName a x1) = VarName (f a) x1
+    amap f (Select a x1 x2) = Select (f a) x1 x2
+    amap f (SelectName a x1 x2) = SelectName (f a) x1 x2
+
+instance Annotated Binop where
+    ann (Add a) = a
+    ann (Sub a) = a
+    ann (Mul a) = a
+    ann (Div a) = a
+    ann (Exp a) = a
+    ann (Mod a) = a
+    ann (Concat a) = a
+    ann (LT a) = a
+    ann (LTE a) = a
+    ann (GT a) = a
+    ann (GTE a) = a
+    ann (EQ a) = a
+    ann (NEQ a) = a
+    ann (And a) = a
+    ann (Or a) = a
+
+    amap f (Add a) = Add (f a)
+    amap f (Sub a) = Sub (f a)
+    amap f (Mul a) = Mul (f a)
+    amap f (Div a) = Div (f a)
+    amap f (Exp a) = Exp (f a)
+    amap f (Mod a) = Mod (f a)
+    amap f (Concat a) = Concat (f a)
+    amap f (LT a) = LT (f a)
+    amap f (LTE a) = LTE (f a)
+    amap f (GT a) = GT (f a)
+    amap f (GTE a) = GTE (f a)
+    amap f (EQ a) = EQ (f a)
+    amap f (NEQ a) = NEQ (f a)
+    amap f (And a) = And (f a)
+    amap f (Or a) = Or (f a)
+
+instance Annotated Unop where
+    ann (Neg a) = a
+    ann (Not a) = a
+    ann (Len a) = a
+
+    amap f (Neg a) = Neg (f a)
+    amap f (Not a) = Not (f a)
+    amap f (Len a) = Len (f a)
+
+instance Annotated PrefixExp where
+    ann (PEVar a _) = a
+    ann (PEFunCall a _) = a
+    ann (Paren a _) = a
+
+    amap f (PEVar a x1) = PEVar (f a) x1
+    amap f (PEFunCall a x1) = PEFunCall (f a) x1
+    amap f (Paren a x1) = Paren (f a) x1
+
+instance Annotated Table where
+    ann (Table a _) = a
+    amap f (Table a x1) = Table (f a) x1
+
+instance Annotated TableField where
+    ann (ExpField a _ _) = a
+    ann (NamedField a _ _) = a
+    ann (Field a _) = a
+
+    amap f (ExpField a x1 x2) = ExpField (f a) x1 x2
+    amap f (NamedField a x1 x2) = NamedField (f a) x1 x2
+    amap f (Field a x1) = Field (f a) x1
+
+instance Annotated Block where
+    ann (Block a _ _) = a
+    amap f (Block a x1 x2) = Block (f a) x1 x2
+
+instance Annotated FunName where
+    ann (FunName a _ _ _) = a
+    amap f (FunName a x1 x2 x3) = FunName (f a) x1 x2 x3
+
+instance Annotated FunDef where
+    ann (FunDef a _) = a
+    amap f (FunDef a x1) = FunDef (f a) x1
+
+instance Annotated FunBody where
+    ann (FunBody a _ _ _) = a
+    amap f (FunBody a x1 x2 x3) = FunBody (f a) x1 x2 x3
+
+instance Annotated FunCall where
+    ann (NormalFunCall a _ _) = a
+    ann (MethodCall a _ _ _) = a
+
+    amap f (NormalFunCall a x1 x2) = NormalFunCall (f a) x1 x2
+    amap f (MethodCall a x1 x2 x3) = MethodCall (f a) x1 x2 x3
+
+instance Annotated FunArg where
+    ann (Args a _) = a
+    ann (TableArg a _) = a
+    ann (StringArg a _) = a
+
+    amap f (Args a x1) = Args (f a) x1
+    amap f (TableArg a x1) = TableArg (f a) x1
+    amap f (StringArg a x1) = StringArg (f a) x1
diff --git a/src/Language/Lua/Lexer.x b/src/Language/Lua/Lexer.x
deleted file mode 100644
--- a/src/Language/Lua/Lexer.x
+++ /dev/null
@@ -1,282 +0,0 @@
-{
-module Language.Lua.Lexer
-  ( llex
-  , llexFile
-  , LTok
-  , AlexPosn(..)
-  ) where
-
-import Language.Lua.Token
-import Control.Applicative ((<$>))
-import Control.Monad (forM_, unless, when)
-}
-
-%wrapper "monadUserState"
-
-$space = [ \ \t ]                        -- horizontal white space
-
-$letter      = [a-zA-Z_]                 -- first letter of variables
-$identletter = [a-zA-Z_0-9]              -- letters for rest of variables
-
-$digit    = 0-9                          -- decimal digits
-$octdigit = 0-7                          -- octal digits
-$hexdigit = [0-9a-fA-F]                  -- hexadecimal digits
-
-$dqstr    = \0-\255 # [ \" \n ]          -- valid character in a string literal with dquotes
-$sqstr    = \0-\255 # [ \' \n ]          -- valid character in a string literal with quotes
-$longstr  = \0-\255                      -- valid character in a long string
-
--- escape characters
-@charescd  = \\ ([ntvbrfaeE\\\?\"] | $octdigit{1,3} | x$hexdigit+ | X$hexdigit+)
-@charescs  = \\ ([ntvbrfaeE\\\?\'] | $octdigit{1,3} | x$hexdigit+ | X$hexdigit+)
-
-@digits    = $digit+
-@hexdigits = $hexdigit+
-
-@mantpart = (@digits \. @digits) | @digits \. | \. @digits
-@exppart  = [eE][\+\-]? @digits
-
-@hexprefix = 0x | 0X
-@mantparthex = (@hexdigits \. @hexdigits) | @hexdigits \. | \. @hexdigits
-@expparthex  = [pP][\+\-]? @hexdigits
-
-tokens :-
-
-    <0> $white+  ;
-
-    <0> $letter $identletter* { ident }
-
-    <0> @digits                              { tokWValue LTokNum }
-    <0> @digits @exppart                     { tokWValue LTokNum }
-    <0> @mantpart @exppart?                  { tokWValue LTokNum }
-    <0> @hexprefix @hexdigits                { tokWValue LTokNum }
-    <0> @hexprefix @hexdigits @expparthex    { tokWValue LTokNum }
-    <0> @hexprefix @mantparthex @expparthex? { tokWValue LTokNum }
-
-    <0> \"($dqstr|@charescd)*\" { \(posn,_,_,s) l -> return (LTokSLit (tail . init $ take l s), posn) }
-    <0> \'($sqstr|@charescs)*\' { \(posn,_,_,s) l -> return (LTokSLit (tail . init $ take l s), posn) }
-
-    -- long strings
-    <0> \[ \=* \[ \n?        { enterString `andBegin` state_string }
-    <state_string> \] \=* \] { testAndEndString }
-    <state_string> $longstr  { addCharToString }
-
-    <0> "--"                      { enterComment `andBegin` state_comment }
-    <state_comment> . # \n        ;
-    <state_comment> \n            { testAndEndComment }
-    <state_comment> \[ \=* \[ \n? { enterString `andBegin` state_string }
-
-    <0> "+"   { tok LTokPlus }
-    <0> "-"   { tok LTokMinus }
-    <0> "*"   { tok LTokStar }
-    <0> "/"   { tok LTokSlash }
-    <0> "%"   { tok LTokPercent }
-    <0> "^"   { tok LTokExp }
-    <0> "#"   { tok LTokSh }
-    <0> "=="  { tok LTokEqual }
-    <0> "~="  { tok LTokNotequal }
-    <0> "<="  { tok LTokLEq }
-    <0> ">="  { tok LTokGEq }
-    <0> "<"   { tok LTokLT }
-    <0> ">"   { tok LTokGT }
-    <0> "="   { tok LTokAssign }
-    <0> "("   { tok LTokLParen }
-    <0> ")"   { tok LTokRParen }
-    <0> "{"   { tok LTokLBrace }
-    <0> "}"   { tok LTokRBrace }
-    <0> "["   { tok LTokLBracket }
-    <0> "]"   { tok LTokRBracket }
-    <0> "::"  { tok LTokDColon }
-    <0> ";"   { tok LTokSemic }
-    <0> ":"   { tok LTokColon }
-    <0> ","   { tok LTokComma }
-    <0> "."   { tok LTokDot }
-    <0> ".."  { tok LTokDDot }
-    <0> "..." { tok LTokEllipsis }
-
-    \EOF  { tok LTokEof }
-
-{
-
-data AlexUserState = AlexUserState { stringState     :: !Bool
-                                   , stringDelimLen  :: !Int
-                                   , stringPosn      :: !AlexPosn
-                                   , stringValue     :: !String
-                                   -- comments
-                                   , commentState    :: !Bool
-                                   }
-
-alexInitUserState :: AlexUserState
-alexInitUserState = AlexUserState { stringState     = False
-                                  , stringDelimLen  = 0
-                                  , stringPosn      = AlexPn 0 0 0
-                                  , stringValue     = ""
-                                  , commentState    = False
-                                  }
-
-initString :: Int -> AlexPosn -> Alex ()
-initString i posn = Alex $ \s -> Right(s{alex_ust=(alex_ust s){stringState=True,stringValue="",stringDelimLen=i,stringPosn=posn}}, ())
-
-initComment :: Alex ()
-initComment = Alex $ \s -> Right(s{alex_ust=(alex_ust s){commentState=True}}, ())
-
-getStringDelimLen :: Alex Int
-getStringDelimLen = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringDelimLen ust)
-
-getStringPosn :: Alex AlexPosn
-getStringPosn = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringPosn ust)
-
-getStringValue :: Alex String
-getStringValue = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringValue ust)
-
-getStringState :: Alex Bool
-getStringState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringState ust)
-
-getCommentState :: Alex Bool
-getCommentState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, commentState ust)
-
-addCharToStringValue :: Char -> Alex ()
-addCharToStringValue c = Alex $ \s -> Right (s{alex_ust=(alex_ust s){stringValue=c:stringValue (alex_ust s)}}, ())
-
-enterString :: AlexAction LTok
-enterString (posn,_,_,s) len = do
-  initString (if (s !! (len-1) == '\n') then len-1 else len) posn
-  alexMonadScan'
-
-enterComment :: AlexAction LTok
-enterComment _ _ = do
-  initComment
-  alexMonadScan'
-
-addString :: AlexAction LTok
-addString (_,_,_,s) len = do
-  forM_ (take len s) addCharToStringValue
-  alexMonadScan'
-
-addCharToString :: AlexAction LTok
-addCharToString (_,_,_,s) len = do
-  addCharToStringValue (head s)
-  alexMonadScan'
-
-endString :: Alex ()
-endString = Alex $ \s -> Right(s{alex_ust=(alex_ust s){stringState=False}}, ())
-
-endComment :: Alex ()
-endComment = Alex $ \s -> Right(s{alex_ust=(alex_ust s){commentState=False}}, ())
-
-testAndEndComment :: AlexAction LTok
-testAndEndComment _ _ = do
-  ss <- getStringState
-  if ss then alexMonadScan' else endComment >> alexSetStartCode 0 >> alexMonadScan'
-
-testAndEndString :: AlexAction LTok
-testAndEndString (_,_,_,s) len = do
-  startlen <- getStringDelimLen
-  if startlen /= len
-    then do forM_ (take len s) addCharToStringValue
-            alexMonadScan'
-    else do endString
-            alexSetStartCode 0
-            cs <- getCommentState
-            if cs
-              then do
-                endComment
-                alexMonadScan'
-              else do
-                val  <- getStringValue
-                posn <- getStringPosn
-                return (LTokSLit (reverse val), posn)
-
-data EOF = EOF deriving Show
-
--- | Lua token with position information.
-type LTok = (LToken, AlexPosn)
-
--- type AlexAction result = AlexInput -> Int -> Alex result
-
--- Helper to make LTokens with string value (like LTokNum, LTokSLit etc.)
-tokWValue :: (String -> LToken) -> AlexInput -> Int -> Alex LTok
-tokWValue tok (posn,_,_,s) len = return (tok (take len s), posn)
-
-tok :: LToken -> AlexInput -> Int -> Alex LTok
-tok t (posn,_,_,_) _ = return (t, posn)
-
-{-# INLINE ident #-}
-ident :: AlexAction LTok
-ident (posn,_,_,s) len = return (tok, posn)
-  where tok = case (take len s) of
-          "and"      -> LTokAnd
-          "break"    -> LTokBreak
-          "do"       -> LTokDo
-          "else"     -> LTokElse
-          "elseif"   -> LTokElseIf
-          "end"      -> LTokEnd
-          "false"    -> LTokFalse
-          "for"      -> LTokFor
-          "function" -> LTokFunction
-          "goto"     -> LTokGoto
-          "if"       -> LTokIf
-          "in"       -> LTokIn
-          "local"    -> LTokLocal
-          "nil"      -> LTokNil
-          "not"      -> LTokNot
-          "or"       -> LTokOr
-          "repeat"   -> LTokRepeat
-          "return"   -> LTokReturn
-          "then"     -> LTokThen
-          "true"     -> LTokTrue
-          "until"    -> LTokUntil
-          "while"    -> LTokWhile
-          ident'     -> LTokIdent ident'
-
---data AlexPosn = AlexPn !Int  -- absolute character offset
---                       !Int  -- line number
---                       !Int  -- column number
---
---type AlexInput = (AlexPosn,     -- current position,
---                  Char,         -- previous char
---                  [Byte],       -- rest of the bytes for the current char
---                  String)       -- current input string
-
-alexEOF :: Alex LTok
-alexEOF = return (LTokEof, AlexPn (-1) (-1) (-1))
-
-alexMonadScan' :: Alex LTok
-alexMonadScan' = do
-  inp <- alexGetInput
-  sc <- alexGetStartCode
-  case alexScan inp sc of
-    AlexEOF -> do cs <- getCommentState
-                  when cs endString
-                  alexEOF
-    AlexError ((AlexPn _ line col),ch,_,_) -> alexError $ concat
-        [ "lexical error near line: " , show line , " col: " , show col , " at char " , [ch] ]
-    AlexSkip  inp' len -> do
-        alexSetInput inp'
-        alexMonadScan'
-    AlexToken inp' len action -> do
-        alexSetInput inp'
-        action (ignorePendingBytes inp) len
-
-scanner :: String -> Either String [LTok]
-scanner str = runAlex str loop
-  where loop = do
-          t@(tok, _) <- alexMonadScan'
-          if tok == LTokEof
-            then do stringState <- getStringState
-                    if stringState
-                      then alexError "String not closed at end of file"
-                      else return [t]
-            else do toks <- loop
-                    return (t:toks)
-
--- | Lua lexer.
-llex :: String -> [LTok]
-llex s = case scanner s of
-           Left err -> error err
-           Right r  -> r
-
--- | Run Lua lexer on a file.
-llexFile :: FilePath -> IO [LTok]
-llexFile p = llex <$> readFile p
-}
diff --git a/src/Language/Lua/Parser.hs b/src/Language/Lua/Parser.hs
--- a/src/Language/Lua/Parser.hs
+++ b/src/Language/Lua/Parser.hs
@@ -1,7 +1,3 @@
-{-# OPTIONS_GHC -Wall
-                -fno-warn-hi-shadowing
-                -fno-warn-name-shadowing
-                -fno-warn-unused-do-bind #-}
 module Language.Lua.Parser
   ( parseText
   , parseFile
@@ -10,402 +6,22 @@
   , chunk
   ) where
 
-import Prelude hiding (exp, LT, GT, EQ, repeat)
-
-import Language.Lua.Lexer
-import Language.Lua.Token
-import Language.Lua.Types
+import qualified Language.Lua.Annotated.Parser as A
+import Language.Lua.Annotated.Simplify
+import Language.Lua.Syntax
 
-import Text.Parsec hiding (string)
+import Text.Parsec
 import Text.Parsec.LTok
-import Text.Parsec.Expr
-import Control.Applicative ((<*), (<$>), (<*>))
 import Control.Monad (liftM)
 
--- | Runs Lua lexer before parsing. Use @parseText stat@ to parse
--- statements, and @parseText exp@ to parse expressions.
-parseText :: Parsec [LTok] () a -> String -> Either ParseError a
-parseText p s = parse p "<string>" (llex s)
-
--- | Parse a Lua file. You can use @parseText chunk@ to parse a file from a string.
-parseFile :: FilePath -> IO (Either ParseError (Block SourcePos))
-parseFile path = parse chunk path . llex <$> readFile path
-
-parens :: Monad m => ParsecT [LTok] u m a -> ParsecT [LTok] u m a
-parens = between (tok LTokLParen) (tok LTokRParen)
-
-brackets :: Monad m => ParsecT [LTok] u m a -> ParsecT [LTok] u m a
-brackets = between (tok LTokLBracket) (tok LTokRBracket)
-
-name :: Parser (Name SourcePos)
-name = do
-    pos <- getPosition
-    str <- tokenValue <$> anyIdent
-    return $ Name pos str
-
-number :: Parser String
-number = tokenValue <$> anyNum
-
-
-data PrimaryExp a
-    = PName a (Name a)
-    | PParen a (Exp a)
-    deriving (Show, Eq)
-
-data SuffixedExp a
-    = SuffixedExp a (PrimaryExp a) [SuffixExp a]
-    deriving (Show, Eq)
-
-data SuffixExp a
-    = SSelect a (Name a)
-    | SSelectExp a (Exp a)
-    | SSelectMethod a (Name a) (FunArg a)
-    | SFunCall a (FunArg a)
-    deriving (Show, Eq)
-
-primaryExp :: Parser (PrimaryExp SourcePos)
-primaryExp = do
-    pos <- getPosition
-    PName pos <$> name <|> PParen pos <$> parens exp
-
-suffixedExp :: Parser (SuffixedExp SourcePos)
-suffixedExp = SuffixedExp <$> getPosition <*> primaryExp <*> many suffixExp
-
-suffixExp :: Parser (SuffixExp SourcePos)
-suffixExp = selectName <|> selectExp <|> selectMethod <|> funarg
-  where selectName   = SSelect <$> getPosition <*> (tok LTokDot >> name)
-        selectExp    = SSelectExp <$> getPosition <*> brackets exp
-        selectMethod = do
-          pos <- getPosition
-          tok LTokColon
-          SSelectMethod pos <$> name <*> funArg
-        funarg       = SFunCall <$> getPosition <*> funArg
-
-sexpToPexp :: SuffixedExp SourcePos -> PrefixExp SourcePos
-sexpToPexp (SuffixedExp _ t r) = case r of
-    []                                -> t'
-    (SSelect pos sname:xs)            -> iter xs (PEVar     pos (SelectName pos t' sname))
-    (SSelectExp pos sexp:xs)          -> iter xs (PEVar     pos (Select pos t' sexp))
-    (SSelectMethod pos mname args:xs) -> iter xs (PEFunCall pos (MethodCall pos t' mname args))
-    (SFunCall pos args:xs)            -> iter xs (PEFunCall pos (NormalFunCall pos t' args))
-
-  where t' :: PrefixExp SourcePos
-        t' = case t of
-               PName pos name -> PEVar pos (VarName pos name)
-               PParen pos exp -> Paren pos exp
-
-        iter :: [SuffixExp SourcePos] -> PrefixExp SourcePos -> PrefixExp SourcePos
-        iter [] pe                                = pe
-        iter (SSelect pos sname:xs) pe            = iter xs (PEVar pos (SelectName pos pe sname))
-        iter (SSelectExp pos sexp:xs) pe          = iter xs (PEVar pos (Select pos pe sexp))
-        iter (SSelectMethod pos mname args:xs) pe = iter xs (PEFunCall pos (MethodCall pos pe mname args))
-        iter (SFunCall pos args:xs) pe            = iter xs (PEFunCall pos (NormalFunCall pos pe args))
-
--- TODO: improve error messages.
-sexpToVar :: SuffixedExp SourcePos -> Parser (Var SourcePos)
-sexpToVar (SuffixedExp pos (PName _ name) []) = return (VarName pos name)
-sexpToVar (SuffixedExp _ _ []) = fail "syntax error"
-sexpToVar sexp = case sexpToPexp sexp of
-                   PEVar _ var -> return var
-                   _ -> fail "syntax error"
-
-sexpToFunCall :: SuffixedExp SourcePos -> Parser (FunCall SourcePos)
-sexpToFunCall (SuffixedExp _ _ []) = fail "syntax error"
-sexpToFunCall sexp = case sexpToPexp sexp of
-                       PEFunCall _ funcall -> return funcall
-                       _ -> fail "syntax error"
-
-var :: Parser (Var SourcePos)
-var = suffixedExp >>= sexpToVar
-
-funCall :: Parser (FunCall SourcePos)
-funCall = suffixedExp >>= sexpToFunCall
-
-stringlit :: Parser String
-stringlit = tokenValue <$> string
-
-funArg :: Parser (FunArg SourcePos)
-funArg = tableArg <|> stringArg <|> arglist
-  where tableArg  = TableArg <$> getPosition <*> table
-        stringArg = StringArg <$> getPosition <*> stringlit
-        arglist   = do
-          pos <- getPosition
-          parens (do exps <- exp `sepBy` tok LTokComma
-                     return $ Args pos exps)
-
-funBody :: Parser (FunBody SourcePos)
-funBody = do
-    pos <- getPosition
-    (params, vararg) <- arglist
-    body <- block
-    tok LTokEnd
-    return $ FunBody pos params vararg body
-
-  where lastarg = do
-          pos <- getPosition
-          arg <- optionMaybe (tok LTokEllipsis <|> tok LTokComma)
-          case arg of
-            Just LTokEllipsis -> return (Just pos)
-            _ -> return Nothing
-
-        arglist = parens $ do
-          vars <- name `sepEndBy` tok LTokComma
-          vararg <- lastarg
-          return (vars, vararg)
-
-block :: Parser (Block SourcePos)
-block = do
-  pos <- getPosition
-  stats <- many stat
-  ret <- optionMaybe retstat
-  return $ Block pos stats ret
-
-retstat :: Parser [Exp SourcePos]
-retstat = do
-  tok LTokReturn
-  exps <- exp `sepBy` tok LTokComma
-  optional (tok LTokSemic)
-  return exps
-
-tableField :: Parser (TableField SourcePos)
-tableField = choice [ expField, try namedField, field ]
-  where expField :: Parser (TableField SourcePos)
-        expField = do
-            pos <- getPosition
-            e1 <- brackets exp
-            tok LTokAssign
-            e2 <- exp
-            return $ ExpField pos e1 e2
-
-        namedField :: Parser (TableField SourcePos)
-        namedField = do
-            pos <- getPosition
-            name' <- name
-            tok LTokAssign
-            val <- exp
-            return $ NamedField pos name' val
-
-        field :: Parser (TableField SourcePos)
-        field = Field <$> getPosition <*> exp
-
-table :: Parser (Table SourcePos)
-table = do
-    pos <- getPosition
-    between (tok LTokLBrace)
-            (tok LTokRBrace)
-            (do fields <- tableField `sepEndBy` fieldSep
-                return $ Table pos fields)
-  where fieldSep = tok LTokComma <|> tok LTokSemic
-
------------------------------------------------------------------------
----- Expressions
-
-nilExp, boolExp, numberExp, stringExp, varargExp, fundefExp,
-  prefixexpExp, tableconstExp, exp, exp' :: Parser (Exp SourcePos)
-
-nilExp = (Nil <$> getPosition) <* tok LTokNil
-
-boolExp = do
-    pos <- getPosition
-    tOrF <- tok LTokTrue <|> tok LTokFalse
-    return $ Bool pos (tOrF == LTokTrue)
-
-numberExp = Number <$> getPosition <*> number
-
-stringExp = String <$> getPosition <*> stringlit
-
-varargExp = (Vararg <$> getPosition) <* tok LTokEllipsis
-
-fundefExp = do
-  pos <- getPosition
-  tok LTokFunction
-  body <- funBody
-  return $ EFunDef pos (FunDef (ann body) body)
-
-prefixexpExp = PrefixExp <$> getPosition <*> liftM sexpToPexp suffixedExp
-
-tableconstExp = TableConst <$> getPosition <*> table
-
-binary :: Monad m => LToken -> (SourcePos -> a -> a -> a) -> Assoc -> Operator [LTok] u m a
-binary op fun = Infix (do pos <- getPosition; tok op; return $ fun pos)
-
-prefix :: Monad m => LToken -> (SourcePos -> a -> a) -> Operator [LTok] u m a
-prefix op fun = Prefix (do pos <- getPosition; tok op; return $ fun pos)
-
-opTable :: Monad m => SourcePos -> [[Operator [LTok] u m (Exp SourcePos)]]
-opTable pos = [ [ binary LTokExp       (Binop pos . Exp)    AssocRight ]
-              , [ prefix LTokNot       (Unop pos . Not)
-                , prefix LTokSh        (Unop pos . Len)
-                , prefix LTokMinus     (Unop pos . Neg)
-                ]
-              , [ binary LTokStar      (Binop pos . Mul)    AssocLeft
-                , binary LTokSlash     (Binop pos . Div)    AssocLeft
-                , binary LTokPercent   (Binop pos . Mod)    AssocLeft
-                ]
-              , [ binary LTokPlus      (Binop pos . Add)    AssocLeft
-                , binary LTokMinus     (Binop pos . Sub)    AssocLeft
-                ]
-              , [ binary LTokDDot      (Binop pos . Concat) AssocRight ]
-              , [ binary LTokGT        (Binop pos . GT)     AssocLeft
-                , binary LTokLT        (Binop pos . LT)     AssocLeft
-                , binary LTokGEq       (Binop pos . GTE)    AssocLeft
-                , binary LTokLEq       (Binop pos . LTE)    AssocLeft
-                , binary LTokNotequal  (Binop pos . NEQ)    AssocLeft
-                , binary LTokEqual     (Binop pos . EQ)     AssocLeft
-                ]
-              , [ binary LTokAnd       (Binop pos . And)    AssocLeft ]
-              , [ binary LTokOr        (Binop pos . Or)     AssocLeft ]
-              ]
-opExp :: SourcePos -> Parser (Exp SourcePos)
-opExp pos = buildExpressionParser (opTable pos) exp' <?> "opExp"
-
-exp' = choice [ nilExp, boolExp, numberExp, stringExp, varargExp,
-                fundefExp, prefixexpExp, tableconstExp ]
-
--- | Expression parser.
-exp = choice [ opExp =<< getPosition, nilExp, boolExp, numberExp, stringExp, varargExp,
-               fundefExp, prefixexpExp, tableconstExp ]
-
------------------------------------------------------------------------
----- Statements
-
-emptyStat, assignStat, funCallStat, labelStat, breakStat, gotoStat,
-    doStat, whileStat, repeatStat, ifStat, forRangeStat, forInStat,
-    funAssignStat, localFunAssignStat, localAssignStat, stat :: Parser (Stat SourcePos)
-
-emptyStat = (EmptyStat <$> getPosition) <* tok LTokSemic
-
-assignStat = do
-  pos <- getPosition
-  vars <- var `sepBy` tok LTokComma
-  tok LTokAssign
-  exps <- exp `sepBy` tok LTokComma
-  return $ Assign pos vars exps
-
-funCallStat = FunCall <$> getPosition <*> funCall
-
-labelStat = Label <$> getPosition <*> label
-  where label = between (tok LTokDColon) (tok LTokDColon) name
-
-breakStat = (Break <$> getPosition) <* tok LTokBreak
-
-gotoStat = Goto <$> getPosition <*> (tok LTokGoto >> name)
-
-doStat = Do <$> getPosition <*> between (tok LTokDo) (tok LTokEnd) block
-
-whileStat = do
-  pos <- getPosition
-  between (tok LTokWhile)
-          (tok LTokEnd)
-          (do cond <- exp
-              tok LTokDo
-              body <- block
-              return $ While pos cond body)
-
-repeatStat = do
-  pos <- getPosition
-  tok LTokRepeat
-  body <- block
-  tok LTokUntil
-  cond <- exp
-  return $ Repeat pos body cond
-
-ifStat = do
-    pos <- getPosition
-    between (tok LTokIf)
-            (tok LTokEnd)
-            (do f <- ifPart
-                conds <- many elseifPart
-                l <- optionMaybe elsePart
-                return $ If pos (f:conds) l)
-
-  where ifPart :: Parser (Exp SourcePos, Block SourcePos)
-        ifPart = cond
-
-        elseifPart :: Parser (Exp SourcePos, Block SourcePos)
-        elseifPart = tok LTokElseIf >> cond
-
-        cond :: Parser (Exp SourcePos, Block SourcePos)
-        cond = do
-            cond <- exp
-            tok LTokThen
-            body <- block
-            return (cond, body)
-
-        elsePart :: Parser (Block SourcePos)
-        elsePart = tok LTokElse >> block
-
-forRangeStat = do
-  pos <- getPosition
-  between (tok LTokFor)
-          (tok LTokEnd)
-          (do name' <- name
-              tok LTokAssign
-              start <- exp
-              tok LTokComma
-              end <- exp
-              range <- optionMaybe $ tok LTokComma >> exp
-              tok LTokDo
-              body <- block
-              return $ ForRange pos name' start end range body)
-
-forInStat = do
-  pos <- getPosition
-  between (tok LTokFor)
-          (tok LTokEnd)
-          (do names <- name `sepBy` tok LTokComma
-              tok LTokIn
-              exps <- exp `sepBy` tok LTokComma
-              tok LTokDo
-              body <- block
-              return $ ForIn pos names exps body)
-
-funAssignStat = do
-    pos <- getPosition
-    tok LTokFunction
-    name' <- funName
-    body <- funBody
-    return $ FunAssign pos name' body
-  where funName :: Parser (FunName SourcePos)
-        funName = FunName <$> getPosition
-                          <*> name
-                          <*> many (tok LTokDot >> name)
-                          <*> optionMaybe (tok LTokColon >> name)
-
-localFunAssignStat = do
-  pos <- getPosition
-  tok LTokLocal
-  tok LTokFunction
-  name' <- name
-  body <- funBody
-  return $ LocalFunAssign pos name' body
+parseText :: Parser a -> String -> Either ParseError a
+parseText = A.parseText
 
-localAssignStat = do
-  pos <- getPosition
-  tok LTokLocal
-  names <- name `sepBy` tok LTokComma
-  rest <- optionMaybe $ tok LTokAssign >> exp `sepBy` tok LTokComma
-  return $ LocalAssign pos names rest
+parseFile :: FilePath -> IO (Either ParseError Block)
+parseFile = (liftM . liftM $ sBlock) . A.parseFile
 
--- | Statement parser.
-stat =
-  choice [ emptyStat
-         , try assignStat
-         , try funCallStat
-         , labelStat
-         , breakStat
-         , gotoStat
-         , doStat
-         , whileStat
-         , repeatStat
-         , ifStat
-         , try forRangeStat
-         , forInStat
-         , funAssignStat
-         , try localFunAssignStat
-         , localAssignStat
-         ]
+stat :: Parser Stat
+stat = fmap sStat A.stat
 
--- | Lua file parser.
-chunk :: Parser (Block SourcePos)
-chunk = block <* tok LTokEof
+chunk :: Parser Block
+chunk = fmap sBlock A.chunk
diff --git a/src/Language/Lua/PrettyPrinter.hs b/src/Language/Lua/PrettyPrinter.hs
--- a/src/Language/Lua/PrettyPrinter.hs
+++ b/src/Language/Lua/PrettyPrinter.hs
@@ -1,5 +1,4 @@
-{-# OPTIONS_GHC -Wall
-                -fno-warn-hi-shadowing
+{-# OPTIONS_GHC -fno-warn-hi-shadowing
                 -fno-warn-name-shadowing
                 -fno-warn-unused-do-bind #-}
 {-# LANGUAGE FlexibleInstances #-}
@@ -16,7 +15,7 @@
 import Prelude hiding (EQ, GT, LT)
 import Text.PrettyPrint.Leijen hiding ((<$>))
 
-import Language.Lua.Types
+import Language.Lua.Syntax
 
 intercalate :: Doc -> [Doc] -> Doc
 intercalate s elems = sep (punctuate s elems)
@@ -36,67 +35,64 @@
     pprint True  = text "true"
     pprint False = text "false"
 
-instance LPretty (Name a) where
-    pprint (Name _ s) = text s
-
-instance LPretty (Exp a) where
-    pprint (Nil _)            = text "nil"
-    pprint (Bool _ s)         = pprint s
-    pprint (Number _ n)       = text n
-    pprint (String _ s)       = dquotes (text s)
-    pprint (Vararg _)         = text "..."
-    pprint (EFunDef _ f)      = pprint f
-    pprint (PrefixExp _ pe)   = pprint pe
-    pprint (TableConst _ t)   = pprint t
+instance LPretty Exp where
+    pprint Nil            = text "nil"
+    pprint (Bool s)       = pprint s
+    pprint (Number n)     = text n
+    pprint (String s)     = dquotes (text s)
+    pprint Vararg         = text "..."
+    pprint (EFunDef f)    = pprint f
+    pprint (PrefixExp pe) = pprint pe
+    pprint (TableConst t) = pprint t
 
-    pprint (Binop _ op@And{} e1 e2) = group (nest 4 (pprint e1 <+> pprint op <$> pprint e2))
-    pprint (Binop _ op@Or{} e1 e2) = group (nest 4 (pprint e1 <+> pprint op <$> pprint e2))
-    pprint (Binop _ op e1 e2) = pprint e1 <+> pprint op <+> pprint e2
+    pprint (Binop op@And e1 e2) = group (nest 4 (pprint e1 <+> pprint op <$> pprint e2))
+    pprint (Binop op@Or e1 e2)  = group (nest 4 (pprint e1 <+> pprint op <$> pprint e2))
+    pprint (Binop op e1 e2)     = pprint e1 <+> pprint op <+> pprint e2
 
-    pprint (Unop _ op e)      = pprint op <> pprint e
+    pprint (Unop op e)      = pprint op <> pprint e
 
-instance LPretty (Var a) where
-    pprint (VarName _ n)          = pprint n
-    pprint (Select _ pe e)        = pprint pe <> brackets (pprint e)
-    pprint (SelectName _ pe name) = group (nest 4 (pprint pe <//> (char '.' <> pprint name)))
+instance LPretty Var where
+    pprint (VarName n)          = pprint n
+    pprint (Select pe e)        = pprint pe <> brackets (pprint e)
+    pprint (SelectName pe name) = group (nest 4 (pprint pe <//> (char '.' <> pprint name)))
 
-instance LPretty (Binop a) where
-    pprint Add{}    = char '+'
-    pprint Sub{}    = char '-'
-    pprint Mul{}    = char '*'
-    pprint Div{}    = char '/'
-    pprint Exp{}    = char '^'
-    pprint Mod{}    = char '%'
-    pprint Concat{} = text ".."
-    pprint LT{}     = char '<'
-    pprint LTE{}    = text "<="
-    pprint GT{}     = char '>'
-    pprint GTE{}    = text ">="
-    pprint EQ{}     = text "=="
-    pprint NEQ{}    = text "~="
-    pprint And{}    = text "and"
-    pprint Or{}     = text "or"
+instance LPretty Binop where
+    pprint Add    = char '+'
+    pprint Sub    = char '-'
+    pprint Mul    = char '*'
+    pprint Div    = char '/'
+    pprint Exp    = char '^'
+    pprint Mod    = char '%'
+    pprint Concat = text ".."
+    pprint LT     = char '<'
+    pprint LTE    = text "<="
+    pprint GT     = char '>'
+    pprint GTE    = text ">="
+    pprint EQ     = text "=="
+    pprint NEQ    = text "~="
+    pprint And    = text "and"
+    pprint Or     = text "or"
 
-instance LPretty (Unop a) where
-    pprint Neg{} = char '-'
-    pprint Not{} = text "not "
-    pprint Len{} = char '#'
+instance LPretty Unop where
+    pprint Neg = char '-'
+    pprint Not = text "not "
+    pprint Len = char '#'
 
-instance LPretty (PrefixExp a) where
-    pprint (PEVar _ var)         = pprint var
-    pprint (PEFunCall _ funcall) = pprint funcall
-    pprint (Paren _ e)           = parens (pprint e)
+instance LPretty PrefixExp where
+    pprint (PEVar var)         = pprint var
+    pprint (PEFunCall funcall) = pprint funcall
+    pprint (Paren e)           = parens (pprint e)
 
-instance LPretty (Table a) where
-    pprint (Table _ fields) = braces (nest 4 (cat (punctuate comma (map pprint fields))))
+instance LPretty Table where
+    pprint (Table fields) = braces (nest 4 (cat (punctuate comma (map pprint fields))))
 
-instance LPretty (TableField a) where
-    pprint (ExpField _ e1 e2)    = brackets (pprint e1) <+> equals <+> pprint e2
-    pprint (NamedField _ name e) = pprint name <+> equals <+> pprint e
-    pprint (Field _ e)           = pprint e
+instance LPretty TableField where
+    pprint (ExpField e1 e2)    = brackets (pprint e1) <+> equals <+> pprint e2
+    pprint (NamedField name e) = pprint name <+> equals <+> pprint e
+    pprint (Field e)           = pprint e
 
-instance LPretty (Block a) where
-    pprint (Block _ stats ret) =
+instance LPretty Block where
+    pprint (Block stats ret) =
       case stats of
         [] -> ret'
         _  -> vsep (map pprint stats) <$> ret'
@@ -104,29 +100,27 @@
                      Nothing -> empty
                      Just e  -> nest 2 (text "return" </> (intercalate comma (map pprint e)))
 
-instance LPretty (FunName a) where
-    pprint (FunName _ name s methods) = cat (punctuate dot (map pprint $ name:s)) <> method'
+instance LPretty FunName where
+    pprint (FunName name s methods) = cat (punctuate dot (map pprint $ name:s)) <> method'
       where method' = case methods of
                         Nothing -> empty
                         Just m' -> char ':' <> pprint m'
 
-instance LPretty (FunDef a) where
-    pprint (FunDef _ body) = pprint body
+instance LPretty FunDef where
+    pprint (FunDef body) = pprint body
 
-instance LPretty (FunBody a) where
+instance LPretty FunBody where
     pprint funbody = pprintFunction Nothing funbody
 
-pprintFunction :: Maybe Doc -> FunBody a -> Doc
-pprintFunction funname (FunBody _ args vararg block) =
-    group (nest 4 (header <$> body) <$> text "end")
+pprintFunction :: Maybe Doc -> FunBody -> Doc
+pprintFunction funname (FunBody args vararg block) =
+    group (nest 4 (header <$> body) <$> end)
   where
     header = case funname of
                Nothing -> text "function" <+> args'
                Just n  -> text "function" <+> n <> args'
 
-    vararg' = case vararg of
-                Nothing -> []
-                Just pos -> [Name pos "..."]
+    vararg' = if vararg then ["..."] else []
 
     args' = parens $ case args ++ vararg' of
                        [] -> empty
@@ -136,35 +130,35 @@
 
     end = text "end"
 
-instance LPretty (FunCall a) where
-    pprint (NormalFunCall _ pe arg)     = nest 4 (group (pprint pe <> pprint arg))
-    pprint (MethodCall _ pe method arg) = nest 4 (group (pprint pe <//> colon <> pprint method <> pprint arg))
+instance LPretty FunCall where
+    pprint (NormalFunCall pe arg)     = nest 4 (group (pprint pe <> pprint arg))
+    pprint (MethodCall pe method arg) = nest 4 (group (pprint pe <//> colon <> pprint method <> pprint arg))
 
-instance LPretty (FunArg a) where
-    pprint (Args _ exps)   = case map pprint exps of
-                               [] -> parens empty
-                               l  -> parens (foldr1 (</>) (punctuate comma l))
-    pprint (TableArg _ t)  = pprint t
-    pprint (StringArg _ s) = dquotes (text s)
+instance LPretty FunArg where
+    pprint (Args exps)   = case map pprint exps of
+                             [] -> parens empty
+                             l  -> parens (foldr1 (</>) (punctuate comma l))
+    pprint (TableArg t)  = pprint t
+    pprint (StringArg s) = dquotes (text s)
 
-instance LPretty (Stat a) where
-    pprint (Assign _ names vals)
+instance LPretty Stat where
+    pprint (Assign names vals)
         =   (intercalate comma (map pprint names))
         <+> equals
         <+> (intercalate comma (map pprint vals))
-    pprint (FunCall _ funcall) = pprint funcall
-    pprint (Label _ name)      = text "::" <> pprint name <> text "::"
-    pprint (Break _)           = text "break"
-    pprint (Goto _ name)       = text "goto" <+> pprint name
-    pprint (Do _ block)        = group (nest 4 (text "do" <$> pprint block) <$> text "end")
-    pprint (While _ guard e)
+    pprint (FunCall funcall) = pprint funcall
+    pprint (Label name)      = text "::" <> pprint name <> text "::"
+    pprint Break             = text "break"
+    pprint (Goto name)       = text "goto" <+> pprint name
+    pprint (Do block)        = group (nest 4 (text "do" <$> pprint block) <$> text "end")
+    pprint (While guard e)
         =  (nest 4 (text "while" <+> pprint guard <+> text "do"
                    </> indent 4 (pprint e)))
        </> text "end"
-    pprint (Repeat _ block guard)
+    pprint (Repeat block guard)
         = nest 4 (text "repeat" </> pprint block) </> (nest 4 (text "until" </> pprint guard))
 
-    pprint (If _ cases elsePart) = group (printIf cases elsePart)
+    pprint (If cases elsePart) = group (printIf cases elsePart)
       where
         printIf ((guard, block) : xs) e =
           nest 4 (text "if" <+> pprint guard <+> text "then" <$> pprint block) <$> printIf' xs e
@@ -174,7 +168,7 @@
         printIf' ((guard, block) : xs) e =
           nest 4 (text "elseif" <+> pprint guard <+> text "then" <$> pprint block) <$> printIf' xs e
 
-    pprint (ForRange _ name e1 e2 e3 block)
+    pprint (ForRange name e1 e2 e3 block)
         =   text "for" <+> pprint name <> equals <> pprint e1 <> comma <> pprint e2 <> e3' <+> text "do"
         <$> indent 4 (pprint block)
         <$> text "end"
@@ -182,17 +176,17 @@
                     Nothing -> empty
                     Just e  -> comma <> pprint e
 
-    pprint (ForIn _ names exps block)
+    pprint (ForIn names exps block)
         =   text "for" <+> (intercalate comma (map pprint names))
                 <+> text "in" <+> (intercalate comma (map pprint exps)) <+> text "do"
         <$> indent 4 (pprint block)
         <$> text "end"
 
-    pprint (FunAssign _ name body) = pprintFunction (Just (pprint name)) body
-    pprint (LocalFunAssign _ name body) = text "local" <+> pprintFunction (Just (pprint name)) body
-    pprint (LocalAssign _ names exps)
+    pprint (FunAssign name body) = pprintFunction (Just (pprint name)) body
+    pprint (LocalFunAssign name body) = text "local" <+> pprintFunction (Just (pprint name)) body
+    pprint (LocalAssign names exps)
         = text "local" <+> (intercalate comma (map pprint names)) <+> equals </> exps'
       where exps' = case exps of
                       Nothing -> empty
                       Just es -> intercalate comma (map pprint es)
-    pprint EmptyStat{} = empty
+    pprint EmptyStat = empty
diff --git a/src/Language/Lua/Syntax.hs b/src/Language/Lua/Syntax.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Lua/Syntax.hs
@@ -0,0 +1,91 @@
+{-# OPTIONS_GHC -Wall #-}
+
+-- | Lua 5.2 syntax tree, as specified in <http://www.lua.org/manual/5.2/manual.html#9>.
+module Language.Lua.Syntax where
+
+import Prelude hiding (LT, EQ, GT)
+
+type Name = String
+
+data Stat
+    = Assign [Var] [Exp] -- ^var1, var2 .. = exp1, exp2 ..
+    | FunCall FunCall -- ^function call
+    | Label Name -- ^label for goto
+    | Break -- ^break
+    | Goto Name -- ^goto label
+    | Do Block -- ^do .. end
+    | While Exp Block -- ^while .. do .. end
+    | Repeat Block Exp -- ^repeat .. until ..
+    | If [(Exp, Block)] (Maybe Block) -- ^if .. then .. [elseif ..] [else ..] end
+    | ForRange Name Exp Exp (Maybe Exp) Block -- ^for x=start, end [, step] do .. end
+    | ForIn [Name] [Exp] Block -- ^for x in .. do .. end
+    | FunAssign FunName FunBody -- ^function \<var\> (..) .. end
+    | LocalFunAssign Name FunBody -- ^local function \<var\> (..) .. end
+    | LocalAssign [Name] (Maybe [Exp]) -- ^local var1, var2 .. = exp1, exp2 ..
+    | EmptyStat -- ^/;/
+    deriving (Show, Eq)
+
+data Exp
+    = Nil
+    | Bool Bool
+    | Number String
+    | String String
+    | Vararg -- ^/.../
+    | EFunDef FunDef -- ^/function (..) .. end/
+    | PrefixExp PrefixExp
+    | TableConst Table -- ^table constructor
+    | Binop Binop Exp Exp -- ^binary operators, /+ - * ^ % .. < <= > >= == ~= and or/
+    | Unop Unop Exp -- ^unary operators, /- not #/
+    deriving (Show, Eq)
+
+data Var
+    = VarName Name -- ^variable
+    | Select PrefixExp Exp -- ^/table[exp]/
+    | SelectName PrefixExp Name -- ^/table.variable/
+    deriving (Show, Eq)
+
+data Binop = Add | Sub | Mul | Div | Exp | Mod | Concat
+    | LT | LTE | GT | GTE | EQ | NEQ | And | Or
+    deriving (Show, Eq)
+
+data Unop = Neg | Not | Len
+    deriving (Show, Eq)
+
+data PrefixExp
+    = PEVar Var
+    | PEFunCall FunCall
+    | Paren Exp
+    deriving (Show, Eq)
+
+data Table = Table [TableField] -- ^list of table fields
+    deriving (Show, Eq)
+
+data TableField
+    = ExpField Exp Exp -- ^/[exp] = exp/
+    | NamedField Name Exp -- ^/name = exp/
+    | Field Exp
+    deriving (Show, Eq)
+
+-- | A block is list of statements with optional return statement.
+data Block = Block [Stat] (Maybe [Exp])
+    deriving (Show, Eq)
+
+data FunName = FunName Name [Name] (Maybe Name)
+    deriving (Show, Eq)
+
+data FunDef = FunDef FunBody
+    deriving (Show, Eq)
+
+data FunBody = FunBody [Name] Bool Block -- ^(args, vararg, block)
+    deriving (Show, Eq)
+
+data FunCall
+    = NormalFunCall PrefixExp FunArg -- ^/prefixexp ( funarg )/
+    | MethodCall PrefixExp Name FunArg -- ^/prefixexp : name ( funarg )/
+    deriving (Show, Eq)
+
+data FunArg
+    = Args [Exp] -- ^list of args
+    | TableArg Table -- ^table constructor
+    | StringArg String -- ^string
+    deriving (Show, Eq)
diff --git a/src/Language/Lua/Token.hs b/src/Language/Lua/Token.hs
--- a/src/Language/Lua/Token.hs
+++ b/src/Language/Lua/Token.hs
@@ -1,6 +1,6 @@
 module Language.Lua.Token (LToken(..), tokenValue) where
 
--- ^Lua tokens
+-- | Lua tokens
 data LToken = LTokPlus               -- ^+
             | LTokMinus              -- ^\-
             | LTokStar               -- ^\*
diff --git a/src/Language/Lua/Types.hs b/src/Language/Lua/Types.hs
deleted file mode 100644
--- a/src/Language/Lua/Types.hs
+++ /dev/null
@@ -1,264 +0,0 @@
-{-# OPTIONS_GHC -Wall #-}
-{-# LANGUAGE DeriveFunctor #-}
--- | Lua 5.2 syntax tree, as specified in <http://www.lua.org/manual/5.2/manual.html#9>.
-
--- Annotation implementation is inspired by haskell-src-exts.
-
-module Language.Lua.Types where
-
-import Prelude hiding (LT, EQ, GT)
-
-data Name a = Name a String deriving (Show, Eq, Functor)
-
-data Stat a
-    = Assign a [Var a] [Exp a] -- ^var1, var2 .. = exp1, exp2 ..
-    | FunCall a (FunCall a) -- ^function call
-    | Label a (Name a) -- ^label for goto
-    | Break a -- ^break
-    | Goto a (Name a) -- ^goto label
-    | Do a (Block a) -- ^do .. end
-    | While a (Exp a) (Block a) -- ^while .. do .. end
-    | Repeat a (Block a) (Exp a) -- ^repeat .. until ..
-    | If a [(Exp a, Block a)] (Maybe (Block a)) -- ^if .. then .. [elseif ..] [else ..] end
-    | ForRange a (Name a) (Exp a) (Exp a) (Maybe (Exp a)) (Block a) -- ^for x=start, end [, step] do .. end
-    | ForIn a [Name a] [Exp a] (Block a) -- ^for x in .. do .. end
-    | FunAssign a (FunName a) (FunBody a) -- ^function \<var\> (..) .. end
-    | LocalFunAssign a (Name a) (FunBody a) -- ^local function \<var\> (..) .. end
-    | LocalAssign a [Name a] (Maybe [Exp a]) -- ^local var1, var2 .. = exp1, exp2 ..
-    | EmptyStat a -- ^/;/
-    deriving (Show, Eq, Functor)
-
-data Exp a
-    = Nil a
-    | Bool a Bool
-    | Number a String
-    | String a String
-    | Vararg a -- ^/.../
-    | EFunDef a (FunDef a) -- ^/function (..) .. end/
-    | PrefixExp a (PrefixExp a)
-    | TableConst a (Table a) -- ^table constructor
-    | Binop a (Binop a) (Exp a) (Exp a) -- ^binary operators, /+ - * ^ % .. < <= > >= == ~= and or/
-    | Unop a (Unop a) (Exp a) -- ^unary operators, /- not #/
-    deriving (Show, Eq, Functor)
-
-data Var a
-    = VarName a (Name a) -- ^variable
-    | Select a (PrefixExp a) (Exp a) -- ^/table[exp]/
-    | SelectName a (PrefixExp a) (Name a) -- ^/table.variable/
-    deriving (Show, Eq, Functor)
-
-data Binop a = Add a | Sub a | Mul a | Div a | Exp a | Mod a | Concat a
-    | LT a | LTE a | GT a | GTE a | EQ a | NEQ a | And a | Or a
-    deriving (Show, Eq, Functor)
-
-data Unop a = Neg a | Not a | Len a
-    deriving (Show, Eq, Functor)
-
-data PrefixExp a
-    = PEVar a (Var a)
-    | PEFunCall a (FunCall a)
-    | Paren a (Exp a)
-    deriving (Show, Eq, Functor)
-
-data Table a = Table a [TableField a] -- ^list of table fields
-    deriving (Show, Eq, Functor)
-
-data TableField a
-    = ExpField a (Exp a) (Exp a) -- ^/[exp] = exp/
-    | NamedField a (Name a) (Exp a) -- ^/name = exp/
-    | Field a (Exp a)
-    deriving (Show, Eq, Functor)
-
--- | A block is list of statements with optional return statement.
-data Block a = Block a [Stat a] (Maybe [Exp a])
-    deriving (Show, Eq, Functor)
-
-data FunName a = FunName a (Name a) [Name a] (Maybe (Name a))
-    deriving (Show, Eq, Functor)
-
-data FunDef a = FunDef a (FunBody a)
-    deriving (Show, Eq, Functor)
-
-data FunBody a = FunBody a [Name a] (Maybe a) (Block a) -- ^(args, vararg, block)
-    deriving (Show, Eq, Functor)
-
-data FunCall a
-    = NormalFunCall a (PrefixExp a) (FunArg a) -- ^/prefixexp ( funarg )/
-    | MethodCall a (PrefixExp a) (Name a) (FunArg a) -- ^/prefixexp : name ( funarg )/
-    deriving (Show, Eq, Functor)
-
-data FunArg a
-    = Args a [Exp a] -- ^list of args
-    | TableArg a (Table a) -- ^table constructor
-    | StringArg a String -- ^string
-    deriving (Show, Eq, Functor)
-
-
-class Functor ast => Annotated ast where
-    -- | Retrieve the annotation of an AST node.
-    ann :: ast l -> l
-    -- | Change the annotation of an AST node. Note that only the annotation of
-    --   the node itself is affected, and not the annotations of any child nodes.
-    --   if all nodes in the AST tree are to be affected, use 'fmap'.
-    amap :: (l -> l) -> ast l -> ast l
-
-instance Annotated Stat where
-    ann (Assign a _ _) = a
-    ann (FunCall a _) = a
-    ann (Label a _) = a
-    ann (Break a) = a
-    ann (Goto a _) = a
-    ann (Do a _) = a
-    ann (While a _ _) = a
-    ann (Repeat a _ _) = a
-    ann (If a _ _) = a
-    ann (ForRange a _ _ _ _ _) = a
-    ann (ForIn a _ _ _) = a
-    ann (FunAssign a _ _) = a
-    ann (LocalFunAssign a _ _) = a
-    ann (LocalAssign a _ _) = a
-    ann (EmptyStat a) = a
-
-    amap f (Assign a x1 x2) = Assign (f a) x1 x2
-    amap f (FunCall a x1) = FunCall (f a) x1
-    amap f (Label a x1) = Label (f a) x1
-    amap f (Break a) = Break (f a)
-    amap f (Goto a x1) = Goto (f a) x1
-    amap f (Do a x1) = Do (f a) x1
-    amap f (While a x1 x2) = While (f a) x1 x2
-    amap f (Repeat a x1 x2) = Repeat (f a) x1 x2
-    amap f (If a x1 x2) = If (f a) x1 x2
-    amap f (ForRange a x1 x2 x3 x4 x5) = ForRange (f a) x1 x2 x3 x4 x5
-    amap f (ForIn a x1 x2 x3) = ForIn (f a) x1 x2 x3
-    amap f (FunAssign a x1 x2) = FunAssign (f a) x1 x2
-    amap f (LocalFunAssign a x1 x2) = LocalFunAssign (f a) x1 x2
-    amap f (LocalAssign a x1 x2) = LocalAssign (f a) x1 x2
-    amap f (EmptyStat a) = EmptyStat (f a)
-
-instance Annotated Exp where
-    ann (Nil a) = a
-    ann (Bool a _) = a
-    ann (Number a _) = a
-    ann (String a _) = a
-    ann (Vararg a) = a
-    ann (EFunDef a _) = a
-    ann (PrefixExp a _) = a
-    ann (TableConst a _) = a
-    ann (Binop a _ _ _) = a
-    ann (Unop a _ _) = a
-
-    amap f (Nil a) = Nil (f a)
-    amap f (Bool a x1) = Bool (f a) x1
-    amap f (Number a x1) = Number (f a) x1
-    amap f (String a x1) = String (f a) x1
-    amap f (Vararg a) = Vararg (f a)
-    amap f (EFunDef a x1) = EFunDef (f a) x1
-    amap f (PrefixExp a x1) = PrefixExp (f a) x1
-    amap f (TableConst a x1) = TableConst (f a) x1
-    amap f (Binop a x1 x2 x3) = Binop (f a) x1 x2 x3
-    amap f (Unop a x1 x2) = Unop (f a) x1 x2
-
-instance Annotated Var where
-    ann (VarName a _) = a
-    ann (Select a _ _) = a
-    ann (SelectName a _ _) = a
-
-    amap f (VarName a x1) = VarName (f a) x1
-    amap f (Select a x1 x2) = Select (f a) x1 x2
-    amap f (SelectName a x1 x2) = SelectName (f a) x1 x2
-
-instance Annotated Binop where
-    ann (Add a) = a
-    ann (Sub a) = a
-    ann (Mul a) = a
-    ann (Div a) = a
-    ann (Exp a) = a
-    ann (Mod a) = a
-    ann (Concat a) = a
-    ann (LT a) = a
-    ann (LTE a) = a
-    ann (GT a) = a
-    ann (GTE a) = a
-    ann (EQ a) = a
-    ann (NEQ a) = a
-    ann (And a) = a
-    ann (Or a) = a
-
-    amap f (Add a) = Add (f a)
-    amap f (Sub a) = Sub (f a)
-    amap f (Mul a) = Mul (f a)
-    amap f (Div a) = Div (f a)
-    amap f (Exp a) = Exp (f a)
-    amap f (Mod a) = Mod (f a)
-    amap f (Concat a) = Concat (f a)
-    amap f (LT a) = LT (f a)
-    amap f (LTE a) = LTE (f a)
-    amap f (GT a) = GT (f a)
-    amap f (GTE a) = GTE (f a)
-    amap f (EQ a) = EQ (f a)
-    amap f (NEQ a) = NEQ (f a)
-    amap f (And a) = And (f a)
-    amap f (Or a) = Or (f a)
-
-instance Annotated Unop where
-    ann (Neg a) = a
-    ann (Not a) = a
-    ann (Len a) = a
-
-    amap f (Neg a) = Neg (f a)
-    amap f (Not a) = Not (f a)
-    amap f (Len a) = Len (f a)
-
-instance Annotated PrefixExp where
-    ann (PEVar a _) = a
-    ann (PEFunCall a _) = a
-    ann (Paren a _) = a
-
-    amap f (PEVar a x1) = PEVar (f a) x1
-    amap f (PEFunCall a x1) = PEFunCall (f a) x1
-    amap f (Paren a x1) = Paren (f a) x1
-
-instance Annotated Table where
-    ann (Table a _) = a
-    amap f (Table a x1) = Table (f a) x1
-
-instance Annotated TableField where
-    ann (ExpField a _ _) = a
-    ann (NamedField a _ _) = a
-    ann (Field a _) = a
-
-    amap f (ExpField a x1 x2) = ExpField (f a) x1 x2
-    amap f (NamedField a x1 x2) = NamedField (f a) x1 x2
-    amap f (Field a x1) = Field (f a) x1
-
-instance Annotated Block where
-    ann (Block a _ _) = a
-    amap f (Block a x1 x2) = Block (f a) x1 x2
-
-instance Annotated FunName where
-    ann (FunName a _ _ _) = a
-    amap f (FunName a x1 x2 x3) = FunName (f a) x1 x2 x3
-
-instance Annotated FunDef where
-    ann (FunDef a _) = a
-    amap f (FunDef a x1) = FunDef (f a) x1
-
-instance Annotated FunBody where
-    ann (FunBody a _ _ _) = a
-    amap f (FunBody a x1 x2 x3) = FunBody (f a) x1 x2 x3
-
-instance Annotated FunCall where
-    ann (NormalFunCall a _ _) = a
-    ann (MethodCall a _ _ _) = a
-
-    amap f (NormalFunCall a x1 x2) = NormalFunCall (f a) x1 x2
-    amap f (MethodCall a x1 x2 x3) = MethodCall (f a) x1 x2 x3
-
-instance Annotated FunArg where
-    ann (Args a _) = a
-    ann (TableArg a _) = a
-    ann (StringArg a _) = a
-
-    amap f (Args a x1) = Args (f a) x1
-    amap f (TableArg a x1) = TableArg (f a) x1
-    amap f (StringArg a x1) = StringArg (f a) x1
diff --git a/src/Text/Parsec/LTok.hs b/src/Text/Parsec/LTok.hs
--- a/src/Text/Parsec/LTok.hs
+++ b/src/Text/Parsec/LTok.hs
@@ -4,7 +4,7 @@
 -- | Lexer/Parsec interface
 module Text.Parsec.LTok where
 
-import Language.Lua.Lexer (LTok, AlexPosn(..))
+import Language.Lua.Annotated.Lexer (LTok, AlexPosn(..))
 import Language.Lua.Token
 
 import Text.Parsec hiding (satisfy)
diff --git a/src/Text/PrettyPrint/Leijen.hs b/src/Text/PrettyPrint/Leijen.hs
--- a/src/Text/PrettyPrint/Leijen.hs
+++ b/src/Text/PrettyPrint/Leijen.hs
@@ -1,3 +1,4 @@
+{-# OPTIONS_GHC -w #-}
 {-# OPTIONS_HADDOCK hide #-}
 -----------------------------------------------------------------------------
 -- |
