diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,25 @@
+Copyright (c) 2011, Thomas Gibson-Robinson
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the author nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THOMAS GIBSON-ROBINSON BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,68 @@
+libcspm
+========
+
+This library provides a [FDR](http://www.fsel.com/software.html)-compliant
+parser, type checker and (experimental) evaluator for machine CSP files.
+
+There is also a program, `cspmchecker`, that makes use of this library to
+provide command line type checking.
+
+Installation
+------------
+
+The simplest method is to install via [Hackage](http://hackage.haskell.org/).
+`cabal install cspmchecker` will install cspmchecker and its dependencies.
+
+Otherwise, if you obtain a source distribution then the following commands 
+will install `libcspm`.
+
+    cabal configure
+    cabal build
+    cabal install
+
+To install `cspmchecker`, firstly install `libcspm` as above, then change
+directory to `cspmchecker` and run the following commands.
+
+    cabal configure
+    cabal build
+    cabal install
+
+This should make `cspmchecker` available from your command line shell
+(if not check that the location `cabal` installs binaries to is on your 
+`$PATH`).
+
+Usage of cspmchecker
+----------------------
+
+From a command line shell simply do `cspmchecker file.csp` to type check
+the files. Any error messages will be printed out. For example:
+
+    $ cspmchecker ucsexamples/chapter04/abp.csp 
+    Checking ucsexamples/chapter04/abp.csp.....
+    ucsexamples/chapter04/abp.csp:80:36-39:
+        Couldn't match expected type Int.Int with actual type Int
+        In the expression: bit
+        In the expression: ack == bit
+        In the expression: (ack == bit)
+
+Documentation of the type system is forthcoming.
+
+Usage of libcspm
+----------------
+
+See http://tomgr.github.com/libcspm/doc/libcspm/index.html for documentation.
+
+Testing
+-------
+
+To test `libcspm` run the following commands.
+
+    cabal configure --enable-tests
+    cabal build
+    cabal test
+
+Bug Reports
+-----------
+
+Please files bug reports at https://github.com/tomgr/libcspm/issues. Please
+provide a minimal example script that exhibits the error (if possible).
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,4 @@
+#! /usr/bin/env runhaskell
+
+import Distribution.Simple
+main = defaultMain
diff --git a/dist/build/CSPM/Parser/Lexer.hs b/dist/build/CSPM/Parser/Lexer.hs
new file mode 100644
--- /dev/null
+++ b/dist/build/CSPM/Parser/Lexer.hs
@@ -0,0 +1,503 @@
+{-# LANGUAGE CPP,MagicHash #-}
+{-# LINE 1 "src/CSPM/Parser/Lexer.x" #-}
+
+{-# LANGUAGE DoAndIfThenElse #-}
+{-# OPTIONS_GHC -fno-warn-lazy-unlifted-bindings #-}
+module CSPM.Parser.Lexer where
+
+import Data.List
+
+import Control.Monad.Trans
+import CSPM.DataStructures.Tokens
+import CSPM.Parser.Exceptions
+import CSPM.Parser.Monad
+import Util.Annotated
+import Util.Exception
+
+
+#if __GLASGOW_HASKELL__ >= 603
+#include "ghcconfig.h"
+#elif defined(__GLASGOW_HASKELL__)
+#include "config.h"
+#endif
+#if __GLASGOW_HASKELL__ >= 503
+import Data.Array
+import Data.Char (ord)
+import Data.Array.Base (unsafeAt)
+#else
+import Array
+import Char (ord)
+#endif
+#if __GLASGOW_HASKELL__ >= 503
+import GHC.Exts
+#else
+import GlaExts
+#endif
+alex_base :: AlexAddr
+alex_base = AlexA# "\xf8\xff\xff\xff\x6d\x00\x00\x00\x72\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\xba\x00\x00\x00\x2f\x01\x00\x00\xa4\x01\x00\x00\x19\x02\x00\x00\x8e\x02\x00\x00\x03\x03\x00\x00\x7b\x00\x00\x00\x7c\x00\x00\x00\xfc\xff\xff\xff\xfd\xff\xff\xff\xfe\xff\xff\xff\x7d\x00\x00\x00\x7e\x00\x00\x00\x7f\x00\x00\x00\x80\x00\x00\x00\x81\x00\x00\x00\x82\x00\x00\x00\x84\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x87\x00\x00\x00\xff\xff\xff\xff\x01\x00\x00\x00\x02\x00\x00\x00\xf4\x00\x00\x00\xe1\xff\xff\xff\x67\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\xea\xff\xff\xff\xac\xff\xff\xff\x9a\xff\xff\xff\xf0\xff\xff\xff\xa1\xff\xff\xff\xa0\xff\xff\xff\xaa\xff\xff\xff\xa5\xff\xff\xff\xa3\xff\xff\xff\xad\xff\xff\xff\xa6\xff\xff\xff\x9e\xff\xff\xff\x00\x00\x00\x00\xe9\xff\xff\xff\x1d\x00\x00\x00\x33\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x37\x00\x00\x00\x3c\x00\x00\x00\x3a\x00\x00\x00\x2f\x00\x00\x00\x32\x00\x00\x00\x3f\x00\x00\x00\x38\x00\x00\x00\x95\x00\x00\x00\x50\x00\x00\x00\x45\x00\x00\x00\x53\x00\x00\x00\x54\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x48\x00\x00\x00\x57\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\x4a\x00\x00\x00\x59\x00\x00\x00\x5d\x00\x00\x00\x52\x00\x00\x00\x6a\x00\x00\x00\x60\x00\x00\x00\xaf\x00\x00\x00\x66\x00\x00\x00\x5c\x00\x00\x00\x6b\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x62\x00\x00\x00\x71\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x61\x00\x00\x00\x78\x00\x00\x00\x70\x00\x00\x00\x94\x00\x00\x00\x97\x00\x00\x00\x96\x00\x00\x00\x9f\x00\x00\x00\x9e\x00\x00\x00\xe5\x00\x00\x00\xa0\x00\x00\x00\x98\x00\x00\x00\xa2\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x9a\x00\x00\x00\xa4\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x9d\x00\x00\x00\xa6\x00\x00\x00\xa7\x00\x00\x00\xac\x00\x00\x00\xb3\x00\x00\x00\xaa\x00\x00\x00\xae\x00\x00\x00\xb5\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\x3d\x03\x00\x00\x07\x01\x00\x00\x1b\x01\x00\x00\xfa\x00\x00\x00\xed\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\xe7\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x00\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x69\x01\x00\x00\x6f\x01\x00\x00\x43\x03\x00\x00\x01\x01\x00\x00\x36\x01\x00\x00\x38\x01\x00\x00\x18\x01\x00\x00\x77\x01\x00\x00\xde\x01\x00\x00\x0a\x01\x00\x00\x3e\x01\x00\x00\x40\x01\x00\x00\x1e\x01\x00\x00\xe4\x01\x00\x00\xec\x01\x00\x00\x0f\x01\x00\x00\x43\x01\x00\x00\x47\x01\x00\x00\x25\x01\x00\x00\x53\x02\x00\x00\x59\x02\x00\x00\x33\x01\x00\x00\x4c\x01\x00\x00\x4d\x01\x00\x00\x44\x01\x00\x00\x61\x02\x00\x00\xc8\x02\x00\x00\x41\x01\x00\x00\x73\x01\x00\x00\x75\x01\x00\x00\x58\x01\x00\x00\xce\x02\x00\x00\xd6\x02\x00\x00\x55\x01\x00\x00\x7c\x01\x00\x00\x7d\x01\x00\x00\x5b\x01\x00\x00\x4b\x03\x00\x00\x7a\x03\x00\x00\x54\x01\x00\x00\x89\x01\x00\x00\x90\x01\x00\x00\x72\x01\x00\x00\x81\x03\x00\x00\x96\x01\x00\x00\x97\x01\x00\x00\x78\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7b\x01\x00\x00\x86\x03\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00\x48\x01\x00\x00\xd8\x03\x00\x00\x46\x01\x00\x00\x2c\x04\x00\x00\x49\x01\x00\x00\x80\x04\x00\x00\x3d\x01\x00\x00\xd4\x04\x00\x00\x1f\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x05\x00\x00\x4b\x01\x00\x00\xc7\x05\x00\x00\x45\x01\x00\x00\x1b\x06\x00\x00\x56\x01\x00\x00\x6f\x06\x00\x00\xba\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x02\x00\x00\xaf\x01\x00\x00\x2c\x07\x00\x00\x80\x07\x00\x00\xd4\x07\x00\x00\x28\x08\x00\x00\x7c\x08\x00\x00\xd0\x08\x00\x00\x24\x09\x00\x00\x39\x07\x00\x00\x96\x09\x00\x00\xb4\x01\x00\x00\xb5\x01\x00\x00\x93\x01\x00\x00\x9b\x09\x00\x00\xa0\x09\x00\x00\xa5\x09\x00\x00\x4a\x01\x00\x00\xb7\x01\x00\x00\xb8\x01\x00\x00\x9a\x01\x00\x00\xca\x09\x00\x00\xcf\x09\x00\x00\xd4\x09\x00\x00\xb9\x01\x00\x00\xc2\x01\x00\x00\xbf\x01\x00\x00\xdb\x09\x00\x00\xfa\x09\x00\x00\x00\x0a\x00\x00\xdb\x01\x00\x00\xdc\x01\x00\x00\xc5\x01\x00\x00\x05\x0a\x00\x00\x0a\x0a\x00\x00\xe9\x01\x00\x00\xea\x01\x00\x00\xcd\x01\x00\x00\x31\x0a\x00\x00\x36\x0a\x00\x00\xf1\x01\x00\x00\xf2\x01\x00\x00\xd0\x01\x00\x00\x3b\x0a\x00\x00\x40\x0a\x00\x00\xfc\x01\x00\x00\xfd\x01\x00\x00\xe1\x01\x00\x00\x65\x0a\x00\x00\xfe\x01\x00\x00\x05\x02\x00\x00\xe7\x01\x00\x00\x6a\x0a\x00\x00\x6f\x0a\x00\x00\x0b\x02\x00\x00\x0c\x02\x00\x00\xed\x01\x00\x00\x74\x0a\x00\x00\x99\x0a\x00\x00\x0d\x02\x00\x00\x12\x02\x00\x00\xf0\x01\x00\x00\x00\x00\x00\x00\x8a\x0a\x00\x00\xb0\x01\x00\x00\xde\x0a\x00\x00\xc3\x01\x00\x00\x32\x0b\x00\x00\x7d\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x0b\x00\x00\xb6\x01\x00\x00\x25\x0c\x00\x00\x70\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x0c\x00\x00\xc0\x01\x00\x00\x18\x0d\x00\x00\xba\x01\x00\x00\x6c\x0d\x00\x00\xb7\x0d\x00\x00\x00\x00\x00\x00\x29\x0e\x00\x00\x2e\x0e\x00\x00\x33\x0e\x00\x00\x26\x02\x00\x00\x27\x02\x00\x00\x06\x02\x00\x00\x38\x0e\x00\x00\x5d\x0e\x00\x00\x62\x0e\x00\x00\x28\x02\x00\x00\x2a\x02\x00\x00\x08\x02\x00\x00\x68\x0e\x00\x00\x6d\x0e\x00\x00\x87\x0e\x00\x00\x34\x02\x00\x00\x2c\x02\x00\x00\x2d\x02\x00\x00\x0e\x02\x00\x00\x99\x0e\x00\x00\x9f\x0e\x00\x00\xfb\x01\x00\x00\x32\x02\x00\x00\x37\x02\x00\x00\x2e\x02\x00\x00\x00\x00\x00\x00\xb1\x0e\x00\x00\xc9\x0e\x00\x00\xce\x0e\x00\x00\x50\x02\x00\x00\x5d\x02\x00\x00\x5e\x02\x00\x00\x5f\x02\x00\x00\x65\x02\x00\x00\x66\x02\x00\x00\x45\x02\x00\x00\xd7\x0e\x00\x00\x4e\x02\x00\x00\xe7\x0e\x00\x00\xf3\x0e\x00\x00\x72\x02\x00\x00\x73\x02\x00\x00\x56\x02\x00\x00\x00\x00\x00\x00\xff\x0e\x00\x00\x04\x0f\x00\x00\x7a\x02\x00\x00\x7f\x02\x00\x00\x62\x02\x00\x00\x00\x00\x00\x00\x0d\x0f\x00\x00\x80\x02\x00\x00\x82\x02\x00\x00\x64\x02\x00\x00\x00\x00\x00\x00\x1c\x0f\x00\x00\x2a\x0f\x00\x00\x88\x02\x00\x00\x89\x02\x00\x00\x6f\x02\x00\x00\x00\x00\x00\x00\x34\x0f\x00\x00\x39\x0f\x00\x00\x42\x0f\x00\x00\x93\x02\x00\x00\x94\x02\x00\x00\x74\x02\x00\x00\x51\x0f\x00\x00\x5f\x0f\x00\x00\x95\x02\x00\x00\x96\x02\x00\x00\x75\x02\x00\x00\x69\x0f\x00\x00\x99\x02\x00\x00\x9a\x02\x00\x00\x78\x02\x00\x00\x6e\x0f\x00\x00\x9c\x02\x00\x00\x9d\x02\x00\x00\x7b\x02\x00\x00\x77\x0f\x00\x00\x9f\x02\x00\x00\xa0\x02\x00\x00\x7e\x02\x00\x00\x93\x0f\x00\x00\x9c\x0f\x00\x00\xa2\x02\x00\x00\xa3\x02\x00\x00\x83\x02\x00\x00\xa1\x0f\x00\x00\xab\x0f\x00\x00\xb9\x0f\x00\x00\xa7\x02\x00\x00\xab\x02\x00\x00\xa9\x02\x00\x00\xc8\x0f\x00\x00\xac\x02\x00\x00\xc5\x02\x00\x00\xaf\x02\x00\x00\xd1\x0f\x00\x00\xd6\x0f\x00\x00\xc6\x02\x00\x00\xd3\x02\x00\x00\xb1\x02\x00\x00\xe0\x0f\x00\x00\xda\x02\x00\x00\xdb\x02\x00\x00\xb9\x02\x00\x00\xee\x0f\x00\x00\xfc\x0f\x00\x00\xdd\x02\x00\x00\xe6\x02\x00\x00\xc4\x02\x00\x00\x06\x10\x00\x00\x0b\x10\x00\x00\xe8\x02\x00\x00\xee\x02\x00\x00\xcc\x02\x00\x00\x14\x10\x00\x00\x23\x10\x00\x00\xf4\x02\x00\x00\xf5\x02\x00\x00\xd4\x02\x00\x00\x31\x10\x00\x00\xf6\x02\x00\x00\xfa\x02\x00\x00\xd9\x02\x00\x00\x3c\x10\x00\x00\x41\x10\x00\x00\x4a\x10\x00\x00\xfd\x02\x00\x00\xfe\x02\x00\x00\xe4\x02\x00\x00\x59\x10\x00\x00\x08\x03\x00\x00\x09\x03\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\x4b\x10\x00\x00\xb0\x02\x00\x00\x96\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x10\x00\x00\xb2\x02\x00\x00\x3e\x11\x00\x00\xaa\x02\x00\x00\x92\x11\x00\x00\xdd\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x12\x00\x00\xad\x02\x00\x00\x85\x12\x00\x00\xa8\x02\x00\x00\xd9\x12\x00\x00\xb5\x02\x00\x00\x2d\x13\x00\x00\x78\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x13\x00\x00\xb7\x02\x00\x00\x20\x14\x00\x00\xa1\x02\x00\x00\x74\x14\x00\x00\xbf\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x15\x00\x00\xb4\x02\x00\x00\x67\x15\x00\x00\xae\x02\x00\x00\xbb\x15\x00\x00\xb6\x02\x00\x00\x0f\x16\x00\x00\xb8\x02\x00\x00\x63\x16\x00\x00\xbc\x02\x00\x00\xb7\x16\x00\x00\x02\x17\x00\x00\x00\x00\x00\x00\x56\x17\x00\x00\xaa\x17\x00\x00\xfe\x17\x00\x00\x52\x18\x00\x00\xa6\x18\x00\x00\xfa\x18\x00\x00\x4e\x19\x00\x00\x99\x19\x00\x00\x00\x00\x00\x00\xed\x19\x00\x00\x41\x1a\x00\x00\x95\x1a\x00\x00\xe9\x1a\x00\x00\x3d\x1b\x00\x00\x88\x1b\x00\x00\x00\x00\x00\x00\xdc\x1b\x00\x00\x30\x1c\x00\x00\x84\x1c\x00\x00\xd8\x1c\x00\x00\x2c\x1d\x00\x00\x80\x1d\x00\x00\xd4\x1d\x00\x00\x28\x1e\x00\x00\x73\x1e\x00\x00\x00\x00\x00\x00\xc7\x1e\x00\x00\x1b\x1f\x00\x00\x6f\x1f\x00\x00\xc3\x1f\x00\x00\x17\x20\x00\x00\x6b\x20\x00\x00\xbf\x20\x00\x00\x0a\x21\x00\x00\x00\x00\x00\x00\x5e\x21\x00\x00\xb2\x21\x00\x00\x06\x22\x00\x00\x5a\x22\x00\x00\xae\x22\x00\x00\x02\x23\x00\x00\x56\x23\x00\x00\xaa\x23\x00\x00\xfe\x23\x00\x00\x49\x24\x00\x00\x00\x00\x00\x00\x9d\x24\x00\x00\xf1\x24\x00\x00\x45\x25\x00\x00\x99\x25\x00\x00\xed\x25\x00\x00\x41\x26\x00\x00\x95\x26\x00\x00\xe0\x26\x00\x00\x00\x00\x00\x00\x52\x27\x00\x00\x57\x27\x00\x00\x15\x03\x00\x00\x16\x03\x00\x00\xf8\x02\x00\x00\x5c\x27\x00\x00\x1c\x03\x00\x00\x21\x03\x00\x00\x17\x03\x00\x00\x61\x27\x00\x00\x86\x27\x00\x00\x3b\x03\x00\x00\x41\x03\x00\x00\x24\x03\x00\x00\x8b\x27\x00\x00\x48\x03\x00\x00\x49\x03\x00\x00\x2c\x03\x00\x00\x90\x27\x00\x00\x95\x27\x00\x00\x50\x03\x00\x00\x51\x03\x00\x00\x2f\x03\x00\x00\xba\x27\x00\x00\x5b\x03\x00\x00\x5c\x03\x00\x00\x3a\x03\x00\x00\xbf\x27\x00\x00\xc4\x27\x00\x00\x63\x03\x00\x00\x64\x03\x00\x00\x46\x03\x00\x00\xc9\x27\x00\x00\xee\x27\x00\x00\x6a\x03\x00\x00\x6b\x03\x00\x00\x4c\x03\x00\x00\xf3\x27\x00\x00\xf8\x27\x00\x00\x6c\x03\x00\x00\x71\x03\x00\x00\x4f\x03\x00\x00\xf6\x27\x00\x00\x4a\x28\x00\x00\x56\x03\x00\x00\x77\x0a\x00\x00\xbc\x28\x00\x00\xc1\x28\x00\x00\x78\x03\x00\x00\x7e\x03\x00\x00\x67\x03\x00\x00"#
+
+alex_table :: AlexAddr
+alex_table = AlexA# "\x00\x00\x05\x00\x09\x00\x05\x00\x05\x00\x05\x00\x07\x00\x08\x00\x0a\x00\x07\x00\x2f\x00\x08\x00\x0a\x00\x24\x00\x0c\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x22\x00\x05\x00\x32\x01\x2d\x00\x3c\x02\x96\x01\x32\x02\x0f\x01\xf7\x00\x50\x01\x55\x01\x29\x02\x20\x02\x7e\x01\x1d\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x38\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\x30\x00\x17\x01\x41\x02\xe1\x01\xf1\x01\xc3\x01\xc2\x00\x41\x02\x41\x02\xd9\x00\x41\x02\x41\x02\xcd\x01\x41\x02\x25\x01\x1f\x01\x41\x02\x41\x02\x41\x02\x41\x02\xce\x00\x41\x02\x41\x02\xd5\x01\x41\x02\x41\x02\x41\x02\xbe\x00\xe6\x00\x60\x01\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xa5\x01\xa5\x01\xa5\x01\xa5\x01\xa5\x01\x09\x00\x08\x00\x06\x00\x08\x00\x09\x00\x06\x00\x06\x00\x08\x00\x76\x00\x09\x00\x06\x00\x08\x00\x09\x00\xb5\x00\x31\x00\x0d\x00\x0e\x00\x0f\x00\xa5\x01\x32\x00\x2e\x00\x79\x00\x38\x00\x35\x00\x36\x00\x37\x00\xb8\x00\x58\x00\x39\x00\x3a\x00\x3b\x00\xa8\x01\xf7\x00\xf7\x00\xf7\x00\x13\x00\x15\x00\x10\x00\x11\x00\x12\x00\x10\x00\x10\x00\x11\x00\x6b\x00\x12\x00\x14\x00\x15\x00\x16\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x33\x00\x43\x00\x42\x00\x44\x00\x40\x00\x49\x00\x47\x00\x48\x00\x4b\x00\x41\x00\x05\x00\x08\x00\x05\x00\x05\x00\x05\x00\x7a\x00\x4a\x00\x89\x00\x4d\x00\x4f\x00\x4c\x00\x50\x00\x4e\x00\x51\x00\x34\x00\x03\x00\x45\x00\x55\x00\x54\x00\x56\x00\x59\x00\x52\x00\x46\x00\x05\x00\x32\x01\x53\x00\x5a\x00\x96\x01\x32\x02\x0f\x01\x23\x00\x5b\x00\x55\x01\x29\x02\x20\x02\x7e\x01\x1e\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x39\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\x5c\x00\x5d\x00\x25\x02\x25\x02\x25\x02\x25\x02\x25\x02\x5f\x00\x60\x00\x5e\x00\x61\x00\x62\x00\x64\x00\x57\x00\x69\x00\x63\x00\x67\x00\x68\x00\x65\x00\x6c\x00\x6d\x00\x6f\x00\x76\x00\x66\x00\x6e\x00\x25\x02\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\x70\x00\x16\x01\x71\x00\x72\x00\x74\x00\xc2\x01\xc1\x00\x0b\x00\x73\x00\xb5\x01\x6a\x00\x76\x00\xcc\x01\x77\x00\x24\x01\x1e\x01\x75\x00\x7f\x00\x7e\x00\x83\x00\xcd\x00\x82\x00\x87\x00\xd4\x01\xf7\x00\x7d\x00\x86\x00\xbd\x00\xe6\x00\x60\x01\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x88\x00\x8a\x00\x85\x00\x8b\x00\x7b\x00\x8b\x00\x81\x00\x7c\x00\x8e\x00\x80\x00\x91\x00\x92\x00\x84\x00\x92\x00\x94\x00\x97\x00\x98\x00\x99\x00\x07\x00\x32\x01\x98\x00\x9a\x00\x96\x01\x32\x02\x0f\x01\x9e\x00\x9e\x00\x55\x01\x29\x02\x20\x02\x7e\x01\x1f\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x39\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\x9d\x00\xa0\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\xa5\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\xa4\x00\xa3\x00\xa4\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\xa6\x00\xaa\x00\xaa\x00\xac\x00\x8b\x00\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\x8b\x00\x16\x01\xaf\x00\xa9\x00\xb0\x00\xc2\x01\xc1\x00\x90\x00\x92\x00\xb5\x01\xb1\x00\xb0\x00\xcc\x01\x90\x00\x24\x01\x1e\x01\xb2\x00\xb5\x00\xb5\x00\xbf\x00\xcd\x00\x96\x00\xb6\x00\xd4\x01\x5d\x01\xbb\x00\xc3\x00\xbd\x00\xe6\x00\x60\x01\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\xc5\x00\xba\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd5\x00\xd1\x00\xcb\x00\xc7\x00\xcf\x00\xe0\x00\xe0\x00\xe1\x00\xe5\x00\xe5\x00\xec\x00\x07\x00\x32\x01\xe4\x00\xe8\x00\x96\x01\x32\x02\x0f\x01\xff\xff\xec\x00\x55\x01\x29\x02\x20\x02\x7e\x01\x1f\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x39\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\xf2\x00\xf2\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\xee\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\xf4\x00\xf8\x00\xf8\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\xf9\x00\xfd\x00\xfd\x00\xfe\x00\x92\x00\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\x98\x00\x16\x01\x02\x01\x02\x01\x06\x01\xc2\x01\xc1\x00\x96\x00\x98\x00\xb5\x01\x03\x01\x06\x01\xcc\x01\x9c\x00\x24\x01\x1e\x01\x07\x01\x0b\x01\x0b\x01\x10\x01\xcd\x00\x9c\x00\x0c\x01\xd4\x01\x10\x01\x11\x01\x18\x01\xbd\x00\xe6\x00\x60\x01\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x14\x01\x1c\x01\xd6\x00\xd5\x00\xd6\x00\xd6\x00\xd6\x00\x22\x01\x26\x01\x2b\x01\x2b\x01\x31\x01\x2d\x01\x31\x01\x33\x01\x37\x01\x37\x01\x3d\x01\x08\x00\x32\x01\x3a\x01\x3e\x01\x96\x01\x32\x02\x0f\x01\xd6\x00\x3e\x01\x55\x01\x29\x02\x20\x02\x7e\x01\x20\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x39\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\x45\x01\x40\x01\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9b\x01\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x46\x01\x45\x01\x45\x01\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x46\x01\x46\x01\x36\x01\x47\x01\x9e\x00\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\x9e\x00\x16\x01\x48\x01\x51\x01\x51\x01\xc2\x01\xc1\x00\xa2\x00\xa4\x00\xb5\x01\x52\x01\x57\x01\xcc\x01\xa2\x00\x24\x01\x1e\x01\x57\x01\x5c\x01\x4b\x01\x5c\x01\xcd\x00\xa8\x00\x58\x01\xd4\x01\x5d\x01\x62\x01\x62\x01\xbd\x00\xe6\x00\x60\x01\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x63\x01\x69\x01\x69\x01\x6e\x01\x6e\x01\x6a\x01\x6f\x01\x72\x01\x72\x01\x73\x01\x76\x01\x76\x01\x77\x01\x7a\x01\x7a\x01\x7b\x01\x7f\x01\x7f\x01\x0a\x00\x32\x01\x80\x01\x84\x01\x96\x01\x32\x02\x0f\x01\x84\x01\x89\x01\x55\x01\x29\x02\x20\x02\x7e\x01\x21\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x39\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\x89\x01\x8e\x01\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x86\x01\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\x8a\x01\x8e\x01\x8f\x01\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\x92\x01\x92\x01\x93\x01\x97\x01\xa4\x00\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\xaa\x00\x16\x01\x97\x01\x98\x01\x9c\x01\xc2\x01\xc1\x00\xa8\x00\xaa\x00\xb5\x01\x9c\x01\x9d\x01\xcc\x01\xae\x00\x24\x01\x1e\x01\xa1\x01\xa1\x01\xa5\x01\xa2\x01\xcd\x00\xae\x00\xa5\x01\xd4\x01\xa6\x01\xaa\x01\xaa\x01\xbd\x00\xe6\x00\x60\x01\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\xac\x01\xaf\x01\xaf\x01\xb0\x01\xca\x01\xb3\x01\xbc\x01\xb8\x01\xc4\x01\xc0\x01\xc6\x01\xce\x01\xd6\x01\xda\x01\x18\x02\x18\x02\xdc\x01\xd8\x01\x0a\x00\x32\x01\x19\x02\x1c\x02\x96\x01\x32\x02\x0f\x01\xd2\x01\x1c\x02\x55\x01\x29\x02\x20\x02\x7e\x01\x21\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x39\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\x1d\x02\x21\x02\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x21\x02\x72\x01\x72\x01\x72\x01\x72\x01\x72\x01\x22\x02\x25\x02\x25\x02\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x26\x02\x2a\x02\x2a\x02\x2b\x02\x76\x00\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\x72\x01\x16\x01\x2e\x02\x2e\x02\x2f\x02\xc2\x01\xc1\x00\x79\x00\xb0\x00\xb5\x01\x33\x02\x33\x02\xcc\x01\x75\x01\x24\x01\x1e\x01\x34\x02\x38\x02\x38\x02\x3d\x02\xcd\x00\xb4\x00\x39\x02\xd4\x01\x3d\x02\x3e\x02\x43\x02\xbd\x00\xe6\x00\x60\x01\xfc\x00\x46\x02\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x46\x02\x93\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x47\x02\xab\x00\x00\x00\x8d\x00\x7a\x00\x9f\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x61\x01\x00\x00\xdf\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x01\xb4\x00\x00\x00\x00\x00\x00\x00\x43\x02\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x68\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x56\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\xc4\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xc6\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xc8\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xc0\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xbb\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xd0\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x04\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xd2\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xcc\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xb4\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xda\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\xdb\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xdc\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xdd\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\xde\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xd8\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x7a\x01\x00\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x01\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x01\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\xf2\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x01\x6d\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf6\x00\x2e\x02\x2e\x02\x2e\x02\x2e\x02\x2e\x02\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x02\xed\x00\x5b\x01\xe7\x00\x00\x00\xf8\x00\x00\x00\xf6\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x31\x02\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x00\x00\xeb\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\xf1\x00\x00\x00\x00\x01\x00\x00\x02\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x09\x01\x00\x00\x10\x01\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x19\x01\x41\x02\x41\x02\x41\x02\x41\x02\xea\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x15\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x1d\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x0f\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x27\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x23\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\xaf\x01\xaf\x01\xaf\x01\xaf\x01\xaf\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x00\x00\x00\x00\x00\x00\x2b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x01\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x01\x00\x00\x00\x00\x2f\x01\x00\x00\x31\x01\x00\x00\x00\x00\x2f\x01\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x35\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x92\x01\x92\x01\x92\x01\x92\x01\x92\x01\x2a\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x00\x00\x00\x00\x31\x01\x00\x00\x00\x00\x00\x00\x00\x00\x92\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x01\x00\x00\x35\x01\x00\x00\x00\x00\x37\x01\x00\x00\x95\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x3c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x30\x01\x00\x00\x00\x00\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x44\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x3e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x36\x01\x43\x01\x42\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x01\x00\x00\x00\x00\x00\x00\x00\x00\x44\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x00\x00\x4d\x01\x00\x00\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x45\x01\x00\x00\x00\x00\x00\x00\x00\x00\x46\x01\x43\x01\x51\x01\x51\x01\x51\x01\x51\x01\x51\x01\x00\x00\x4d\x01\x9c\x01\x00\x00\x00\x00\x00\x00\x4f\x01\x51\x01\x51\x01\x51\x01\x51\x01\x51\x01\x00\x00\x00\x00\x00\x00\x49\x01\x00\x00\x00\x00\x51\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x51\x01\x54\x01\xa0\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x57\x01\x54\x01\x00\x00\x00\x00\x00\x00\x57\x01\x62\x01\x62\x01\x62\x01\x62\x01\x62\x01\x00\x00\x00\x00\x5a\x01\x5c\x01\x00\x00\x00\x00\x00\x00\x5a\x01\x00\x00\x62\x01\x62\x01\x62\x01\x62\x01\x62\x01\x00\x00\x00\x00\x5f\x01\x00\x00\x62\x01\x76\x01\x76\x01\x76\x01\x76\x01\x76\x01\x69\x01\x69\x01\x69\x01\x69\x01\x69\x01\x00\x00\x00\x00\x65\x01\x62\x01\x69\x01\x69\x01\x69\x01\x69\x01\x69\x01\x00\x00\x00\x00\x00\x00\x00\x00\x76\x01\x00\x00\x00\x00\x65\x01\x00\x00\x69\x01\x6e\x01\x6e\x01\x6e\x01\x6e\x01\x6e\x01\x00\x00\x00\x00\x79\x01\x69\x01\x00\x00\x00\x00\x00\x00\x6c\x01\x00\x00\x6e\x01\x6e\x01\x6e\x01\x6e\x01\x6e\x01\x00\x00\x00\x00\x6c\x01\x00\x00\x6e\x01\x72\x01\x72\x01\x72\x01\x72\x01\x72\x01\x76\x01\x76\x01\x76\x01\x76\x01\x76\x01\x00\x00\x00\x00\x71\x01\x6e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x72\x01\x00\x00\x00\x00\x71\x01\x00\x00\x76\x01\x00\x00\x00\x00\x66\x01\x00\x00\x00\x00\x00\x00\x00\x00\x75\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x79\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x00\x00\x00\x00\x00\x00\x7d\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x00\x00\x00\x00\x00\x00\x7f\x01\x00\x00\x00\x00\x00\x00\x82\x01\x84\x01\x89\x01\x89\x01\x89\x01\x89\x01\x89\x01\x00\x00\x00\x00\x82\x01\x00\x00\x84\x01\x00\x00\x00\x00\x88\x01\x00\x00\x00\x00\x89\x01\x89\x01\x89\x01\x89\x01\x89\x01\x00\x00\x00\x00\x88\x01\x89\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x00\x00\x00\x00\x8c\x01\x83\x01\x89\x01\x92\x01\x92\x01\x92\x01\x92\x01\x92\x01\x00\x00\x00\x00\x00\x00\x8e\x01\x00\x00\x00\x00\x00\x00\x8c\x01\x8e\x01\x97\x01\x97\x01\x97\x01\x97\x01\x97\x01\x00\x00\x00\x00\x91\x01\x00\x00\x92\x01\x00\x00\x00\x00\x91\x01\x00\x00\x97\x01\x97\x01\x97\x01\x97\x01\x97\x01\x00\x00\x00\x00\x00\x00\x95\x01\x97\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x00\x00\x00\x00\x9a\x01\x97\x01\xa1\x01\xa1\x01\xa1\x01\xa1\x01\xa1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x01\x00\x00\x00\x00\x9a\x01\x00\x00\x9c\x01\xa1\x01\xa1\x01\xa1\x01\xa1\x01\xa1\x01\x00\x00\x00\x00\x9f\x01\xa1\x01\x00\x00\x00\x00\x00\x00\x9f\x01\x00\x00\xa5\x01\xa5\x01\xa5\x01\xa5\x01\xa5\x01\x00\x00\x00\x00\xa4\x01\x00\x00\xa1\x01\xa0\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\x00\x00\xa4\x01\xa5\x01\x00\x00\x1c\x02\x1c\x02\x1c\x02\x1c\x02\x1c\x02\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x01\x00\x00\xa8\x01\x00\x00\x00\x00\xaa\x01\xaf\x01\xaf\x01\xaf\x01\xaf\x01\xaf\x01\x00\x00\x00\x00\xae\x01\x1c\x02\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x02\x00\x00\xaf\x01\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\xb2\x01\x00\x00\x00\x00\x00\x00\xa9\x01\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xbd\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xb9\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xc5\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xfb\x01\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xc7\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xc1\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xcf\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xcb\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xd7\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xd9\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xdb\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xdd\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xd3\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xe2\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\xe3\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xe4\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xe5\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xe6\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xe0\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xeb\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xec\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xed\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xe9\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\xf2\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xf3\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\xf4\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xf5\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xf6\x01\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xf7\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xf0\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xfc\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xfd\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xfe\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x00\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xfa\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x05\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x06\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x07\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x08\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x09\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x0a\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x0b\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x03\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x10\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x11\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x12\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x13\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x14\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x0e\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\x18\x02\x18\x02\x18\x02\x18\x02\x18\x02\x18\x02\x18\x02\x18\x02\x18\x02\x18\x02\x1c\x02\x1c\x02\x1c\x02\x1c\x02\x1c\x02\x21\x02\x21\x02\x21\x02\x21\x02\x21\x02\x00\x00\x00\x00\x00\x00\x18\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x02\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x02\x00\x00\x00\x00\x1b\x02\x00\x00\x21\x02\x00\x00\x00\x00\x1b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x02\x00\x00\x00\x00\x00\x00\x00\x00\x24\x02\x21\x02\x21\x02\x21\x02\x21\x02\x21\x02\x25\x02\x25\x02\x25\x02\x25\x02\x25\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x00\x00\x00\x00\x00\x00\x21\x02\x00\x00\x00\x00\x00\x00\x00\x00\x25\x02\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x02\x00\x00\x00\x00\x24\x02\x00\x00\x2a\x02\x00\x00\x00\x00\x28\x02\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x02\x2e\x02\x2e\x02\x2e\x02\x2e\x02\x2e\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x38\x02\x38\x02\x38\x02\x38\x02\x38\x02\x00\x00\x00\x00\x00\x00\x2e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x33\x02\x00\x00\x00\x00\x00\x00\x00\x00\x33\x02\x00\x00\x00\x00\x31\x02\x00\x00\x38\x02\x00\x00\x00\x00\x36\x02\x00\x00\x00\x00\x00\x00\x00\x00\x36\x02\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x02\x38\x02\x38\x02\x38\x02\x38\x02\x38\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x02\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x02\x00\x00\x00\x00\x3b\x02\x00\x00\x43\x02\x00\x00\x00\x00\x40\x02\x00\x00\x00\x00\x00\x00\x00\x00\x40\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x02\x00\x00\x00\x00\x00\x00\x00\x00\x46\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x02\x00\x00\x00\x00\x00\x00\x00\x00\x49\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x20\x00\x0a\x00\x0a\x00\x61\x00\x2d\x00\x75\x00\x20\x00\x70\x00\x72\x00\x69\x00\x6f\x00\x72\x00\x69\x00\x79\x00\x20\x00\x21\x00\x74\x00\x23\x00\x24\x00\x25\x00\x26\x00\x3e\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\x6f\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x20\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x20\x00\x76\x00\x2d\x00\x2d\x00\x2d\x00\x20\x00\x65\x00\x72\x00\x2d\x00\x6c\x00\x65\x00\x61\x00\x64\x00\x2d\x00\x69\x00\x6f\x00\x63\x00\x6b\x00\x2d\x00\x3e\x00\x3e\x00\x3e\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x74\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x20\x00\x66\x00\x72\x00\x65\x00\x65\x00\x72\x00\x66\x00\x65\x00\x65\x00\x65\x00\x69\x00\x76\x00\x6f\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5b\x00\x6c\x00\x5d\x00\x6b\x00\x66\x00\x63\x00\x72\x00\x20\x00\x65\x00\x64\x00\x5b\x00\x65\x00\x72\x00\x66\x00\x65\x00\x76\x00\x65\x00\x6c\x00\x20\x00\x21\x00\x2d\x00\x65\x00\x24\x00\x25\x00\x26\x00\x74\x00\x72\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\x67\x00\x65\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x63\x00\x65\x00\x6e\x00\x20\x00\x66\x00\x65\x00\x65\x00\x65\x00\x72\x00\x66\x00\x72\x00\x65\x00\x65\x00\x72\x00\x69\x00\x0a\x00\x2d\x00\x6d\x00\x20\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x6e\x00\x61\x00\x69\x00\x73\x00\x69\x00\x65\x00\x66\x00\x2d\x00\x74\x00\x69\x00\x63\x00\x0a\x00\x6c\x00\x2d\x00\x6e\x00\x6f\x00\x5d\x00\x44\x00\x5d\x00\x44\x00\x74\x00\x5d\x00\x44\x00\x77\x00\x3e\x00\x46\x00\x5d\x00\x7b\x00\x7c\x00\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x3a\x00\x3d\x00\x52\x00\x0a\x00\x54\x00\x0a\x00\x56\x00\x5d\x00\x2d\x00\x5d\x00\x3d\x00\x0a\x00\x5d\x00\x0a\x00\x2d\x00\x3d\x00\x0a\x00\x44\x00\x20\x00\x21\x00\x0a\x00\x2d\x00\x24\x00\x25\x00\x26\x00\x0a\x00\x0a\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\x3d\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x44\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x3d\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x20\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x20\x00\x61\x00\x3d\x00\x3d\x00\x0a\x00\x65\x00\x66\x00\x2d\x00\x20\x00\x69\x00\x44\x00\x0a\x00\x6c\x00\x2d\x00\x6e\x00\x6f\x00\x2d\x00\x0a\x00\x0a\x00\x65\x00\x74\x00\x2d\x00\x2d\x00\x77\x00\x2d\x00\x2d\x00\x61\x00\x7b\x00\x7c\x00\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x6c\x00\x68\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x75\x00\x65\x00\x73\x00\x72\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x0a\x00\x0a\x00\x20\x00\x21\x00\x7c\x00\x2d\x00\x24\x00\x25\x00\x26\x00\x20\x00\x0a\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\x0a\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x20\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x20\x00\x61\x00\x0a\x00\x0a\x00\x0a\x00\x65\x00\x66\x00\x2d\x00\x20\x00\x69\x00\x2d\x00\x0a\x00\x6c\x00\x2d\x00\x6e\x00\x6f\x00\x2d\x00\x0a\x00\x0a\x00\x0a\x00\x74\x00\x2d\x00\x2d\x00\x77\x00\x0a\x00\x2d\x00\x6e\x00\x7b\x00\x7c\x00\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x64\x00\x72\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x74\x00\x6f\x00\x0a\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x2d\x00\x0a\x00\x0a\x00\x3d\x00\x20\x00\x21\x00\x2d\x00\x0a\x00\x24\x00\x25\x00\x26\x00\x20\x00\x0a\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\x0a\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x3d\x00\x2d\x00\x20\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x20\x00\x61\x00\x2d\x00\x0a\x00\x0a\x00\x65\x00\x66\x00\x2d\x00\x20\x00\x69\x00\x2d\x00\x0a\x00\x6c\x00\x2d\x00\x6e\x00\x6f\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x74\x00\x2d\x00\x2d\x00\x77\x00\x2d\x00\x0a\x00\x0a\x00\x7b\x00\x7c\x00\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x2d\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x0a\x00\x20\x00\x21\x00\x2d\x00\x0a\x00\x24\x00\x25\x00\x26\x00\x0a\x00\x0a\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\x0a\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x20\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x20\x00\x61\x00\x0a\x00\x2d\x00\x0a\x00\x65\x00\x66\x00\x2d\x00\x20\x00\x69\x00\x0a\x00\x2d\x00\x6c\x00\x2d\x00\x6e\x00\x6f\x00\x0a\x00\x0a\x00\x0a\x00\x2d\x00\x74\x00\x2d\x00\x0a\x00\x77\x00\x2d\x00\x0a\x00\x0a\x00\x7b\x00\x7c\x00\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x74\x00\x66\x00\x65\x00\x6e\x00\x6c\x00\x65\x00\x73\x00\x65\x00\x69\x00\x68\x00\x0a\x00\x0a\x00\x69\x00\x74\x00\x20\x00\x21\x00\x2d\x00\x0a\x00\x24\x00\x25\x00\x26\x00\x6e\x00\x0a\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\x2d\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x20\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x20\x00\x61\x00\x0a\x00\x0a\x00\x2d\x00\x65\x00\x66\x00\x2d\x00\x20\x00\x69\x00\x0a\x00\x0a\x00\x6c\x00\x2d\x00\x6e\x00\x6f\x00\x2d\x00\x0a\x00\x0a\x00\x0a\x00\x74\x00\x2d\x00\x2d\x00\x77\x00\x0a\x00\x2d\x00\x27\x00\x7b\x00\x7c\x00\x7d\x00\x3e\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x46\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x52\x00\xff\xff\x54\x00\x5b\x00\x56\x00\x20\x00\xff\xff\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\x7c\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\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\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x3e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\x20\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x5d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x7c\x00\x7d\x00\x7e\x00\xff\xff\x20\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x7c\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x5c\x00\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\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\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x3d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x20\x00\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\x3e\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x3e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x2d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\x2d\x00\x3e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x2e\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\x3e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x2d\x00\x20\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x20\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\x2d\x00\xff\xff\xff\xff\xff\xff\x40\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x27\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\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\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+
+alex_deflt :: AlexAddr
+alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x19\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x17\x00\x18\x00\x19\x00\x17\x00\x17\x00\x18\x00\x19\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x78\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x8f\x00\x8f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x95\x00\x95\x00\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x00\x9b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xa1\x00\xa1\x00\xff\xff\xff\xff\xff\xff\xff\xff\xa7\x00\xa7\x00\xff\xff\xff\xff\xff\xff\xff\xff\xad\x00\xad\x00\xff\xff\xff\xff\xff\xff\xff\xff\xb3\x00\xb3\x00\xff\xff\xff\xff\xb7\x00\xb7\x00\xff\xff\xba\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xca\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd4\x00\xff\xff\xff\xff\xd7\x00\xd7\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe2\x00\xe2\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe9\x00\xe9\x00\xff\xff\xff\xff\xff\xff\xff\xff\xef\x00\xef\x00\xff\xff\xff\xff\xff\xff\xff\xff\xf5\x00\xf5\x00\xff\xff\xff\xff\xff\xff\xfa\x00\xfa\x00\xff\xff\xff\xff\xff\xff\xff\x00\xff\x00\xff\xff\xff\xff\xff\xff\x04\x01\x04\x01\xff\xff\xff\xff\x08\x01\x08\x01\xff\xff\xff\xff\xff\xff\x0d\x01\x0d\x01\xff\xff\xff\xff\xff\xff\x12\x01\x12\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x01\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x2e\x01\xff\xff\xff\xff\xff\xff\xff\xff\x34\x01\x34\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x01\x3b\x01\xff\xff\xff\xff\xff\xff\xff\xff\x41\x01\x41\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x01\x4c\x01\x4a\x01\x4a\x01\x4c\x01\x4c\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x01\x53\x01\xff\xff\xff\xff\xff\xff\xff\xff\x59\x01\x59\x01\xff\xff\xff\xff\xff\xff\x5e\x01\x5e\x01\xff\xff\xff\xff\xff\xff\xff\xff\x64\x01\x64\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x01\x6b\x01\xff\xff\xff\xff\xff\xff\x70\x01\x70\x01\xff\xff\xff\xff\x74\x01\x74\x01\xff\xff\xff\xff\x78\x01\x78\x01\xff\xff\xff\xff\x7c\x01\x7c\x01\xff\xff\xff\xff\xff\xff\x81\x01\x81\x01\xff\xff\xff\xff\xff\xff\xff\xff\x87\x01\x87\x01\xff\xff\xff\xff\x8b\x01\x8b\x01\xff\xff\xff\xff\xff\xff\x90\x01\x90\x01\xff\xff\xff\xff\x94\x01\x94\x01\xff\xff\xff\xff\xff\xff\x99\x01\x99\x01\xff\xff\xff\xff\xff\xff\x9e\x01\x9e\x01\xff\xff\xff\xff\xff\xff\xa3\x01\xa3\x01\xff\xff\xff\xff\xa7\x01\xa7\x01\xff\xff\xff\xff\xff\xff\xff\xff\xad\x01\xad\x01\xff\xff\xff\xff\xb1\x01\xb1\x01\xff\xff\xff\xff\xff\xff\xff\xff\xb7\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xbf\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc9\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd1\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xdf\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe8\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xef\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf9\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x02\xff\xff\xff\xff\xff\xff\x1a\x02\x1a\x02\xff\xff\xff\xff\x1e\x02\x1e\x02\xff\xff\xff\xff\xff\xff\x23\x02\x23\x02\xff\xff\xff\xff\x27\x02\x27\x02\xff\xff\xff\xff\xff\xff\x2c\x02\x2c\x02\xff\xff\xff\xff\x30\x02\x30\x02\xff\xff\xff\xff\xff\xff\x35\x02\x35\x02\xff\xff\xff\xff\xff\xff\x3a\x02\x3a\x02\xff\xff\xff\xff\xff\xff\x3f\x02\x3f\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x48\x02\x48\x02\xff\xff"#
+
+alex_accept = listArray (0::Int,585) [[],[],[(AlexAccPred  (alex_action_27) (alexRightContext 185))],[(AlexAcc (alex_action_0))],[(AlexAcc (alex_action_74))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_91))],[(AlexAcc (alex_action_91))],[],[(AlexAcc (alex_action_100))],[(AlexAcc (alex_action_100))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[],[],[],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[],[],[],[(AlexAcc (alex_action_91))],[],[],[],[],[(AlexAcc (alex_action_1))],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_2))],[],[],[],[],[(AlexAcc (alex_action_3))],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_4))],[],[],[],[],[(AlexAcc (alex_action_5))],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_6))],[],[],[],[],[(AlexAcc (alex_action_7))],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_8))],[],[],[],[],[(AlexAcc (alex_action_9))],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_10))],[],[],[],[],[],[],[(AlexAcc (alex_action_11))],[],[(AlexAcc (alex_action_12))],[],[(AlexAcc (alex_action_13))],[],[(AlexAcc (alex_action_14))],[],[(AlexAcc (alex_action_15))],[],[(AlexAcc (alex_action_16))],[],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_18))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_63))],[],[],[],[],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[],[],[],[],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_21))],[],[],[],[],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_22))],[],[],[],[],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[],[],[],[],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[],[],[],[],[(AlexAcc (alex_action_25))],[(AlexAcc (alex_action_25))],[],[],[],[],[(AlexAcc (alex_action_26))],[],[],[],[],[(AlexAccSkip)],[(AlexAcc (alex_action_29))],[(AlexAcc (alex_action_29))],[],[(AlexAcc (alex_action_57))],[(AlexAccPred  (alex_action_30) (alexRightContext 201))],[(AlexAccPred  (alex_action_30) (alexRightContext 201)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_31) (alexRightContext 211))],[(AlexAccPred  (alex_action_31) (alexRightContext 211)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAcc (alex_action_32))],[],[],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_33))],[(AlexAcc (alex_action_33))],[],[],[],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_65))],[],[],[],[],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_40))],[],[],[],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_93))],[],[],[],[(AlexAcc (alex_action_37))],[(AlexAcc (alex_action_37))],[],[],[],[(AlexAcc (alex_action_38))],[(AlexAcc (alex_action_38))],[],[],[],[(AlexAcc (alex_action_39))],[(AlexAcc (alex_action_39))],[],[],[],[(AlexAcc (alex_action_40))],[],[],[],[(AlexAcc (alex_action_41))],[(AlexAcc (alex_action_41))],[],[],[],[(AlexAcc (alex_action_42))],[(AlexAcc (alex_action_42))],[],[],[],[(AlexAccPred  (alex_action_43) (alexRightContext 282))],[(AlexAccPred  (alex_action_43) (alexRightContext 282)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_44) (alexRightContext 288))],[(AlexAccPred  (alex_action_44) (alexRightContext 288)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_45) (alexRightContext 296))],[(AlexAccPred  (alex_action_45) (alexRightContext 296)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_76))],[],[],[],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_70))],[],[],[],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_51))],[],[],[],[],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_52))],[],[],[],[(AlexAcc (alex_action_50))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_51))],[],[],[],[],[],[],[],[(AlexAcc (alex_action_72))],[],[(AlexAcc (alex_action_53))],[(AlexAcc (alex_action_53))],[],[],[],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_55))],[(AlexAcc (alex_action_55))],[],[],[],[(AlexAcc (alex_action_56))],[(AlexAcc (alex_action_57))],[],[],[],[(AlexAcc (alex_action_58))],[(AlexAcc (alex_action_59))],[(AlexAcc (alex_action_59))],[],[],[],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_64))],[(AlexAcc (alex_action_61))],[(AlexAcc (alex_action_61))],[],[],[],[(AlexAcc (alex_action_62))],[(AlexAcc (alex_action_62))],[],[],[],[(AlexAcc (alex_action_63))],[],[],[],[(AlexAcc (alex_action_64))],[],[],[],[(AlexAcc (alex_action_65))],[],[],[],[(AlexAcc (alex_action_66))],[(AlexAcc (alex_action_66))],[],[],[],[(AlexAcc (alex_action_67))],[(AlexAcc (alex_action_67))],[(AlexAcc (alex_action_68))],[],[],[],[(AlexAcc (alex_action_68))],[],[],[],[(AlexAcc (alex_action_69))],[(AlexAcc (alex_action_69))],[],[],[],[(AlexAcc (alex_action_70))],[],[],[],[(AlexAcc (alex_action_71))],[(AlexAcc (alex_action_71))],[],[],[],[(AlexAcc (alex_action_72))],[(AlexAcc (alex_action_72))],[],[],[],[(AlexAcc (alex_action_73))],[(AlexAcc (alex_action_73))],[],[],[],[(AlexAcc (alex_action_74))],[],[],[],[(AlexAcc (alex_action_75))],[(AlexAcc (alex_action_75))],[(AlexAcc (alex_action_89))],[],[],[],[(AlexAcc (alex_action_76))],[],[],[],[(AlexAccPred  (alex_action_77) (alexRightContext 438))],[(AlexAccPred  (alex_action_77) (alexRightContext 438)),(AlexAcc (alex_action_97))],[],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_78) (alexRightContext 446))],[(AlexAccPred  (alex_action_78) (alexRightContext 446)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_79) (alexRightContext 456))],[(AlexAccPred  (alex_action_79) (alexRightContext 456)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_80) (alexRightContext 464))],[(AlexAccPred  (alex_action_80) (alexRightContext 464)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_81) (alexRightContext 478))],[(AlexAccPred  (alex_action_81) (alexRightContext 478)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_82) (alexRightContext 487)),(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_83) (alexRightContext 494)),(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_84) (alexRightContext 504)),(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_85) (alexRightContext 513)),(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_86) (alexRightContext 524)),(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred  (alex_action_87) (alexRightContext 533)),(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_88))],[],[],[],[(AlexAcc (alex_action_89))],[],[],[],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[],[],[],[(AlexAcc (alex_action_91))],[],[],[],[(AlexAcc (alex_action_92))],[(AlexAcc (alex_action_92))],[],[],[],[(AlexAcc (alex_action_93))],[],[],[],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[],[],[],[(AlexAcc (alex_action_95))],[(AlexAcc (alex_action_95))],[],[],[],[(AlexAcc (alex_action_96))],[(AlexAcc (alex_action_96))],[],[],[],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_98))],[(AlexAcc (alex_action_99))],[(AlexAcc (alex_action_99))],[],[],[]]
+{-# LINE 175 "src/CSPM/Parser/Lexer.x" #-}
+
+wschars :: String
+wschars = " \t\r\n"
+
+strip :: String -> String
+strip = lstrip . rstrip
+
+-- | Same as 'strip', but applies only to the left side of the string.
+lstrip :: String -> String
+lstrip s = case s of
+    [] -> []
+    (x:xs) -> if elem x wschars then lstrip xs else s
+
+-- | Same as 'strip', but applies only to the right side of the string.
+rstrip :: String -> String
+rstrip = reverse . lstrip . reverse
+
+openseq token inp len = 
+    do
+        --cs <- getSequenceStack
+        --setSequenceStack (0:cs)
+        tok token inp len
+closeseq token inp len = 
+    do
+        --(c:cs) <- getSequenceStack
+        --setSequenceStack cs
+        tok token inp len
+
+gt :: AlexInput -> Int -> ParseMonad LToken
+gt inp len = do
+    (c:cs) <- getSequenceStack
+    tok (if c > 0 then TCloseSeq else TGt) inp len
+
+soakTok :: Token -> AlexInput -> Int -> ParseMonad LToken
+soakTok t inp len = setCurrentStartCode soak >> tok t inp len
+
+-- TODO: don't count whitespace in the tokens
+tok :: Token -> AlexInput -> Int -> ParseMonad LToken
+tok t (ParserState { fileStack = fps:_ }) len =
+        return $ L (SrcSpanOneLine f lineno colno (colno+len)) t
+    where
+        (FileParserState { tokenizerPos = FilePosition offset lineno colno, 
+                            fileName = f }) = fps
+
+stok :: (String -> Token) -> AlexInput -> Int -> ParseMonad LToken
+stok f (st @ ParserState { fileStack = stk }) len = do
+        tok (f (filter (\ c -> c /= '\n') (takeChars len stk))) st len
+
+skip input len = getNextToken
+
+takeChars :: Int -> [FileParserState] -> String
+takeChars 0 _ = ""
+takeChars len (FileParserState {input = [] }:stk) = takeChars len stk
+takeChars len (fps@(FileParserState {input = (c:cs) }):stk) = 
+    c:(takeChars (len-1) (fps {input = cs}:stk))
+
+nestedComment :: AlexInput -> Int -> ParseMonad LToken
+nestedComment _ _ = do
+    st <- getParserState
+    go 1 st
+    where 
+        err :: ParseMonad a
+        err = do
+            FileParserState { 
+                fileName = fname, 
+                tokenizerPos = pos, 
+                currentStartCode = sc } <- getTopFileParserState
+            throwSourceError [lexicalErrorMessage (filePositionToSrcLoc fname pos)]
+        go :: Int -> AlexInput -> ParseMonad LToken
+        go 0 st = do setParserState st; getNextToken
+        go n st = do
+            case alexGetChar st of
+                Nothing  -> err
+                Just (c,st) -> do
+                    case c of
+                        '-' -> do
+                            case alexGetChar st of
+                                Nothing          -> err
+                                Just ('\125',st) -> go (n-1) st
+                                Just (c,st)      -> go n st
+                        '\123' -> do
+                            case alexGetChar st of
+                                Nothing       -> err
+                                Just ('-',st) -> go (n+1) st
+                                Just (c,st)   -> go n st
+                        c -> go n st
+
+switchInput :: AlexInput -> Int -> ParseMonad LToken
+switchInput st len = do
+    FileParserState { 
+        fileName = fname, 
+        tokenizerPos = pos, 
+        currentStartCode = sc } <- getTopFileParserState
+    let
+        str = takeChars len (fileStack st)
+        quotedFname = strip (drop (length "include") str)
+        
+        hasStartQuote ('\"':cs) = True
+        hasStartQuote _ = False
+
+        hasEndQuote [] = False
+        hasEndQuote ('\"':cs) = True
+        hasEndQuote (c:cs) = hasEndQuote cs
+        
+        file = calcFile (tail quotedFname)
+        calcFile ('\"':cs) = ""
+        calcFile (c:cs) = c:calcFile cs
+
+    if not (hasStartQuote quotedFname) || not (hasEndQuote (tail quotedFname)) then
+        throwSourceError [invalidIncludeErrorMessage (filePositionToSrcLoc fname pos)]
+    else pushFile file getNextToken
+
+type AlexInput = ParserState
+
+begin :: Int -> AlexInput -> Int -> ParseMonad LToken
+begin sc' st len = setCurrentStartCode sc' >> getNextToken
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar (ParserState { fileStack = fps:_ })= previousChar fps
+
+alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
+alexGetChar (ParserState { fileStack = [] }) = Nothing
+alexGetChar (st @ (ParserState { fileStack = fps:fpss })) = gc fps
+    where
+        gc (fps @ (FileParserState { input = [] })) = 
+            alexGetChar (st { fileStack = fpss })
+        gc (fps @ (FileParserState { tokenizerPos = p, input = (c:s) })) =
+                p' `seq` Just (c, st')
+            where
+                p' = movePos p c
+                fps' = fps { input = s, tokenizerPos = p', previousChar = c }
+                st' = st { fileStack = fps':fpss }
+
+getNextToken :: ParseMonad LToken
+getNextToken = do
+    FileParserState { 
+        fileName = fname, 
+        tokenizerPos = pos, 
+        currentStartCode = sc } <- getTopFileParserState
+    st <- getParserState
+    case alexScan st sc of
+        AlexEOF -> return $ L Unknown TEOF
+        AlexError st' -> 
+            throwSourceError [lexicalErrorMessage (filePositionToSrcLoc fname pos)]
+        AlexSkip st' len -> do
+            setParserState st'
+            getNextToken
+        AlexToken st' len action -> do
+            setParserState st'
+            action st len
+
+getNextTokenWrapper :: (LToken -> ParseMonad a) -> ParseMonad a
+getNextTokenWrapper cont = getNextToken >>= cont
+
+
+
+sem_prop,soak :: Int
+sem_prop = 1
+soak = 2
+alex_action_0 =  begin sem_prop 
+alex_action_1 =  tok TTauPriority 
+alex_action_2 =  tok TTauPriority 
+alex_action_3 =  tok TDeadlockFree 
+alex_action_4 =  tok TDeadlockFree 
+alex_action_5 =  tok TLivelockFree 
+alex_action_6 =  tok TLivelockFree 
+alex_action_7 =  tok TDivergenceFree 
+alex_action_8 =  tok TDivergenceFree 
+alex_action_9 =  tok TDeterministic 
+alex_action_10 =  tok (TModel Traces) 
+alex_action_11 =  tok (TModel Failures) 
+alex_action_12 =  tok (TModel FailuresDivergences) 
+alex_action_13 =  tok (TModel Revivals) 
+alex_action_14 =  tok (TModel RevivalsDivergences) 
+alex_action_15 =  tok (TModel Refusals) 
+alex_action_16 =  tok (TModel RefusalsDivergences) 
+alex_action_17 =  begin 0 
+alex_action_18 =  begin 0 
+alex_action_19 =  tok (TRefines Traces) 
+alex_action_20 =  tok (TRefines Failures) 
+alex_action_21 =  tok (TRefines FailuresDivergences) 
+alex_action_22 =  tok (TRefines Revivals) 
+alex_action_23 =  tok (TRefines RevivalsDivergences) 
+alex_action_24 =  tok (TRefines Refusals) 
+alex_action_25 =  tok (TRefines RefusalsDivergences) 
+alex_action_26 =  skip 
+alex_action_27 =  begin 0 
+alex_action_28 =  skip 
+alex_action_29 =  nestedComment 
+alex_action_30 =  tok TFalse 
+alex_action_31 =  tok TTrue 
+alex_action_32 =  switchInput 
+alex_action_33 =  tok TExtChoice 
+alex_action_34 =  tok TIntChoice 
+alex_action_35 =  tok TInterleave 
+alex_action_36 =  tok TInterrupt 
+alex_action_37 =  tok TPrefix 
+alex_action_38 =  tok TSlidingChoice 
+alex_action_39 =  tok TRException 
+alex_action_40 =  tok TParallel 
+alex_action_41 =  tok TSemiColon 
+alex_action_42 =  tok TGuard 
+alex_action_43 =  soakTok TAnd 
+alex_action_44 =  soakTok TOr 
+alex_action_45 =  soakTok TNot 
+alex_action_46 =  tok TEq 
+alex_action_47 =  tok TNotEq 
+alex_action_48 =  tok TLtEq 
+alex_action_49 =  tok TGtEq 
+alex_action_50 =  tok TEmptySeq 
+alex_action_51 =  tok TLt 
+alex_action_52 =  gt 
+alex_action_53 =  openseq TLParen 
+alex_action_54 =  closeseq TRParen 
+alex_action_55 =  openseq TLPipeBrace 
+alex_action_56 =  closeseq TRPipeBrace 
+alex_action_57 =  openseq TLBrace 
+alex_action_58 =  closeseq TRBrace 
+alex_action_59 =  openseq TLDoubleSqBracket 
+alex_action_60 =  closeseq TRDoubleSqBracket 
+alex_action_61 =  openseq TLPipeSqBracket 
+alex_action_62 =  closeseq TRPipeSqBracket 
+alex_action_63 =  tok TLSqBracket 
+alex_action_64 =  tok TRSqBracket 
+alex_action_65 =  tok TPipe 
+alex_action_66 =  tok TComma 
+alex_action_67 =  tok TDoubleDot 
+alex_action_68 =  tok TDot 
+alex_action_69 =  tok TQuestionMark 
+alex_action_70 =  tok TExclamationMark 
+alex_action_71 =  tok TDollar 
+alex_action_72 =  tok TDrawnFrom 
+alex_action_73 =  tok TTie 
+alex_action_74 =  tok TColon 
+alex_action_75 =  tok TDoubleAt 
+alex_action_76 =  tok TDefineEqual 
+alex_action_77 =  soakTok TIf 
+alex_action_78 =  soakTok TThen 
+alex_action_79 =  soakTok TElse 
+alex_action_80 =  soakTok TLet 
+alex_action_81 =  soakTok TWithin 
+alex_action_82 =  soakTok TChannel 
+alex_action_83 =  soakTok TAssert 
+alex_action_84 =  soakTok TDataType 
+alex_action_85 =  soakTok TExternal 
+alex_action_86 =  soakTok TTransparent 
+alex_action_87 =  soakTok TNameType 
+alex_action_88 =  tok TBackSlash 
+alex_action_89 =  tok TLambdaDot 
+alex_action_90 =  tok TPlus 
+alex_action_91 =  tok TMinus 
+alex_action_92 =  tok TTimes 
+alex_action_93 =  tok TDivide 
+alex_action_94 =  tok TMod 
+alex_action_95 =  tok TConcat 
+alex_action_96 =  tok THash 
+alex_action_97 =  stok (\s -> TIdent s) 
+alex_action_98 =  stok (\ s -> TInteger (read s)) 
+alex_action_99 =  tok TWildCard 
+alex_action_100 =  tok TNewLine 
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "<built-in>" #-}
+{-# LINE 1 "<command-line>" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+-- -----------------------------------------------------------------------------
+-- ALEX TEMPLATE
+--
+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use
+-- it for any purpose whatsoever.
+
+-- -----------------------------------------------------------------------------
+-- INTERNALS and main scanner engine
+
+{-# LINE 37 "templates/GenericTemplate.hs" #-}
+
+{-# LINE 47 "templates/GenericTemplate.hs" #-}
+
+
+data AlexAddr = AlexA# Addr#
+
+#if __GLASGOW_HASKELL__ < 503
+uncheckedShiftL# = shiftL#
+#endif
+
+{-# INLINE alexIndexInt16OffAddr #-}
+alexIndexInt16OffAddr (AlexA# arr) off =
+#ifdef WORDS_BIGENDIAN
+  narrow16Int# i
+  where
+        i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
+        high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+        low  = int2Word# (ord# (indexCharOffAddr# arr off'))
+        off' = off *# 2#
+#else
+  indexInt16OffAddr# arr off
+#endif
+
+
+
+
+
+{-# INLINE alexIndexInt32OffAddr #-}
+alexIndexInt32OffAddr (AlexA# arr) off = 
+#ifdef WORDS_BIGENDIAN
+  narrow32Int# i
+  where
+   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`
+		     (b2 `uncheckedShiftL#` 16#) `or#`
+		     (b1 `uncheckedShiftL#` 8#) `or#` b0)
+   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))
+   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))
+   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))
+   off' = off *# 4#
+#else
+  indexInt32OffAddr# arr off
+#endif
+
+
+
+
+
+#if __GLASGOW_HASKELL__ < 503
+quickIndex arr i = arr ! i
+#else
+-- GHC >= 503, unsafeAt is available from Data.Array.Base.
+quickIndex = unsafeAt
+#endif
+
+
+
+
+-- -----------------------------------------------------------------------------
+-- Main lexing routines
+
+data AlexReturn a
+  = AlexEOF
+  | AlexError  !AlexInput
+  | AlexSkip   !AlexInput !Int
+  | AlexToken  !AlexInput !Int a
+
+-- alexScan :: AlexInput -> StartCode -> AlexReturn a
+alexScan input (I# (sc))
+  = alexScanUser undefined input (I# (sc))
+
+alexScanUser user input (I# (sc))
+  = case alex_scan_tkn user input 0# input sc AlexNone of
+	(AlexNone, input') ->
+		case alexGetChar input of
+			Nothing -> 
+
+
+
+				   AlexEOF
+			Just _ ->
+
+
+
+				   AlexError input'
+
+	(AlexLastSkip input'' len, _) ->
+
+
+
+		AlexSkip input'' len
+
+	(AlexLastAcc k input''' len, _) ->
+
+
+
+		AlexToken input''' len k
+
+
+-- Push the input through the DFA, remembering the most recent accepting
+-- state it encountered.
+
+alex_scan_tkn user orig_input len input s last_acc =
+  input `seq` -- strict in the input
+  let 
+	new_acc = check_accs (alex_accept `quickIndex` (I# (s)))
+  in
+  new_acc `seq`
+  case alexGetChar input of
+     Nothing -> (new_acc, input)
+     Just (c, new_input) -> 
+
+
+
+	let
+		(base) = alexIndexInt32OffAddr alex_base s
+		((I# (ord_c))) = ord c
+		(offset) = (base +# ord_c)
+		(check)  = alexIndexInt16OffAddr alex_check offset
+		
+		(new_s) = if (offset >=# 0#) && (check ==# ord_c)
+			  then alexIndexInt16OffAddr alex_table offset
+			  else alexIndexInt16OffAddr alex_deflt s
+	in
+	case new_s of 
+	    -1# -> (new_acc, input)
+		-- on an error, we want to keep the input *before* the
+		-- character that failed, not after.
+    	    _ -> alex_scan_tkn user orig_input (len +# 1#) 
+			new_input new_s new_acc
+
+  where
+	check_accs [] = last_acc
+	check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len))
+	check_accs (AlexAccSkip : _)  = AlexLastSkip  input (I# (len))
+	check_accs (AlexAccPred a predx : rest)
+	   | predx user orig_input (I# (len)) input
+	   = AlexLastAcc a input (I# (len))
+	check_accs (AlexAccSkipPred predx : rest)
+	   | predx user orig_input (I# (len)) input
+	   = AlexLastSkip input (I# (len))
+	check_accs (_ : rest) = check_accs rest
+
+data AlexLastAcc a
+  = AlexNone
+  | AlexLastAcc a !AlexInput !Int
+  | AlexLastSkip  !AlexInput !Int
+
+data AlexAcc a user
+  = AlexAcc a
+  | AlexAccSkip
+  | AlexAccPred a (AlexAccPred user)
+  | AlexAccSkipPred (AlexAccPred user)
+
+type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool
+
+-- -----------------------------------------------------------------------------
+-- Predicates on a rule
+
+alexAndPred p1 p2 user in1 len in2
+  = p1 user in1 len in2 && p2 user in1 len in2
+
+--alexPrevCharIsPred :: Char -> AlexAccPred _ 
+alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input
+
+--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ 
+alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input
+
+--alexRightContext :: Int -> AlexAccPred _
+alexRightContext (I# (sc)) user _ _ input = 
+     case alex_scan_tkn user input 0# input sc AlexNone of
+	  (AlexNone, _) -> False
+	  _ -> True
+	-- TODO: there's no need to find the longest
+	-- match when checking the right context, just
+	-- the first match will do.
+
+-- used by wrappers
+iUnbox (I# (i)) = i
diff --git a/libcspm.cabal b/libcspm.cabal
new file mode 100644
--- /dev/null
+++ b/libcspm.cabal
@@ -0,0 +1,105 @@
+Name: libcspm
+License: BSD3
+License-File: LICENSE.txt
+Copyright: (c) 2011 Thomas Gibson-Robinson
+Author: Thomas Gibson-Robinson <thomas.gibsonrobinson@gmail.com>
+Maintainer: Thomas Gibson-Robinson <thomas.gibsonrobinson@gmail.com>
+Bug-reports: https://github.com/tomgr/libcspm/issues
+Homepage: https://github.com/tomgr/libcspm
+Category: Concurrency
+Build-type: Simple
+Cabal-version: >=1.9.2
+Synopsis: A library providing a parser, type checker and evaluator for CSPM.
+Version: 0.1
+Extra-source-files: 
+    README.md 
+
+Source-Repository head
+    type:     git
+    location: https://github.com/tomgr/libcspm
+  
+Source-repository this
+    type:     git
+    location: https://github.com/tomgr/libcspm
+    tag:      0.1
+
+Library
+    Build-Depends:
+        base >= 4 && < 5,
+        filepath >= 1.2, 
+        array >= 0.3, 
+        containers >= 0.4, 
+        mtl >= 2.0, 
+        pretty >= 1.0,
+        directory >= 1.0,
+        graph-wrapper >= 0.2
+
+    Exposed-Modules:
+        CSPM,
+        CSPM.Compiler.Events,
+        CSPM.Compiler.Map,
+        CSPM.Compiler.Processes,
+        CSPM.Compiler.Set,
+        CSPM.DataStructures.Names,
+        CSPM.DataStructures.Syntax,
+        CSPM.DataStructures.Tokens,
+        CSPM.DataStructures.Types,
+        CSPM.Desugar,
+        CSPM.Evaluator,
+        CSPM.Evaluator.BuiltInFunctions,
+        CSPM.Evaluator.DeclBind,
+        CSPM.Evaluator.Environment,
+        CSPM.Evaluator.Exceptions,
+        CSPM.Evaluator.Expr,
+        CSPM.Evaluator.Module,
+        CSPM.Evaluator.Monad,
+        CSPM.Evaluator.PatBind,
+        CSPM.Evaluator.Values,
+        CSPM.Evaluator.ValueSet
+        CSPM.Parser,
+        CSPM.Parser.Exceptions,
+        CSPM.Parser.Lexer,
+        CSPM.Parser.Monad,
+        CSPM.Parser.Parser,
+        CSPM.PrettyPrinter,
+        CSPM.TypeChecker,
+        CSPM.TypeChecker.BuiltInFunctions,
+        CSPM.TypeChecker.Common,
+        CSPM.TypeChecker.Compressor,
+        CSPM.TypeChecker.Decl,
+        CSPM.TypeChecker.Dependencies,
+        CSPM.TypeChecker.Environment,
+        CSPM.TypeChecker.Exceptions,
+        CSPM.TypeChecker.Expr,
+        CSPM.TypeChecker.InteractiveStmt,
+        CSPM.TypeChecker.Module,
+        CSPM.TypeChecker.Monad,
+        CSPM.TypeChecker.Pat,
+        CSPM.TypeChecker.Unification,
+        Util.Annotated,
+        Util.Exception,
+        Util.HierarchicalMap,
+        Util.List,
+        Util.Monad,
+        Util.PartialFunctions,
+        Util.Prelude,
+        Util.PrettyPrint
+        
+    Hs-Source-Dirs: src
+    
+    Extensions: DoAndIfThenElse
+
+Test-Suite unit-tests
+    Type: exitcode-stdio-1.0
+    Main-is: Main.hs
+
+    Extensions: DoAndIfThenElse
+    
+    Hs-Source-Dirs: tests
+    
+    Build-depends: 
+        base,
+        libcspm,
+        filepath >= 1.2, 
+        mtl >= 2.0,
+        directory >= 1.0
diff --git a/src/CSPM.hs b/src/CSPM.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM.hs
@@ -0,0 +1,187 @@
+{-# LANGUAGE TypeSynonymInstances, DoAndIfThenElse #-}
+module CSPM (
+    module CSPM.DataStructures.Names,
+    module CSPM.DataStructures.Syntax,
+    module CSPM.DataStructures.Types,
+    -- * CSPM Monad
+    CSPMSession, newCSPMSession,
+    CSPMMonad,
+    getSession, setSession, handleWarnings,
+    withSession,
+    -- ** A basic implementation of the monad
+    CSPM, unCSPM,
+    -- * Parser API
+    parseStringAsFile, parseFile, parseInteractiveStmt, parseExpression,
+    -- * Type Checker API
+    typeCheckFile, typeCheckInteractiveStmt, typeCheckExpression, ensureExpressionIsOfType,
+    dependenciesOfExp, typeOfExpression,
+    -- * Evaluator API
+    evaluateExp, 
+    bindFile, bindDeclaration, getBoundNames,
+)
+where
+
+import Control.Monad.State
+import Control.Monad.Trans
+import System.FilePath
+import System.IO
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.DataStructures.Types
+import qualified CSPM.Evaluator as EV
+import CSPM.Evaluator.Values
+import qualified CSPM.Parser as P
+import qualified CSPM.TypeChecker as TC
+import qualified CSPM.Desugar as DS
+import Util.Annotated
+import Util.Exception
+import Util.PrettyPrint
+
+-- | A `CSPMSession` represents the internal states of all the various
+-- components.
+data CSPMSession = CSPMSession {
+        tcState :: TC.TypeInferenceState,
+        evState :: EV.EvaluationState
+    }
+
+-- | Create a new `CSPMSession`.
+newCSPMSession :: MonadIO m => m CSPMSession
+newCSPMSession = do
+    -- Get the type checker environment with the built in functions already
+    -- injected
+    tcState <- liftIO $ TC.initTypeChecker
+    let evState = EV.initEvaluator
+    return $ CSPMSession tcState evState
+
+-- | The CSPMMonad is the main monad in which all functions must be called.
+-- Whilst there is a build in representation (see `CSPM`) it is recommended
+-- that you define an instance of CSPMMonad over whatever monad you use.
+class (MonadIO m) => CSPMMonad m where
+    getSession :: m CSPMSession
+    setSession :: CSPMSession -> m ()
+    handleWarnings :: [ErrorMessage] -> m ()
+    
+withSession :: CSPMMonad m => (CSPMSession -> m a) -> m a
+withSession f = getSession >>= f
+
+modifySession :: CSPMMonad m => (CSPMSession -> CSPMSession) -> m ()
+modifySession f = do
+    s <- getSession
+    setSession (f s)
+
+reportWarnings :: CSPMMonad m => m(a, [ErrorMessage]) -> m a
+reportWarnings prog = withSession $ \ sess -> do
+    (v, ws) <- prog
+    if ws == [] then return ()
+    else handleWarnings ws
+    return v
+
+-- A basic implementation
+type CSPM = StateT CSPMSession IO
+
+unCSPM :: CSPMSession -> CSPM a -> IO (a, CSPMSession)
+unCSPM = flip runStateT
+    
+instance CSPMMonad CSPM where
+    getSession = get
+    setSession = put
+    handleWarnings ms = liftIO $ putStrLn $ show $ prettyPrint ms
+
+-- Parser API
+parse :: CSPMMonad m => FilePath -> P.ParseMonad a -> m a
+parse dir p = liftIO $ P.runParser p dir
+
+-- | Parse a file `fp`. Throws a `SourceError` on any parse error.
+parseFile :: CSPMMonad m => FilePath -> m [PModule]
+parseFile fp =
+    let (dir, fname) = splitFileName fp
+    in parse dir (P.parseFile fname)
+
+-- | Parses a string, treating it as though it were a file. Throws a 
+-- `SourceError` on any parse error.
+parseStringAsFile :: CSPMMonad m => String -> m [PModule]
+parseStringAsFile str = parse "" (P.parseStringAsFile str)
+
+-- | Parses an `InteractiveStmt`. Throws a `SourceError` on any parse error.
+parseInteractiveStmt :: CSPMMonad m => String -> m PInteractiveStmt
+parseInteractiveStmt str = parse "" (P.parseInteractiveStmt str)
+
+-- | Parses an `Exp`. Throws a `SourceError` on any parse error.
+parseExpression :: CSPMMonad m => String -> m PExp
+parseExpression str = parse "" (P.parseExpression str)
+
+-- TypeChecker API
+-- All the type checkers also perform desugaring
+runTypeCheckerInCurrentState :: CSPMMonad m => TC.TypeCheckMonad a -> m (a, [ErrorMessage])
+runTypeCheckerInCurrentState p = withSession $ \s -> do
+    (a, ws, st) <- liftIO $ TC.runFromStateToState (tcState s) p
+    modifySession (\s -> s { tcState = st })
+    return (a, ws)
+
+-- | Type checks a file, also desugaring it. Throws a `SourceError`
+-- if an error is encountered and will call handleWarnings 
+typeCheckFile :: CSPMMonad m => [PModule] -> m [TCModule]
+typeCheckFile ms = reportWarnings $ runTypeCheckerInCurrentState $ do
+    TC.typeCheck ms
+    return $ DS.desugar ms
+
+-- | Type checks a `InteractiveStmt`.
+typeCheckInteractiveStmt :: CSPMMonad m => PInteractiveStmt -> m TCInteractiveStmt
+typeCheckInteractiveStmt pstmt = reportWarnings $ runTypeCheckerInCurrentState $ do
+    TC.typeCheck pstmt
+    return $ DS.desugar pstmt
+
+typeCheckExpression :: CSPMMonad m => PExp -> m TCExp
+typeCheckExpression exp = reportWarnings $ runTypeCheckerInCurrentState $ do
+    TC.typeCheck exp
+    return $ DS.desugar exp
+
+ensureExpressionIsOfType :: CSPMMonad m => Type -> PExp -> m TCExp
+ensureExpressionIsOfType t exp = reportWarnings $ runTypeCheckerInCurrentState $ do
+    TC.typeCheckExpect t exp
+    return $ DS.desugar exp
+
+-- | Gets the type of the expression in the current context.
+typeOfExpression :: CSPMMonad m => PExp -> m Type
+typeOfExpression exp = 
+    reportWarnings $ runTypeCheckerInCurrentState (TC.typeOfExp exp)
+
+dependenciesOfExp :: CSPMMonad m => TCExp -> m [Name]
+dependenciesOfExp e = 
+    reportWarnings $ runTypeCheckerInCurrentState (TC.dependenciesOfExp e)
+
+-- Evaluator API
+runEvaluatorInCurrentState :: CSPMMonad m => EV.EvaluationMonad a -> m a
+runEvaluatorInCurrentState p = withSession $ \s -> do
+    let (a, st) = EV.runFromStateToState (evState s) p
+    modifySession (\s -> s { evState = st })
+    return a
+
+-- Environment API
+
+-- | Get a list of currently bound names in the environment.
+getBoundNames :: CSPMMonad m => m [Name]
+getBoundNames = runEvaluatorInCurrentState EV.getBoundNames 
+
+-- | Takes a declaration and adds it to the current environment.
+bindDeclaration :: CSPMMonad m => TCDecl -> m ()
+bindDeclaration d = withSession $ \s -> do
+    evSt <- runEvaluatorInCurrentState (EV.addToEnvironment (EV.evaluateDecl d))
+    modifySession (\s -> s { evState = evSt })
+
+-- | Binds all the declarations that are in a particular file.
+bindFile :: CSPMMonad m => [TCModule] -> m ()
+bindFile ms = do
+    -- Bind
+    evSt <- runEvaluatorInCurrentState (EV.addToEnvironment (EV.evaluateFile ms))
+    modifySession (\s -> s { evState = evSt })
+    return ()
+
+-- | Returns a list of all declarations in the specified file.
+evaluateFile :: CSPMMonad m => [TCModule] -> m [(Name, Value)]
+evaluateFile ms = runEvaluatorInCurrentState (EV.evaluateFile ms)
+
+-- | Evaluates the expression in the current context.
+evaluateExp :: CSPMMonad m => TCExp -> m Value
+evaluateExp e = runEvaluatorInCurrentState (EV.evaluateExp e)
diff --git a/src/CSPM/Compiler/Events.hs b/src/CSPM/Compiler/Events.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Compiler/Events.hs
@@ -0,0 +1,33 @@
+{-# LANGUAGE TypeSynonymInstances #-}
+module CSPM.Compiler.Events (
+    Event(..),
+    EventSet
+) where
+
+import qualified CSPM.Compiler.Map as M
+import qualified CSPM.Compiler.Set as S
+import Util.PrettyPrint
+
+-- | Events, as represented in the LTS.
+data Event = 
+    -- | The internal special event tau.
+    Tau 
+    -- | The internal event tick, representing termination.
+    | Tick 
+    -- | Any event defined in a channel definition.
+    | UserEvent String
+    deriving (Eq, Ord)
+
+instance PrettyPrintable Event where
+    prettyPrint Tau = char 'τ'
+    prettyPrint Tick = char '✓'
+    prettyPrint (UserEvent s) = text s
+instance Show Event where
+    show ev = show (prettyPrint ev)
+
+-- | An alias for ease
+type EventSet = S.Set Event
+type EventMap = M.Map Event Event
+
+instance PrettyPrintable EventSet where
+    prettyPrint s = braces (list (map prettyPrint (S.toList s)))
diff --git a/src/CSPM/Compiler/Map.hs b/src/CSPM/Compiler/Map.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Compiler/Map.hs
@@ -0,0 +1,32 @@
+{-# LANGUAGE TypeSynonymInstances #-}
+module CSPM.Compiler.Map ( 
+    Map,
+    lookup,
+    empty,
+    insert,
+    domain, unSafeLookup,
+    toList,
+    fromList,
+    Relation, applyRelation
+) where
+
+import Data.List (nub)
+import Prelude hiding (lookup)
+import Util.PartialFunctions
+
+-- TODO
+type Relation k v = Map k v
+type Map k v = PartialFunction k v
+
+instance (Eq k, Eq v) => Eq (Map k v) where
+    m1 == m2 = and [lookup k m1 == lookup k m1 | k <- domain m1]
+    
+lookup k m = safeApply m k
+empty = []
+insert k v m = (k,v):m
+domain m = nub (functionDomain m)
+unSafeLookup k m = case lookup k m of
+    Just v -> v
+    Nothing -> error "no value"
+toList = id
+fromList = id
diff --git a/src/CSPM/Compiler/Processes.hs b/src/CSPM/Compiler/Processes.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Compiler/Processes.hs
@@ -0,0 +1,57 @@
+module CSPM.Compiler.Processes (
+    Proc(..), ProcName
+) where
+
+import CSPM.Compiler.Events
+import Util.PrettyPrint
+
+type ProcName = String
+
+data Proc =
+    PAlphaParallel [(EventSet, Proc)]
+    | PException Proc EventSet Proc
+    | PExternalChoice [Proc]
+    | PGenParallel EventSet [Proc]
+    | PHide Proc EventSet
+    | PInternalChoice [Proc]
+    | PInterrupt Proc Proc
+    | PInterleave [Proc]
+    | PPrefix Event Proc
+    | PSequentialComp Proc Proc
+    | PSlidingChoice Proc Proc
+    -- TODO:
+    -- | PLinkParallel EventMap [Proc]
+    -- | PRename EventMap Proc
+    -- | POperator ProcOperator Proc
+    -- where:
+    -- data ProcOperator = Normalise | Explicate | StrongBisim | TauLoopFactor | Diamond | ModelCompress
+    | PProcCall ProcName (Maybe Proc)
+
+instance PrettyPrintable Proc where
+    prettyPrint (PAlphaParallel aps) =
+        text "||" <+> braces (list (map (\ (a,p) -> 
+            parens (prettyPrint a <> char ',' <+> prettyPrint p)) aps))
+    prettyPrint (PException p1 a p2) =
+        prettyPrint p1 <+> text "[|" <> prettyPrint a <> text "|>" 
+            <+> prettyPrint p2
+    prettyPrint (PExternalChoice ps) =
+        sep (punctuate (text " []") (map prettyPrint ps))
+    prettyPrint (PGenParallel a ps) =
+        text "||" <+> brackets (prettyPrint a) 
+                <+> braces (list (map prettyPrint ps))
+    prettyPrint (PHide p a) =
+        prettyPrint p <+> char '\\' <+> prettyPrint a
+    prettyPrint (PInternalChoice ps) =
+        sep (punctuate (text " |~|") (map prettyPrint ps))
+    prettyPrint (PInterleave ps) =
+        sep (punctuate (text " |||") (map prettyPrint ps))
+    prettyPrint (PPrefix e p) =
+        prettyPrint e <+> text "->" <+> prettyPrint p
+    prettyPrint (PSequentialComp p1 p2) =
+        prettyPrint p1 <+> text "->" <+> prettyPrint p2
+    prettyPrint (PSlidingChoice p1 p2) =
+        prettyPrint p1 <+> text "|>" <+> prettyPrint p2
+    
+    prettyPrint (PProcCall s _) = text s
+instance Show Proc where
+    show p = show (prettyPrint p)
diff --git a/src/CSPM/Compiler/Set.hs b/src/CSPM/Compiler/Set.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Compiler/Set.hs
@@ -0,0 +1,39 @@
+module CSPM.Compiler.Set ( 
+    Set,
+    null,
+    member,
+    empty,
+    unions,
+    union,
+    difference,
+    fromList, 
+    toList,
+    unionMap,
+    split,
+    subseteq,
+) where
+
+import Data.List ((\\), nub)
+import Prelude hiding (null)
+
+type Set a = [a]
+
+null s = s == []
+empty = []
+unions xss = nub (concat xss)
+union xs ys = nub (xs ++ ys)
+difference xs ys = xs \\ ys
+fromList = id
+toList = id
+member x xs = elem x xs
+subseteq xs ys = and (map (\x -> x `elem` ys) xs)
+
+unionMap :: Ord b => (a -> Set b) -> Set a -> Set b
+unionMap f = unions . map f . toList
+
+-- TODO: replace with iterOverSet :: Set a -> (a -> m b) -> m (Set b) ?
+split :: Set a -> (a, Set a)
+split (x:xs) = (x,xs)
+
+
+{- TODO use http://hackage.haskell.org/packages/archive/hashtables/1.0.0.0/doc/html/Data-HashTable-Class.html#v:new #-}
diff --git a/src/CSPM/DataStructures/Names.hs b/src/CSPM/DataStructures/Names.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/DataStructures/Names.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+module CSPM.DataStructures.Names where
+import Data.Typeable
+
+data Name = 
+    Name String
+    | InternalName String
+    deriving (Eq, Ord, Typeable, Show)
+
+isInternal :: Name -> Bool
+isInternal (Name _) = False
+isInternal (InternalName _) = True
+
+mkInternalName :: String -> Name
+mkInternalName = InternalName
+
+data QualifiedName =
+    UnQual Name
+    deriving (Eq, Show)
diff --git a/src/CSPM/DataStructures/Syntax.hs b/src/CSPM/DataStructures/Syntax.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/DataStructures/Syntax.hs
@@ -0,0 +1,261 @@
+module CSPM.DataStructures.Syntax where
+
+import CSPM.DataStructures.Types
+import CSPM.DataStructures.Names
+import Util.Annotated
+import Util.Exception
+
+-- P = post parsing, TC = post typechecking, An = annotated
+type AnModule = Annotated () Module
+-- Declarations may bind multiple names
+type AnDecl = Annotated (Maybe SymbolTable, PSymbolTable) Decl
+type AnMatch = Annotated () Match
+type AnPat = Annotated () Pat
+type AnExp = Annotated (Maybe Type, PType) Exp
+type AnField = Annotated () Field
+type AnStmt = Annotated () Stmt
+type AnDataTypeClause = Annotated () DataTypeClause
+type AnAssertion = Annotated () Assertion
+type AnInteractiveStmt = Annotated () InteractiveStmt
+
+getType :: Annotated (Maybe Type, PType) a -> Type
+getType an = case fst (annotation an) of
+    Just t -> t
+    Nothing -> panic "Cannot get the type of something that is not typechecked"
+
+getSymbolTable :: Annotated (Maybe SymbolTable, PSymbolTable) a -> SymbolTable
+getSymbolTable an = case fst (annotation an) of
+    Just t -> t
+    Nothing -> panic "Cannot get the symbol table of something that is not typechecked"
+
+
+type PModule = AnModule
+type PDecl = AnDecl
+type PMatch = AnMatch
+type PPat = AnPat
+type PExp = AnExp
+type PStmt = AnStmt
+type PField = AnField
+type PDataTypeClause = AnDataTypeClause
+type PAssertion = AnAssertion
+type PInteractiveStmt = AnInteractiveStmt
+
+type TCModule = AnModule
+type TCDecl = AnDecl
+type TCMatch = AnMatch
+type TCPat = AnPat
+type TCExp = AnExp
+type TCField = AnField
+type TCStmt = AnStmt
+type TCDataTypeClause = AnDataTypeClause
+type TCAssertion = AnAssertion
+type TCInteractiveStmt = AnInteractiveStmt
+
+-- *************************************************************************
+-- Basic Components
+-- *************************************************************************
+data Literal = 
+    Int Integer
+    | Bool Bool
+    deriving (Eq, Show)
+
+-- *************************************************************************
+-- Modules
+-- *************************************************************************
+data Module = 
+    GlobalModule [AnDecl]
+    deriving (Eq, Show)
+
+-- *************************************************************************
+-- Expressions
+-- *************************************************************************
+data BinaryBooleanOp =
+    And 
+    | Or 
+    | Equals 
+    | NotEquals 
+    | LessThan 
+    | GreaterThan 
+    | LessThanEq 
+    | GreaterThanEq
+    deriving (Eq, Show)
+    
+data UnaryBooleanOp =
+    Not
+    deriving (Eq, Show)
+
+data UnaryMathsOp = 
+    Negate
+    deriving (Eq, Show)
+
+data BinaryMathsOp = 
+    Divide | Minus | Mod | Plus | Times
+    deriving (Eq, Show)
+
+data Exp =
+    App AnExp [AnExp]
+    | BooleanBinaryOp BinaryBooleanOp AnExp AnExp
+    | BooleanUnaryOp UnaryBooleanOp AnExp
+    | Concat AnExp AnExp
+    | DotApp AnExp AnExp
+    | If AnExp AnExp AnExp
+    | Lambda AnPat AnExp
+    | Let [AnDecl] AnExp
+    | Lit Literal
+    | List [AnExp]
+    | ListComp [AnExp] [AnStmt]
+    | ListEnumFrom AnExp
+    | ListEnumFromTo AnExp AnExp
+    -- TODO: ListEnumFrom and ListEnumTO - test in FDR
+    -- TODO: compare with official CSPM syntax
+    | ListLength AnExp
+    | MathsBinaryOp BinaryMathsOp AnExp AnExp
+    | MathsUnaryOp UnaryMathsOp AnExp
+    | Paren AnExp
+    | Set [AnExp]
+    | SetComp [AnExp] [AnStmt]
+    | SetEnum [AnExp]           -- {| |}
+    | SetEnumComp [AnExp] [AnStmt]  -- {|c.x | x <- xs|}
+    | SetEnumFrom AnExp
+    | SetEnumFromTo AnExp AnExp
+    | Tuple [AnExp]
+    | Var QualifiedName
+
+    -- Processes
+    | AlphaParallel AnExp AnExp AnExp AnExp -- Proc Alpha Alpha Proc
+    | Exception AnExp AnExp AnExp -- Proc Alpha Proc
+    | ExternalChoice AnExp AnExp
+    | GenParallel AnExp AnExp AnExp -- Proc Alpha Proc 
+    | GuardedExp AnExp AnExp            -- b & P
+    | Hiding AnExp AnExp
+    | InternalChoice AnExp AnExp
+    | Interrupt AnExp AnExp
+    | Interleave AnExp AnExp
+    | LinkParallel AnExp [(AnExp, AnExp)] [AnStmt] AnExp -- Exp, tied chans, generators, second
+    | Prefix AnExp [AnField] AnExp
+    | Rename AnExp [(AnExp, AnExp)] [AnStmt]
+    | SequentialComp AnExp AnExp -- P; Q
+    | SlidingChoice AnExp AnExp
+
+    -- Replicated Operators
+    | ReplicatedAlphaParallel [AnStmt] AnExp AnExp -- alpha exp is second
+    | ReplicatedExternalChoice [AnStmt] AnExp
+    | ReplicatedInterleave [AnStmt] AnExp 
+    | ReplicatedInternalChoice [AnStmt] AnExp
+    | ReplicatedLinkParallel [(AnExp, AnExp)] [AnStmt] AnExp
+    | ReplicatedParallel AnExp [AnStmt] AnExp -- alpha exp is first
+    
+    -- Used only for parsing
+    | ExpPatWildCard
+    | ExpPatDoublePattern AnExp AnExp
+    
+    deriving (Eq, Show)
+
+data Field = 
+    -- | !x
+    Output AnExp
+    -- | ?x:A
+    | Input AnPat (Maybe AnExp)
+    -- | $x:A (see P395 UCS)
+    | NonDetInput AnPat (Maybe AnExp)
+    deriving (Eq, Show)
+    
+data Stmt = 
+    Generator AnPat AnExp
+    | Qualifier AnExp
+    deriving (Eq, Show)
+
+-- A statement in an interactive session
+data InteractiveStmt =
+    Evaluate AnExp
+    | Bind AnDecl
+    | RunAssertion Assertion
+    deriving Show
+    
+-- *************************************************************************
+-- Declarations
+-- *************************************************************************
+data Decl = 
+    -- Third argument is the annotated type
+    FunBind Name [AnMatch]
+    | PatBind AnPat AnExp
+    | Assert Assertion
+    | External [Name]
+    | Transparent [Name]
+    -- The expression in the following three definitions means a type expression
+    -- and therefore dots and commas have special meanings. See TPC P529 for
+    -- details (or the typechecker or evaluator).
+    | Channel [Name] (Maybe AnExp)
+    | DataType Name [AnDataTypeClause]
+    | NameType Name AnExp
+    deriving (Eq, Show)
+
+-- TODO: annotate
+data Assertion = 
+    Refinement AnExp Model AnExp [ModelOption]
+    | PropertyCheck AnExp SemanticProperty (Maybe Model)
+    | BoolAssertion AnExp
+    | ASNot Assertion
+    deriving (Eq, Show)
+        
+data Model = 
+    Traces 
+    | Failures 
+    | FailuresDivergences 
+    | Refusals
+    | RefusalsDivergences
+    | Revivals
+    | RevivalsDivergences
+    deriving (Eq, Show)
+    
+data ModelOption = 
+    TauPriority AnExp
+    deriving (Eq, Show)
+        
+data SemanticProperty = 
+    DeadlockFreedom
+    | Deterministic     
+    | LivelockFreedom
+    deriving (Eq, Show)
+    
+-- TODO: annotate
+data DataTypeClause =
+    DataTypeClause Name (Maybe AnExp)
+    deriving (Eq, Show)
+
+data Match =
+    Match [[AnPat]] AnExp
+    deriving (Eq, Show)
+
+data Pat =
+    PConcat AnPat AnPat
+    | PDotApp AnPat AnPat
+    | PDoublePattern AnPat AnPat
+    | PList [AnPat]
+    | PLit Literal
+    | PParen AnPat
+    | PSet [AnPat]
+    | PTuple [AnPat]
+    | PVar Name
+    | PWildCard
+    
+    -- In all compiled patterns we store the original pattern
+    -- Because of the fact that you can write patterns such as:
+    --  f(<x,y>^xs^<z,p>)
+    --  f(<x,y>)
+    --  f(xs^<x,y>)
+    -- we need an easy may of matching them. Thus, we compile
+    -- the patterns to a PCompList instead.
+    -- PCompList ps (Just (p, ps')) corresponds to a list
+    -- where it starts with ps (where each p in ps matches exactly one
+    -- component, has a middle of p and and end matching exactly ps'
+    | PCompList [AnPat] (Maybe (AnPat, [AnPat])) Pat
+    -- Recall the longest match rule when evaluating this
+    -- How about:
+    -- channel c : A.Int.A
+    -- datatype A = B.Bool
+    -- func(c.B.true.x) =
+    -- func(c.B.false.0.B.x) =
+    | PCompDot [AnPat] Pat
+
+    deriving (Eq, Show)
diff --git a/src/CSPM/DataStructures/Tokens.hs b/src/CSPM/DataStructures/Tokens.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/DataStructures/Tokens.hs
@@ -0,0 +1,199 @@
+module CSPM.DataStructures.Tokens (
+    Token(..), LToken, Model(..),
+)
+where
+
+import CSPM.DataStructures.Syntax (Model(..))
+import CSPM.PrettyPrinter
+import Util.Annotated
+import Util.PrettyPrint
+
+data Token = 
+    TInteger Integer
+    | TFalse
+    | TTrue
+    | TIdent String
+
+    | TRefines Model
+    | TModel Model
+    | TTauPriority
+    | TDeadlockFree
+    | TDivergenceFree
+    | TLivelockFree
+    | TDeterministic
+
+    | TNewLine
+    | TDefineEqual
+
+    | TComma
+    | TDot
+    | TExclamationMark
+    | TQuestionMark
+    | TDollar
+    | TPipe
+    | TDoubleDot
+    | TColon
+    | TDrawnFrom
+    | TTie -- "<->"
+
+    | TDoubleAt
+    | TWildCard
+
+    | TIf
+    | TThen
+    | TElse
+    | TLet
+    | TWithin
+    | TBackSlash
+    | TLambdaDot
+    | TChannel
+    | TAssert
+    | TDataType
+    | TExternal
+    | TTransparent
+    | TNameType
+
+    | TSemiColon
+    | TGuard
+
+    | TNot
+    | TAnd
+    | TOr
+    | TEq
+    | TNotEq
+    | TLtEq
+    | TGtEq
+    | TLt
+    | TGt
+    | TPlus
+    | TMinus
+    | TTimes
+    | TDivide
+    | TMod
+    | TCloseSeq
+    | TEmptySeq
+
+    | TConcat
+    | THash
+
+    | TLParen
+    | TRParen
+    | TLBrace
+    | TRBrace
+    | TLPipeBrace
+    | TRPipeBrace
+    | TLDoubleSqBracket
+    | TRDoubleSqBracket
+    | TLPipeSqBracket
+    | TRPipeSqBracket
+    | TLSqBracket
+    | TRSqBracket 
+    
+    | TExtChoice
+    | TIntChoice
+    | TInterleave
+    | TPrefix
+    | TInterrupt
+    | TSlidingChoice
+    | TRException
+    | TParallel
+
+    | TEOF
+    deriving Eq
+    
+type LToken = Located Token
+
+instance Show Token where
+    show t = show (prettyPrint t)
+
+instance PrettyPrintable Token where
+    prettyPrint (TInteger i) = integer i
+    prettyPrint TFalse = text "false"
+    prettyPrint TTrue = text "true"
+    prettyPrint (TIdent s) = text s
+
+    prettyPrint (TRefines m) = char '[' <> prettyPrint m <> char '='
+    prettyPrint (TModel m) = char '[' <> prettyPrint m <> char ']'
+    prettyPrint TTauPriority = text "tau priority"
+    prettyPrint TDeadlockFree = text "deadlock free"
+    prettyPrint TDivergenceFree = text "divergence free"
+    prettyPrint TLivelockFree = text "livelock free"
+    prettyPrint TDeterministic = text "deterministic"
+
+    prettyPrint TNewLine = text "<newline>"
+    prettyPrint TDefineEqual = char '='
+
+    prettyPrint TComma = char ','
+    prettyPrint TDot = char '.'
+    prettyPrint TExclamationMark = char '!'
+    prettyPrint TQuestionMark = char '?'
+    prettyPrint TDollar = char '$'
+    prettyPrint TPipe = char '|'
+    prettyPrint TDoubleDot = text ".."
+    prettyPrint TColon = char ':'
+    prettyPrint TDrawnFrom = text "<-"
+    prettyPrint TTie = text "<->"
+
+    prettyPrint TDoubleAt = text "@@"
+    prettyPrint TWildCard = char '_'
+
+    prettyPrint TIf = text "if"
+    prettyPrint TThen = text "then"
+    prettyPrint TElse = text "else"
+    prettyPrint TLet = text "let"
+    prettyPrint TWithin = text "within"
+    prettyPrint TBackSlash = char '\\'
+    prettyPrint TLambdaDot = char '@'
+    prettyPrint TChannel = text "channel"
+    prettyPrint TAssert = text "assert"
+    prettyPrint TDataType = text "datatype"
+    prettyPrint TExternal = text "external"
+    prettyPrint TTransparent = text "transparent"
+    prettyPrint TNameType = text "nametype"
+
+    prettyPrint TSemiColon = char ';'
+    prettyPrint TGuard = char '&'
+
+    prettyPrint TNot = text "not"
+    prettyPrint TAnd = text "and"
+    prettyPrint TOr = text "or"
+    prettyPrint TEq = text "=="
+    prettyPrint TNotEq = text "!="
+    prettyPrint TLtEq = text "<="
+    prettyPrint TGtEq = text ">="
+    prettyPrint TLt = char '<'
+    prettyPrint TGt = char '>'
+    prettyPrint TPlus = char '+'
+    prettyPrint TMinus = char '-'
+    prettyPrint TTimes = char '*'
+    prettyPrint TDivide = char '/'
+    prettyPrint TMod = char '%'
+    prettyPrint TCloseSeq = char '<'
+    prettyPrint TEmptySeq = text "<>"
+
+    prettyPrint TConcat = char '^'
+    prettyPrint THash = char '#'
+
+    prettyPrint TLParen = char '('
+    prettyPrint TRParen = char ')'
+    prettyPrint TLBrace = char '{'
+    prettyPrint TRBrace = char '}'
+    prettyPrint TLPipeBrace = text "{|"
+    prettyPrint TRPipeBrace = text "|}"
+    prettyPrint TLDoubleSqBracket = text "[["
+    prettyPrint TRDoubleSqBracket = text "]]"
+    prettyPrint TLPipeSqBracket = text "[|"
+    prettyPrint TRPipeSqBracket = text "|]"
+    prettyPrint TLSqBracket = text "["
+    prettyPrint TRSqBracket = text "]"
+    
+    prettyPrint TExtChoice = text "[]"
+    prettyPrint TIntChoice = text "|~|"
+    prettyPrint TInterleave = text "|||"
+    prettyPrint TPrefix = text "->"
+    prettyPrint TInterrupt = text "/\\"
+    prettyPrint TSlidingChoice = text "[>"
+    prettyPrint TRException = text "|>"
+    prettyPrint TParallel = text "||"
+
+    prettyPrint TEOF = text "EOF"
diff --git a/src/CSPM/DataStructures/Types.hs b/src/CSPM/DataStructures/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/DataStructures/Types.hs
@@ -0,0 +1,165 @@
+module CSPM.DataStructures.Types where
+
+import Control.Monad.Trans
+import Data.IORef
+import Data.List
+
+import CSPM.DataStructures.Names
+import Util.PartialFunctions
+import Util.PrettyPrint
+
+-- *************************************************************************
+-- Types
+-- *************************************************************************
+newtype TypeVar = TypeVar Int deriving (Eq, Show)
+
+data TypeScheme =
+    ForAll [(TypeVar, [Constraint])] Type
+    deriving (Eq, Show)
+    
+data Constraint =
+    Eq | Ord
+    deriving (Eq, Ord, Show)
+
+-- During Type Checking we use TDotable a b only when a is something
+-- atomic. Except, during unification we start doing TDotable (TDot...)
+-- and may build up large TDotable a b types.
+data Type =
+    TVar TypeVarRef
+    | TProc
+    | TInt
+    | TBool
+    | TEvent
+    -- Something that can be extended to an event (only used internally)
+    | TEventable
+    | TSet Type
+    | TSeq Type
+    | TDot Type Type
+    | TTuple [Type]
+    -- Arguments to result type
+    | TFunction [Type] Type
+    -- TDotable a b means that this type can be dotted
+    -- with an a to yield something of type b
+    | TDotable Type Type
+    | TDatatype Name
+    deriving (Eq, Show)
+
+data TypeVarRef = 
+    TypeVarRef TypeVar [Constraint] PType
+
+instance Eq TypeVarRef where
+    (TypeVarRef tv1 cs1 pt1) == (TypeVarRef tv2 cs2 pt2) = tv1 == tv2
+
+instance Show TypeVarRef where
+    show (TypeVarRef tv cs _) = "TypeVarRef "++show tv ++ show cs
+
+newtype IORefMaybe a = IORefMaybe (Maybe a)
+type SymbolTable = PartialFunction Name TypeScheme
+type PType = IORef (Maybe Type)
+type PSymbolTable = IORef SymbolTable
+
+readPType :: (MonadIO m) => PType -> m (Maybe Type)
+readPType ioref = liftIO $ readIORef ioref
+
+setPType :: (MonadIO m) => PType -> Type -> m ()
+setPType ioref t = liftIO $ writeIORef ioref (Just t)
+
+freshPType :: (MonadIO m) => m PType
+freshPType = liftIO $ newIORef Nothing
+
+readPSymbolTable :: (MonadIO m) => PSymbolTable -> m SymbolTable
+readPSymbolTable ioref = liftIO $ readIORef ioref
+
+setPSymbolTable :: (MonadIO m) => PSymbolTable -> SymbolTable -> m ()
+setPSymbolTable ioref t = liftIO $ writeIORef ioref t
+
+freshPSymbolTable :: (MonadIO m) => m PSymbolTable
+freshPSymbolTable = liftIO $ newIORef []
+
+instance PrettyPrintable Constraint where
+    prettyPrint Eq = text "Eq"
+    prettyPrint Ord = text "Ord"
+
+-- | Pretty prints several types using the same variable substitutions
+prettyPrintTypes :: [Type] -> [Doc]
+prettyPrintTypes ts = map (prettyPrintType vmap) ts
+    where
+        vs = (nub . map fst . concatMap collectConstraints) ts
+        -- | Map from int to letter to improve presentation
+        vmap = zip (map (\ (TypeVar n) -> n) vs) ['a'..'z']
+
+instance PrettyPrintable Type where
+    prettyPrint t = prettyPrint (ForAll (collectConstraints t) t)
+
+instance PrettyPrintable TypeScheme where
+    prettyPrint (ForAll ts t) =
+        (if length varsWithCs > 0 then 
+            (if length varsWithCs > 1 then parens constraintsText 
+            else constraintsText)
+            <+> text "=> "
+        else empty)
+        <> prettyPrintType vmap t
+        where
+            -- | Map from int to letter to improve presentation
+            vmap = zip (map (\ (TypeVar n, _) -> n) ts) ['a'..'z']
+            -- | Vars with constraints
+            varsWithCs = [(v, c) | (v, cs) <- ts, c <- cs, cs /= []]
+
+            constraintsText = 
+                hsep (
+                    punctuate comma [
+                        prettyPrint c <+> char (apply vmap n)
+                     | (TypeVar n, c) <- varsWithCs]
+                )
+
+prettyPrintType :: PartialFunction Int Char -> Type -> Doc
+prettyPrintType vmap (TVar (TypeVarRef (TypeVar n) cs ioref)) = 
+    case safeApply vmap n of
+        Just c  -> char c
+        Nothing -> int n
+prettyPrintType vmap (TFunction targs tr) = 
+    parens (hsep (punctuate comma (map (prettyPrintType vmap) targs)))
+    <+> text "->" <+> prettyPrintType vmap tr
+prettyPrintType vmap (TSeq t) =
+    char '<' <> prettyPrintType vmap t <> char '>'
+prettyPrintType vmap (TSet t) =
+    char '{' <> prettyPrintType vmap t <> char '}'
+prettyPrintType vmap (TTuple ts) =
+    parens (hsep (punctuate comma (map (prettyPrintType vmap) ts)))
+prettyPrintType vmap (TDot t1 t2) =
+    (case t1 of
+        TDotable _ _ -> parens (prettyPrintType vmap t1)
+        _               -> prettyPrintType vmap t1
+    ) <> text "." <> prettyPrintType vmap t2
+prettyPrintType vmap (TDotable t1 t2) =
+    prettyPrintType vmap t1 <> text "=>" <> prettyPrintType vmap t2
+prettyPrintType vmap (TDatatype (Name n)) = text n
+
+prettyPrintType vmap (TBool) = text "Bool"
+prettyPrintType vmap (TInt) = text "Int"
+prettyPrintType vmap (TProc) = text "Proc"
+prettyPrintType vmap (TEvent) = text "Event"
+prettyPrintType vmap (TEventable) = text "Event or Channel"
+
+collectConstraints :: Type -> [(TypeVar, [Constraint])]
+collectConstraints = combine . collect
+    where
+        combine :: [(TypeVar, [Constraint])] -> [(TypeVar, [Constraint])]
+        combine xs = 
+            map (\ ys -> (head (map fst ys), nub (concat (map snd ys))))
+                (groupBy (\ (v1, _) (v2, _) -> v1 == v2) xs)
+        collect :: Type -> [(TypeVar, [Constraint])]
+        collect (TVar (TypeVarRef v cs _)) = [(v, cs)]
+        collect (TFunction targs tr) = 
+            concatMap collect targs ++ collect tr
+        collect (TSeq t) = collect t
+        collect (TSet t) = collect t
+        collect (TTuple ts) = concatMap collect ts
+        collect (TDot t1 t2) = collect t1 ++ collect t2
+        collect (TDotable t1 t2) = collect t1 ++ collect t2
+        collect (TDatatype _) = []
+        collect TBool = []
+        collect TInt = []
+        collect TProc = []
+        collect TEvent = []
+        collect TEventable = []
diff --git a/src/CSPM/Desugar.hs b/src/CSPM/Desugar.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Desugar.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE FlexibleInstances #-}
+module CSPM.Desugar where
+
+import CSPM.DataStructures.Syntax
+import CSPM.DataStructures.Types
+import CSPM.PrettyPrinter
+import Util.Annotated
+import Util.Exception
+import Util.PrettyPrint
+
+class Desugarable a where
+    desugar :: a -> a
+    desugarWithType :: a -> Type -> a
+    
+    desugarWithType a t = desugar a
+
+instance Desugarable a => Desugarable [a] where
+    desugar xs = map desugar xs
+instance Desugarable a => Desugarable (Maybe a) where
+    desugar Nothing = Nothing
+    desugar (Just a) = Just (desugar a)
+instance Desugarable a => Desugarable (Annotated Type a) where
+    desugar (An l t i) = An l t (desugarWithType i t)
+instance Desugarable a => Desugarable (Annotated b a) where
+    desugar (An l b i) = An l b (desugar i)
+instance (Desugarable a, Desugarable b) => Desugarable (a,b) where
+    desugar (a,b) = (desugar a, desugar b)
+
+instance Desugarable Module where
+    desugar (GlobalModule ds) = GlobalModule (desugar ds)
+
+instance Desugarable Decl where
+    desugar (FunBind n ms) = FunBind n (desugar ms)
+    desugar (PatBind p e) = PatBind (desugar p) (desugar e)
+    desugar (Assert a) = Assert (desugar a)
+    desugar (External ns) = External ns
+    desugar (Transparent ns) = Transparent ns
+    desugar (Channel ns me) = Channel ns (desugar me)
+    desugar (DataType n cs) = DataType n (desugar cs)
+    desugar (NameType n e) = NameType n (desugar e)
+
+instance Desugarable Assertion where
+    desugar (Refinement e1 m e2 opts) = 
+        Refinement (desugar e1) m (desugar e2) (desugar opts)
+    desugar (PropertyCheck e p m) = 
+        PropertyCheck (desugar e) p m
+
+instance Desugarable ModelOption where
+    desugar (TauPriority e) = TauPriority (desugar e)
+
+instance Desugarable DataTypeClause where
+    desugar (DataTypeClause n me) = DataTypeClause n (desugar me)
+
+instance Desugarable Match where
+    desugar (Match pss e) = Match (desugar pss) (desugar e)
+
+instance Desugarable Exp where
+    desugar (App e es) = App (desugar e) (desugar es)
+    desugar (BooleanBinaryOp op e1 e2) = 
+        BooleanBinaryOp op (desugar e1) (desugar e2)
+    desugar (BooleanUnaryOp op e) =
+        BooleanUnaryOp op (desugar e)
+    desugar (Concat e1 e2) = Concat (desugar e1) (desugar e2)
+    desugar (DotApp e1 e2) = DotApp (desugar e1) (desugar e2)
+    desugar (If e1 e2 e3) = If (desugar e1) (desugar e2) (desugar e3)
+    desugar (Lambda p e) = Lambda (desugar p) (desugar e)
+    desugar (Let ds e) = Let (desugar ds) (desugar e)
+    desugar (Lit l) = Lit (desugar l)
+    desugar (List es) = List (desugar es)
+    desugar (ListComp es stmts) = ListComp (desugar es) (desugar stmts)
+    desugar (ListEnumFrom e) = ListEnumFrom (desugar e)
+    desugar (ListEnumFromTo e1 e2) = ListEnumFromTo (desugar e1) (desugar e2)
+    desugar (ListLength e) = ListLength (desugar e)
+    desugar (MathsBinaryOp op e1 e2) = 
+        MathsBinaryOp op (desugar e1) (desugar e2)
+    desugar (MathsUnaryOp op e) = MathsUnaryOp op (desugar e)
+    -- We don't remove the Paren as people may pretty print a desugared
+    -- expression, which would then not have parenthesis needed to
+    -- remove ambiguity
+    desugar (Paren e) = Paren (desugar e)
+    desugar (Set es) = Set (desugar es)
+    desugar (SetComp es stmts) = SetComp (desugar es) (desugar stmts)
+    desugar (SetEnum es) = SetEnum (desugar es)
+    desugar (SetEnumComp es stmts) = SetEnumComp (desugar es) (desugar stmts)
+    desugar (SetEnumFrom e) = SetEnumFrom (desugar e)
+    desugar (SetEnumFromTo e1 e2) = SetEnumFromTo (desugar e1) (desugar e2)
+    desugar (Tuple es) = Tuple (desugar es)
+    desugar (Var n) = Var n
+
+    desugar (AlphaParallel e1 e2 e3 e4) =
+        AlphaParallel (desugar e1) (desugar e2) (desugar e3) (desugar e4)
+    desugar (Exception e1 e2 e3) =
+        Exception (desugar e1) (desugar e2) (desugar e3)
+    desugar (ExternalChoice e1 e2) = ExternalChoice (desugar e1) (desugar e2)
+    desugar (GenParallel e1 e2 e3) =
+        GenParallel (desugar e1) (desugar e2) (desugar e3)
+    desugar (GuardedExp e1 e2) = GuardedExp (desugar e1) (desugar e2)
+    desugar (Hiding e1 e2) = Hiding (desugar e1) (desugar e2)
+    desugar (InternalChoice e1 e2) = InternalChoice (desugar e1) (desugar e2)
+    desugar (Interrupt e1 e2) = Interrupt (desugar e1) (desugar e2)
+    desugar (Interleave e1 e2) = Interleave (desugar e1) (desugar e2)
+    desugar (LinkParallel e1 ties stmts e2) = 
+        LinkParallel (desugar e1) (desugar ties) (desugar stmts) (desugar e2)
+    desugar (Prefix e1 fs e2) = Prefix (desugar e1) (desugar fs) (desugar e2)
+    desugar (Rename e1 ties stmts) =
+        Rename (desugar e1) (desugar ties) (desugar stmts)
+    desugar (SequentialComp e1 e2) = SequentialComp (desugar e1) (desugar e2)
+    desugar (SlidingChoice e1 e2) = SlidingChoice (desugar e1) (desugar e2)
+    
+    desugar (ReplicatedAlphaParallel stmts e1 e2) =
+        ReplicatedAlphaParallel (desugar stmts) (desugar e1) (desugar e2)
+    desugar (ReplicatedInterleave stmts e) =
+        ReplicatedInterleave (desugar stmts) (desugar e)
+    desugar (ReplicatedExternalChoice stmts e) =
+        ReplicatedExternalChoice (desugar stmts) (desugar e)
+    desugar (ReplicatedInternalChoice stmts e) =
+        ReplicatedInternalChoice (desugar stmts) (desugar e)
+    desugar (ReplicatedParallel stmts e1 e2) =
+        ReplicatedParallel (desugar stmts) (desugar e1) (desugar e2)
+    desugar (ReplicatedLinkParallel ties stmts e) =
+        ReplicatedLinkParallel (desugar ties) (desugar stmts) (desugar e)
+    
+instance Desugarable Field where
+    desugar (Output e) = Output (desugar e)
+    desugar (Input p e) = Input (desugar p) (desugar e)
+    desugar (NonDetInput p e) = NonDetInput (desugar p) (desugar e)
+
+instance Desugarable Stmt where
+    desugar (Generator p e) = Generator (desugar p) (desugar e)
+    desugar (Qualifier e) = Qualifier (desugar e)
+
+instance Desugarable InteractiveStmt where
+    desugar (Bind d) = Bind (desugar d)
+    desugar (Evaluate e) = Evaluate (desugar e)
+    desugar (RunAssertion a) = RunAssertion (desugar a)
+
+instance Desugarable Pat where
+    desugar (PConcat p1 p2) = 
+        let
+            combine (as1, Just (p, bs1)) (as2, Nothing) = (as1, Just (p, bs1++as2))
+            combine (as1, Nothing) (as2, p) = (as1++as2, p)
+            
+            extractCompList :: AnPat -> ([AnPat], Maybe (AnPat, [AnPat]))
+            extractCompList (An _ _ (PCompList ps mp _)) = (ps, mp)
+            extractCompList p = ([], Just (p, []))
+            
+            (start, end) = 
+                combine (extractCompList . desugar $ p1)
+                        (extractCompList . desugar $ p2)
+        in PCompList start end (PConcat p1 p2)
+    desugar (PList ps) = PCompList (map desugar ps) Nothing (PList ps)
+    desugar (PDotApp p1 p2) = 
+        let
+            extractDotList (An _ _ (PCompDot ds _)) = ds
+            extractDotList d = [d]
+            ds1 = extractDotList (desugar p1)
+            ds2 = extractDotList (desugar p2)
+        in PCompDot (ds1++ds2) (PDotApp p1 p2)
+    desugar (PDoublePattern p1 p2) =
+        PDoublePattern (desugar p1) (desugar p2)
+    desugar (PLit l) = PLit (desugar l)
+    -- We don't remove the Paren as people may pretty print a desugared
+    -- expression, which would then not have parenthesis needed to
+    -- remove ambiguity
+    desugar (PParen p) = PParen (desugar p)
+    desugar (PSet []) = PSet []
+    desugar (PSet [p]) = PSet [desugar p]
+    desugar (PSet ps) = throwSourceError [mkErrorMessage l err]
+        where
+            -- TODO: get a proper location for the whole
+            -- pattern
+            l = loc (head ps)
+            err = prettyPrint (PSet ps) <+> text "is not a valid set pattern as set patterns may only match at most one element"
+    desugar (PTuple ps) = PTuple (map desugar ps)
+    desugar (PVar n) = PVar n
+    desugar (PWildCard) = PWildCard
+
+instance Desugarable Literal where
+    desugar l = l
diff --git a/src/CSPM/Evaluator.hs b/src/CSPM/Evaluator.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator.hs
@@ -0,0 +1,50 @@
+module CSPM.Evaluator (
+    evaluateExp, evaluateDecl, evaluateFile,
+    getBoundNames, addToEnvironment,
+    
+    initEvaluator, runFromStateToState,
+    EvaluationMonad, runEvaluator, EvaluationState,
+) where
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.DataStructures.Types
+import CSPM.Evaluator.BuiltInFunctions
+import CSPM.Evaluator.DeclBind
+import CSPM.Evaluator.Environment
+import CSPM.Evaluator.Expr
+import CSPM.Evaluator.Module
+import CSPM.Evaluator.Monad
+import CSPM.Evaluator.Values
+
+runFromStateToState :: EvaluationState -> EvaluationMonad a -> 
+    (a, EvaluationState)
+runFromStateToState st prog = runEvaluator st $ do
+    r <- prog
+    s <- getState
+    return (r, s)
+
+-- | The environment to use initially. This uses the IO monad as 
+-- the EvaluationMonad cannot be used without a valid environment.
+initEvaluator :: EvaluationState
+initEvaluator = runEvaluator (EvaluationState new) $
+    injectBuiltInFunctions getState
+
+evaluateExp :: TCExp -> EvaluationMonad Value
+evaluateExp e = eval e
+
+-- | Evaluates the declaration but doesn't add it to the current environment.
+evaluateDecl :: TCDecl -> EvaluationMonad [(Name, Value)]
+evaluateDecl d = bindDecls [d]
+
+-- | Evaluates the declaration but doesn't add it to the current environment.
+evaluateFile :: [TCModule] -> EvaluationMonad [(Name, Value)]
+evaluateFile ms = bindModules ms
+
+getBoundNames :: EvaluationMonad [Name]
+getBoundNames = 
+    getEnvironment >>= return . filter (not . isInternal) . map fst . flatten
+
+addToEnvironment 
+    :: EvaluationMonad [(Name, Value)] -> EvaluationMonad EvaluationState
+addToEnvironment bs = addScopeAndBindM bs getState
diff --git a/src/CSPM/Evaluator/BuiltInFunctions.hs b/src/CSPM/Evaluator/BuiltInFunctions.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/BuiltInFunctions.hs
@@ -0,0 +1,95 @@
+module CSPM.Evaluator.BuiltInFunctions where
+
+import Control.Monad
+
+import qualified CSPM.Compiler.Set as CS
+import CSPM.DataStructures.Names
+import CSPM.Evaluator.Monad
+import CSPM.Evaluator.Values
+import qualified CSPM.Evaluator.ValueSet as S
+import Util.Exception
+
+builtInFunctions :: [(Name, Value)]
+builtInFunctions = 
+    let
+        cspm_union [VSet s1, VSet s2] = S.union s1 s2
+        cspm_inter [VSet s1, VSet s2] = S.intersection s1 s2
+        cspm_diff [VSet s1, VSet s2] = S.difference s1 s2
+        cspm_Union ss = S.unions (map (\ (VSet s) -> s) ss)
+        cspm_Inter ss = S.intersections (map (\ (VSet s) -> s) ss)
+        cspm_member [v, VSet s] = VBool $ S.member v s
+        cspm_card [VSet s] = VInt $ S.card s
+        cspm_empty [VSet s] = VBool $ S.empty s
+        cspm_set [VList xs] = S.fromList xs
+        cspm_Set [VSet s] = S.powerset s
+        -- | Set of all sequences over s
+        cspm_Seq [VSet s] = S.allSequences s
+        cspm_seq [VSet s] = S.toList s
+        
+        
+        cspm_length [VList xs] = VInt $ (toInteger (length xs))
+        cspm_null [VList xs] = VBool $ null xs
+        cspm_head [VList xs] = head xs
+        cspm_tail [VList xs] = tail xs
+        cspm_concat [VList xs] = concat (map (\(VList ys) -> ys) xs)
+        cspm_elem [v, VList vs] = VBool $ v `elem` vs
+        csp_chaos [VSet a] = VProc $ PProcCall n (Just p)
+            where
+                n = procId (Name "CHAOS") [[VSet a]]
+                evSet = S.valueSetToEventSet a
+                branches = [PPrefix ev (PProcCall n Nothing) | ev <- CS.toList evSet]
+                stopProc = PProcCall (procId (Name "STOP") []) (Just csp_stop)
+                p = PInternalChoice (stopProc:branches)
+        
+        -- | Functions that return sets
+        set_funcs = [
+            ("union", cspm_union), ("inter", cspm_inter), 
+            ("diff", cspm_diff), ("Union", cspm_Union), 
+            ("Inter", cspm_Inter), ("set", cspm_set), 
+            ("Set", cspm_Set), ("Seq", cspm_Seq)
+            ]
+        
+        -- | Functions that return sequences
+        seq_funcs = [
+            ("seq", cspm_seq), ("tail", cspm_tail), ("concat", cspm_concat)
+            ]
+        
+        -- | Functions that return something else
+        other_funcs = [
+            ("length", cspm_length), ("null", cspm_null), 
+            ("head", cspm_head), ("elem", cspm_elem),
+            ("member", cspm_member), ("card", cspm_card),
+            ("empty", cspm_empty), ("CHAOS", csp_chaos)
+            ]
+        
+        mkFunc (s, f) = (Name s, VFunction (\ vs -> return (f vs)))
+        
+        procs = [
+            (csp_stop_id, csp_stop),
+            (csp_skip_id, PPrefix Tick (PProcCall csp_stop_id (Just csp_stop)))
+            ]
+        
+        csp_skip_id = procId (Name "SKIP") []
+        csp_stop_id = procId (Name "STOP") []
+        csp_stop = PExternalChoice []
+        
+        mkProc (s, p) = (Name s, VProc p)
+        
+        cspm_true = ("true", VBool True)
+        cspm_false = ("false", VBool False)
+        cspm_True = ("True", VBool True)
+        cspm_False = ("False", VBool False)
+        
+        constants = [cspm_true, cspm_false, cspm_True, cspm_False]
+        
+        mkConstant (s, v) = (Name s, v)
+    in
+        map mkFunc (
+            map (\ (n, f) -> (n, VSet . f)) set_funcs
+            ++ map (\ (n, f) -> (n, VList . f)) seq_funcs
+            ++ other_funcs)
+        ++ map mkProc procs
+        ++ map mkConstant constants
+
+injectBuiltInFunctions :: EvaluationMonad a -> EvaluationMonad a
+injectBuiltInFunctions = addScopeAndBind builtInFunctions
diff --git a/src/CSPM/Evaluator/DeclBind.hs b/src/CSPM/Evaluator/DeclBind.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/DeclBind.hs
@@ -0,0 +1,120 @@
+{-# LANGUAGE TypeSynonymInstances #-}
+module CSPM.Evaluator.DeclBind (
+    bindDecls, valuesForChannel, valuesForDataTypeClause,
+) where
+
+import Control.Monad
+import Data.Maybe
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.Evaluator.Exceptions
+import {-# SOURCE #-} CSPM.Evaluator.Expr
+import CSPM.Evaluator.Monad
+import CSPM.Evaluator.PatBind
+import CSPM.Evaluator.Values
+import CSPM.Evaluator.ValueSet
+import Util.Annotated
+
+bindDecls :: [TCDecl] -> EvaluationMonad [(Name, Value)]
+bindDecls ds = do
+    bss <- mapM bindDecl ds
+    return (concat bss)
+
+bindDecl :: AnDecl -> EvaluationMonad [(Name, Value)]
+bindDecl (an@(An _ _ (FunBind n ms))) = do
+        func <- collectArgs argGroupCount []
+        return [(n, func)]
+    where
+        mss = map unAnnotate ms
+        argGroupCount = head (map (\ (Match pss e) -> length pss) mss)
+        collectArgs :: Int -> [[Value]] -> EvaluationMonad Value
+        collectArgs 0 ass_ = do
+            bss <- mapM (\ (Match pss e) -> do
+                    r <- zipWithM bindAll pss ass
+                    let b = and (map fst r)
+                    let binds = concatMap snd r
+                    return ((b, binds), e)
+                ) mss
+            let
+                rs :: [([(Name, Value)], TCExp)]
+                rs = [(bs, e) | ((True, bs), e) <- bss]
+            case rs of
+                ((binds, exp):_) ->
+                    addScopeAndBind binds (do
+                        v <- eval exp
+                        case v of
+                            VProc p -> 
+                                return $ VProc $ PProcCall (procId n ass) (Just p)
+                            _ -> return v)
+                _       -> throwError $ 
+                    funBindPatternMatchFailureMessage (loc an) n ass
+            where
+                ass = reverse ass_
+        collectArgs n ass =
+            return $ VFunction $ \ vs -> collectArgs (n-1) (vs:ass)
+bindDecl (an@(An _ _ (PatBind p e))) = do
+    v <- eval e
+    r <- bind p v
+    case r of 
+        (True, bs) -> return bs
+        (False, _) -> throwError $ patternMatchFailureMessage (loc an) p v
+bindDecl (an@(An _ _ (Channel ns me))) = do
+    -- TODO: check channel values are in es
+    vs <- case me of 
+        Nothing -> return []
+        Just e -> do
+            v <- eval e
+            return $ evalTypeExprToList v
+    return $ [(n, VEvent n []) | n <- ns]++
+            [(internalNameForChannel n, VTuple (map VSet vs)) | n <- ns]
+bindDecl (an@(An _ _ (DataType n cs))) =
+    -- TODO: check data values are in e
+    let
+        bindClause (DataTypeClause nc Nothing) = do
+            return (emptySet, [(nc, VDataType nc []), 
+                    (internalNameForDataTypeClause nc, VTuple [])])
+        bindClause (DataTypeClause nc (Just e)) = do
+            v <- eval e
+            let 
+                sets = evalTypeExprToList v
+                setOfValues = cartesianProduct (VDataType nc) sets
+                binds = [(nc, VDataType nc []),
+                    (internalNameForDataTypeClause nc, VTuple (map VSet sets))]
+            return (setOfValues, binds)
+    in do
+        (sets, binds) <- mapAndUnzipM (bindClause . unAnnotate) cs
+        let dt = (n, VSet (unions sets))
+        return $ dt:concat binds
+bindDecl (an@(An _ _ (NameType n e))) = do
+    v <- eval e
+    return [(n, VSet $ evalTypeExpr v)]
+
+bindDecl (an@(An _ _ (Assert _))) = return []
+bindDecl (an@(An _ _ (External ns))) = return []
+bindDecl (an@(An _ _ (Transparent ns))) = return []
+
+internalNameForChannel, internalNameForDataTypeClause :: Name -> Name
+internalNameForChannel (Name n) = 
+    mkInternalName ("VALUE_TUPLE_CHANNEL_"++n)
+internalNameForDataTypeClause (Name n) = 
+    mkInternalName ("VALUE_TUPLE_DT_CLAUSE_"++n)
+
+valuesForChannel :: Name -> EvaluationMonad [ValueSet]
+valuesForChannel n = do
+    VTuple vs <- lookupVar (internalNameForChannel n)
+    return $ map (\(VSet s) -> s) vs
+
+valuesForDataTypeClause :: Name -> EvaluationMonad [ValueSet]
+valuesForDataTypeClause n = do
+    VTuple vs <- lookupVar (internalNameForDataTypeClause n)
+    return $ map (\(VSet s) -> s) vs
+
+evalTypeExpr :: Value -> ValueSet
+evalTypeExpr (VSet s) = s
+evalTypeExpr (VDot vs) = cartesianProduct VDot (map evalTypeExpr vs)
+evalTypeExpr (VTuple vs) = cartesianProduct VTuple (map evalTypeExpr vs)
+
+evalTypeExprToList :: Value -> [ValueSet]
+evalTypeExprToList (VDot vs) = map evalTypeExpr vs
+evalTypeExprToList v = [evalTypeExpr v]
diff --git a/src/CSPM/Evaluator/Environment.hs b/src/CSPM/Evaluator/Environment.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/Environment.hs
@@ -0,0 +1,13 @@
+module CSPM.Evaluator.Environment (
+    module Util.HierarchicalMap,
+    Environment,
+) where
+
+import qualified Data.Map as M
+import Prelude
+
+import CSPM.DataStructures.Names
+import {-# SOURCE #-} CSPM.Evaluator.Values
+import Util.HierarchicalMap
+
+type Environment = HierarchicalMap Name Value
diff --git a/src/CSPM/Evaluator/Exceptions.hs b/src/CSPM/Evaluator/Exceptions.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/Exceptions.hs
@@ -0,0 +1,32 @@
+module CSPM.Evaluator.Exceptions
+where
+
+import Data.Typeable
+import Prelude
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.PrettyPrinter
+import {-# SOURCE #-} CSPM.Evaluator.Values
+import Util.Annotated
+import Util.Exception
+import Util.PrettyPrint
+
+patternMatchFailureMessage :: SrcSpan -> AnPat -> Value -> ErrorMessage
+patternMatchFailureMessage l pat v =
+    mkErrorMessage l $ 
+        hang (hang (text "Pattern match failure: Value") tabWidth
+                (prettyPrint v))
+            tabWidth (text "does not match the pattern" <+> prettyPrint pat)
+
+funBindPatternMatchFailureMessage :: SrcSpan -> Name -> [[Value]] -> ErrorMessage
+funBindPatternMatchFailureMessage l n vss = mkErrorMessage l $
+    hang (text "Pattern match failure whilst attempting to evaluate:") tabWidth
+        (prettyPrint n <> 
+            hcat (map (\ vs -> parens (list (map prettyPrint vs))) vss))
+        
+typeCheckerFailureMessage :: String -> ErrorMessage
+typeCheckerFailureMessage s =
+    mkErrorMessage Unknown $
+        hang (text "The program caused a runtime error that should have been caught by the typechecker:")
+            tabWidth (text s)
diff --git a/src/CSPM/Evaluator/Expr.hs b/src/CSPM/Evaluator/Expr.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/Expr.hs
@@ -0,0 +1,342 @@
+{-# LANGUAGE TypeSynonymInstances, DoAndIfThenElse #-}
+module CSPM.Evaluator.Expr (
+    Evaluatable, eval,
+) where
+
+import Control.Monad.Trans
+import Data.Maybe
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.Evaluator.DeclBind
+import CSPM.Evaluator.Environment
+import CSPM.Evaluator.Exceptions
+import CSPM.Evaluator.Monad
+import CSPM.Evaluator.PatBind
+import CSPM.Evaluator.Values
+import qualified CSPM.Evaluator.ValueSet as S
+import Util.Annotated
+import Util.Exception
+import Util.PrettyPrint
+
+-- In order to keep lazy evaluation working properly only use pattern
+-- matching when you HAVE to know the value. (Hence why we delay pattern
+-- matching in BooleanBinaryOp And in case the first value is false.)
+
+class Evaluatable a where
+    eval :: a -> EvaluationMonad Value
+
+instance Evaluatable a => Evaluatable (Annotated b a) where
+    eval (An _ _ a) = eval a
+
+instance Evaluatable Exp where
+    eval (App func args) = do
+        vs <- mapM eval args
+        VFunction f <- eval func
+        f vs
+    eval (BooleanBinaryOp op e1 e2) = do
+        v1 <- eval e1
+        v2 <- eval e2
+        case op of
+            And -> 
+                let 
+                    VBool b1 = v1
+                    VBool b2 = v2
+                in return $ VBool (b1 && b2)
+            Or -> 
+                let 
+                    VBool b1 = v1
+                    VBool b2 = v2
+                in return $ VBool (b1 || b2)
+            Equals -> return $ VBool (v1 == v2)
+            NotEquals -> return $ VBool (v1 /= v2)
+            LessThan -> return $ VBool (v1 < v2)
+            GreaterThan -> return $ VBool (v1 > v2)
+            LessThanEq -> return $ VBool (v1 <= v2)
+            GreaterThanEq -> return $ VBool (v1 >= v2)
+    eval (BooleanUnaryOp op e) = do
+        VBool b <- eval e
+        case op of
+            Not -> return $ VBool (not b)
+    eval (Concat e1 e2) = do
+        VList vs1 <- eval e1
+        v2 <- eval e2
+        -- If we instead wrote VList v2 <- eval e2
+        -- then this would force evaluation of e2 to a list immediately.
+        -- However, if we do the following instead this means that
+        -- the second argument is only evaluated if it absolutely has to 
+        -- be (what if e2 was bottom and we were taking head(e1^e2)).
+        -- (To see why haskell does this consider the desugared form with
+        -- the do's removed. It would be:
+        -- ... eval e1) >>= (\ (VList vs2) -> ...)
+        -- and therefore the pattern match would force evaluation.)
+        let VList vs2 = v2
+        return $ VList (vs1++vs2)
+    eval (DotApp e1 e2) = do
+            v1 <- eval e1
+            v2 <- eval e2
+            return $ combineDots v1 v2
+        where
+            combineDots (VDot vs1) (VDot vs2) = VDot (vs1++vs2)
+            combineDots (VDot vs) y = VDot (vs++[y])
+            combineDots (VEvent n vs1) (VDot vs2) = VEvent n (vs1++vs2)
+            combineDots (VEvent n vs1) x = VEvent n (vs1++[x])
+            combineDots (VDataType n vs1) (VDot vs2) = VDataType n (vs1++vs2)
+            combineDots (VDataType n vs1) x = VDataType n (vs1++[x])
+            combineDots v1 v2 = VDot [v1, v2]
+    eval (If e1 e2 e3) = do
+        VBool b <- eval e1
+        if b then eval e2 else eval e3
+    eval (Lambda p e) =
+        return $ VFunction $ \ [v] -> do
+            (matches, binds) <- bind p v
+            if matches then
+                addScopeAndBind binds (eval e)
+            else
+                throwError $ patternMatchFailureMessage (loc p) p v
+    eval (Let decls e) = do
+        bs <- bindDecls decls
+        addScopeAndBind bs (eval e)
+    eval (Lit lit) = return $
+        case lit of
+            Int i -> VInt i
+            Bool b -> VBool b   
+    eval (List es) = mapM eval es >>= return . VList
+    eval (ListComp es stmts) = do
+            xs <- evalStmts (\(VList xs) -> xs) stmts (mapM eval es)
+            return $ VList xs
+        where
+    eval (ListEnumFrom e) = do
+        VInt lb <- eval e
+        return $ VList (map VInt [lb..])
+    eval (ListEnumFromTo e1 e2) = do
+        VInt lb <- eval e1
+        VInt ub <- eval e2
+        return $ VList (map VInt [lb..ub])
+    eval (ListLength e) = do
+        VList xs <- eval e 
+        return $ VInt (toInteger (length xs))
+    eval (MathsBinaryOp op e1 e2) = do
+        VInt i1 <- eval e1
+        VInt i2 <- eval e2
+        case op of
+            Divide -> return $ VInt (i1 `div` i2)
+            Minus -> return $ VInt (i1 - i2)
+            Mod -> return $ VInt (i1 `mod` i2)
+            Plus -> return $ VInt (i1 + i2)
+            Times -> return $ VInt (i1 * i2)
+    eval (MathsUnaryOp op e) = do
+        VInt i <- eval e
+        case op of 
+            Negate -> return $ VInt (-i)
+    eval (Paren e) = eval e
+    eval (Set es) = mapM eval es >>= return . VSet . S.fromList
+    eval (SetComp es stmts) = do
+        xs <- evalStmts (\(VSet s) -> S.toList s) stmts (mapM eval es)
+        return $ VSet (S.fromList xs)
+    eval (SetEnum es) = do
+        evs <- mapM eval es
+        ss <- mapM completeEvent evs
+        return $ VSet (S.unions ss)
+    eval (SetEnumComp es stmts) = do
+        ss <- evalStmts (\(VSet s) -> S.toList s) stmts 
+                        (mapM (\e -> eval e >>= completeEvent) es)
+        return $ VSet (S.unions ss)
+    eval (SetEnumFrom e) = do
+        VInt lb <- eval e
+        return $ VSet (S.IntSetFrom lb)
+    eval (SetEnumFromTo e1 e2) = do
+        VInt lb <- eval e1
+        VInt ub <- eval e2
+        return $ VSet (S.RangedSet lb ub)
+    eval (Tuple es) = mapM eval es >>= return . VTuple
+    eval (Var (UnQual n)) = do
+        v <- lookupVar n
+        case v of
+            VProc p -> return $ VProc $ PProcCall (procId n []) (Just p)
+            _       -> return v
+
+    -- This is the most complicated process because it is actually a shorthand
+    -- for external choice and internal choice.
+    eval (Prefix e1 fs e2) = do
+        VEvent n vs1 <- eval e1
+        let
+            normalizeEvent [] = []
+            normalizeEvent ((VDot vs1):vs2) = normalizeEvent (vs1++vs2)
+            normalizeEvent (v:vs) = v:normalizeEvent vs
+            
+            evalInputField :: [Value] -> [Field] -> AnPat -> S.ValueSet -> 
+                                EvaluationMonad [Proc]
+            evalInputField vs fs p s = do
+                mps <- mapM (\v -> do
+                    (matches, binds) <- bind p v
+                    if matches then do
+                        p <- addScopeAndBind binds 
+                            (evalFields (vs++normalizeEvent [v]) fs)
+                        return $ Just p
+                    else return Nothing) (S.toList s)
+                return $ catMaybes mps
+            
+            evalFields :: [Value] -> [Field] -> EvaluationMonad Proc
+            evalFields vs [] = do
+                p <- evalProc e2
+                return $ PPrefix (valueEventToEvent (VEvent n vs)) p
+            evalFields vs (Output e:fs) = do
+                v <- eval e
+                evalFields (vs++normalizeEvent [v]) fs
+            
+            evalFields vs (Input p (Just e):fs) = do
+                VSet s <- eval e
+                ps <- evalInputField vs fs p s
+                return $ PExternalChoice ps
+            evalFields vs (Input p Nothing:fs) = do
+                -- Calculate which component this is
+                let component = length vs
+                chanVs <- valuesForChannel n
+                let s = chanVs!!component
+                ps <- evalInputField vs fs p s
+                return $ PExternalChoice ps
+            
+            evalFields vs (NonDetInput p (Just e):fs) = do
+                VSet s <- eval e
+                ps <- evalInputField vs fs p s
+                return $ PInternalChoice ps
+            evalFields vs (NonDetInput p Nothing:fs) = do
+                -- Calculate which component this is
+                let component = length vs
+                chanVs <- valuesForChannel n
+                let s = chanVs!!component
+                ps <- evalInputField vs fs p s
+                return $ PInternalChoice ps
+                
+            -- Takes a proc and combines nested [] and |~|
+            simplify :: Proc -> Proc
+-- TODO: error over PInternalChoice []
+            simplify (PExternalChoice [p]) = simplify p
+            simplify (PInternalChoice [p]) = simplify p
+            
+            simplify (PExternalChoice ((PExternalChoice ps1):ps2)) =
+                simplify (PExternalChoice (ps1++ps2))
+            simplify (PExternalChoice ps) =
+                PExternalChoice (map simplify ps)
+
+            simplify (PInternalChoice ((PInternalChoice ps1):ps2)) =
+                simplify (PInternalChoice (ps1++ps2))
+            simplify (PInternalChoice ps) =
+                PInternalChoice (map simplify ps)
+
+            simplify p = p
+            
+        p <- evalFields vs1 (map unAnnotate fs)
+        return $ VProc $ simplify p
+
+    eval (AlphaParallel e1 e2 e3 e4) = do
+        p1 <- evalProc e1
+        p2 <- evalProc e4
+        VSet a1 <- eval e2
+        VSet a2 <- eval e3
+        return $ VProc $ PAlphaParallel [(S.valueSetToEventSet a1, p1),
+                                        (S.valueSetToEventSet a2, p2)]
+    eval (Exception e1 e2 e3) = do
+        p1 <- evalProc e1
+        VSet a <- eval e2
+        p2 <- evalProc e3
+        return $ VProc $ PException p1 (S.valueSetToEventSet a) p2
+    eval (ExternalChoice e1 e2) = do
+        p1 <- evalProc e1
+        p2 <- evalProc e2
+        return $ VProc $ PExternalChoice [p1, p2]
+    eval (GenParallel e1 e2 e3) = do
+        ps <- evalProcs [e1, e3]
+        VSet a <- eval e2
+        return $ VProc $ PGenParallel (S.valueSetToEventSet a) ps
+    eval (GuardedExp guard proc) = do
+        VBool b <- eval guard
+        if b then eval proc else lookupVar (Name "STOP")
+    eval (Hiding e1 e2) = do
+        p <- evalProc e1
+        VSet s <- eval e2
+        return $ VProc $ PHide p (S.valueSetToEventSet s)
+    eval (InternalChoice e1 e2) = do
+        ps <- evalProcs [e1, e2]
+        return $ VProc $ PInternalChoice ps
+    eval (Interrupt e1 e2) = do
+        p1 <- evalProc e1
+        p2 <- evalProc e2
+        return $ VProc $ PInterrupt p1 p2
+    eval (Interleave e1 e2) = do
+        ps <- evalProcs [e1, e2]
+        return $ VProc $ PInterleave ps
+-- TODO
+--  eval (LinkParallel e1 ties stmts e2)
+--  eval (Rename e1 ties stmts) = 
+    eval (SequentialComp e1 e2) = do
+        p1 <- evalProc e1
+        p2 <- evalProc e2
+        return $ VProc $ PSequentialComp p1 p2
+    eval (SlidingChoice e1 e2) = do
+        p1 <- evalProc e1
+        p2 <- evalProc e2
+        return $ VProc $ PSlidingChoice p1 p2
+    
+    eval (ReplicatedAlphaParallel stmts e1 e2) = do
+        aps <- evalStmts (\(VSet s) -> S.toList s) stmts (do
+            VSet s <- eval e1
+            p <- evalProc e2
+            return [(S.valueSetToEventSet s, p)])
+        return $ VProc $ PAlphaParallel aps
+    eval (ReplicatedExternalChoice stmts e) = do
+        ps <- evalStmts (\(VSet s) -> S.toList s) stmts (evalProcs [e])
+        return $ VProc $ PExternalChoice ps
+    eval (ReplicatedInterleave stmts e) = do
+        ps <- evalStmts (\(VSet s) -> S.toList s) stmts (evalProcs [e])
+        return $ VProc $ PInterleave ps
+    eval (ReplicatedInternalChoice stmts e) = do
+        ps <- evalStmts (\(VSet s) -> S.toList s) stmts (evalProcs [e])
+        return $ VProc $ PInternalChoice ps
+-- TODO
+--  eval (ReplicatedLinkParallel e1 ties stmts e2) =
+    eval (ReplicatedParallel e1 stmts e2) = do
+        VSet s <- eval e1
+        ps <- evalStmts (\(VSet s) -> S.toList s) stmts (evalProcs [e2])
+        return $ VProc $ PGenParallel (S.valueSetToEventSet s) ps
+    
+    eval e = panic ("No clause to eval "++show e)
+
+evalProcs = mapM evalProc
+
+evalProc :: Evaluatable a => a -> EvaluationMonad Proc
+evalProc a = eval a >>= \v -> case v of
+    VProc x -> return x
+    _       -> panic "Type checker error"
+
+-- | Evaluates the statements, evaluating `prog` for each possible 
+-- assingment to the generators that satisfies the qualifiers.
+evalStmts :: (Value -> [Value]) -> [AnStmt] -> EvaluationMonad [a] -> 
+            EvaluationMonad [a]
+evalStmts extract anStmts prog =
+    let
+        -- | Progressively generates new values lazily
+        evStmts [] = prog
+        evStmts (Qualifier e:stmts) = do
+            VBool b <- eval e
+            if b then evStmts stmts else return []
+        evStmts (Generator p e:stmts) = do
+            v <- eval e
+            let vs = extract v
+            vss <- mapM (\v -> do
+                (matches, binds) <- bind p v
+                if matches then 
+                    addScopeAndBind binds (evStmts stmts)
+                else return []) vs
+            return $ concat vss
+    in
+        evStmts (map unAnnotate anStmts)
+
+-- | Takes a VEvent and then computes all events that this is a prefix of.
+completeEvent :: Value -> EvaluationMonad S.ValueSet
+completeEvent (VEvent n vs) = do
+    chanVs <- valuesForChannel n
+    let remainingComponents = drop (length vs) chanVs
+    if length remainingComponents == 0 then return $ S.fromList [VEvent n vs]
+    else return $ S.cartesianProduct (\vs' -> VEvent n (vs++vs')) remainingComponents
diff --git a/src/CSPM/Evaluator/Expr.hs-boot b/src/CSPM/Evaluator/Expr.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/Expr.hs-boot
@@ -0,0 +1,14 @@
+module CSPM.Evaluator.Expr where
+
+import CSPM.DataStructures.Syntax
+import CSPM.Evaluator.Monad
+import CSPM.Evaluator.Values
+import CSPM.Evaluator.ValueSet
+import Util.Annotated
+
+class Evaluatable a where
+    eval :: a -> EvaluationMonad Value
+    
+instance Evaluatable a => Evaluatable (Annotated b a)
+instance Evaluatable Exp
+
diff --git a/src/CSPM/Evaluator/Module.hs b/src/CSPM/Evaluator/Module.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/Module.hs
@@ -0,0 +1,21 @@
+{-# LANGUAGE TypeSynonymInstances #-}
+module CSPM.Evaluator.Module (
+    bindModules, bindModule,
+) 
+where
+
+import Control.Monad
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.Evaluator.DeclBind
+import CSPM.Evaluator.Monad
+import CSPM.Evaluator.Values
+import Util.Annotated
+
+bindModules :: [TCModule] -> EvaluationMonad [(Name, Value)]
+bindModules ms = liftM concat (mapM bindModule ms)
+
+bindModule :: TCModule -> EvaluationMonad [(Name, Value)]
+bindModule an = case unAnnotate an of
+    GlobalModule ds -> bindDecls ds
diff --git a/src/CSPM/Evaluator/Monad.hs b/src/CSPM/Evaluator/Monad.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/Monad.hs
@@ -0,0 +1,75 @@
+module CSPM.Evaluator.Monad where
+
+--import Control.Monad.State
+import Prelude hiding (lookup)
+
+import CSPM.DataStructures.Names
+import CSPM.Evaluator.Exceptions
+import CSPM.Evaluator.Environment
+import {-# SOURCE #-} CSPM.Evaluator.Values
+import Util.Exception
+
+data EvaluationState = 
+    EvaluationState {
+        environment :: Environment
+    }
+    
+type EvaluationMonad = LazyEvalMonad EvaluationState
+
+newtype LazyEvalMonad s a = LazyEvalMonad { 
+    -- Notice that this doesn't yield a new environment
+    unLazyEvalMonad :: s -> a
+}
+        
+runLazyEvalMonad :: s -> LazyEvalMonad s a -> a
+runLazyEvalMonad st (LazyEvalMonad prog) = prog st
+
+gets :: (s -> a) -> LazyEvalMonad s a
+gets f = LazyEvalMonad (\st -> f st)
+
+modify :: (s -> s) -> LazyEvalMonad s a -> LazyEvalMonad s a
+modify f prog = LazyEvalMonad (\st -> unLazyEvalMonad prog (f st))
+
+instance Monad (LazyEvalMonad a) where
+    (LazyEvalMonad p1) >>= f = 
+        LazyEvalMonad (\ st -> 
+            let
+                a = p1 st
+                LazyEvalMonad p2 = f a
+            in p2 st)
+    return k = LazyEvalMonad (\ st -> k)
+
+runEvaluator :: EvaluationState -> EvaluationMonad a -> a
+runEvaluator st prog = runLazyEvalMonad st prog
+
+getState :: EvaluationMonad EvaluationState
+getState = gets id
+
+getEnvironment :: EvaluationMonad Environment
+getEnvironment = gets environment
+
+--setEnvironment :: Environment -> EvaluationMonad ()
+--setEnvironment env =
+--  modify (\ st -> st { environment = env })
+
+lookupVar :: Name -> EvaluationMonad Value
+lookupVar n = do
+    -- This should never produce an error as the TC would
+    -- catch it
+    env <- getEnvironment
+    return $ lookup env n
+    
+addScopeAndBind :: [(Name, Value)] -> EvaluationMonad a -> EvaluationMonad a
+addScopeAndBind bs = addScopeAndBindM $ return bs
+
+addScopeAndBindM :: EvaluationMonad [(Name, Value)] -> EvaluationMonad a -> EvaluationMonad a
+addScopeAndBindM binds = 
+    modify (\st -> let
+            bs = runEvaluator st' binds
+            env' = newLayerAndBind (environment st) bs
+            st' = st { environment = env' }
+        in
+            st')
+
+throwError :: ErrorMessage -> a
+throwError err = throwSourceError [err]
diff --git a/src/CSPM/Evaluator/PatBind.hs b/src/CSPM/Evaluator/PatBind.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/PatBind.hs
@@ -0,0 +1,78 @@
+{-# LANGUAGE TypeSynonymInstances #-}
+module CSPM.Evaluator.PatBind where
+
+import Control.Monad
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.Evaluator.Monad
+import CSPM.Evaluator.Values
+import CSPM.Evaluator.ValueSet
+import Util.Annotated
+import Util.Exception
+
+-- Bind :: Pattern, value -> (Matches Pattern, Values to Bind
+class Bindable a where
+    bind :: a -> Value -> EvaluationMonad (Bool, [(Name, Value)])
+
+instance Bindable a => Bindable (Annotated b a) where
+    bind (An _ _ a) v = bind a v
+
+instance Bindable Pat where
+    -- We can decompose any PConcat pattern into three patterns representing:
+    -- Begining (of the form PList), middle (either PWildcard or PVar)
+    -- and end (of the form PList), With both begining and end possible empty
+    bind (PCompList ps Nothing _) (VList xs) | length ps == length xs = 
+        bindAll ps xs
+    -- By desugaring the middle is not a PConcat or a PList
+    bind (PCompList starts (Just (middle, ends)) _) (VList xs) =
+        -- Only match if the list contains sufficient items
+        if not (atLeastLength (length starts + length ends) xs) then 
+            return (False, [])
+        else do
+            (b1, nvs1) <- bindAll starts xsStart
+            (b2, nvs2) <- bindAll ends xsEnd
+            (b3, nvs3) <- bind middle (VList xsMiddle)
+            return (b1 && b2 && b3, nvs1++nvs2++nvs3)
+        where
+            atLeastLength 0 _ = True
+            atLeastLength _ [] = False
+            atLeastLength n (x:xs) = atLeastLength (n-1) xs
+            (xsStart, rest) = splitAt (length starts) xs
+            (xsMiddle, xsEnd) = 
+                if length ends == 0 then (rest, [])
+                else splitAt (length rest - length ends) rest
+    bind (PCompDot ps _) (VDot vs) = do
+        (b1, nvs1) <- bindAll psInit vsInit
+        (b2, nvs2) <- bind pLast (VDot vsLast)
+        return (b1 && b2, nvs1++nvs2)
+        where
+            (psInit, pLast) = initLast ps
+            (vsInit, vsLast) = splitAt (length psInit) vs
+            initLast :: [a] -> ([a], a)
+            initLast [a] = ([],a)
+            initLast (a:as) = let (bs,b) = initLast as in (a:bs,b)
+    bind (PDoublePattern p1 p2) v = do
+        (m1, b1) <- bind p1 v
+        (m2, b2) <- bind p2 v
+        return $ (m1 && m2, b1++b2)
+    bind (PLit (Int i1)) (VInt i2) | i1 == i2 = return (True, [])
+    bind (PLit (Bool b1)) (VBool b2) | b1 == b2 = return (True, [])
+    bind (PSet [p]) (VSet s) = 
+        case singletonValue s of
+            Just v  -> bind p v
+            Nothing -> return (False, [])
+    bind (PTuple ps) (VTuple vs) = do
+        -- NB: len ps == len vs by typechecker
+        bindAll ps vs
+    -- Although n may refer to a datatype or a channel this doesn't
+    -- matter, we rebind for ease
+    bind (PVar n) v = return (True, [(n, v)])
+    bind PWildCard v = return (True, [])
+    bind _ _ = return (False, [])
+
+bindAll :: Bindable a => [a] -> [Value]
+            -> EvaluationMonad (Bool, [(Name, Value)])
+bindAll ps xs = do
+    rs <- zipWithM bind ps xs
+    return (and (map fst rs), concat (map snd rs))
diff --git a/src/CSPM/Evaluator/ValueSet.hs b/src/CSPM/Evaluator/ValueSet.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/ValueSet.hs
@@ -0,0 +1,171 @@
+module CSPM.Evaluator.ValueSet where
+
+import Control.Monad
+import qualified Data.Set as S
+
+import CSPM.Evaluator.Values
+import qualified CSPM.Compiler.Events as CE
+import qualified CSPM.Compiler.Set as CS
+import Util.Exception
+import Util.PrettyPrint hiding (empty)
+
+data ValueSet = 
+    Integers -- Set of all integers
+    | Processes -- Set of all processes
+    | ExplicitSet (S.Set Value)
+    | IntSetFrom Integer -- {lb..}
+    | RangedSet Integer Integer -- {lb..ub}
+    | LazySet [Value]
+
+instance Eq ValueSet where
+    Integers == Integers = True
+    Processes == Processes = True
+    IntSetFrom lb1 == IntSetFrom lb2 = lb1 == lb2
+    RangedSet lb1 ub1 == RangedSet lb2 ub2 = lb1 == lb2 && ub1 == ub2
+    ExplicitSet s1 == ExplicitSet s2 = s1 == s2
+
+    ExplicitSet s == RangedSet lb ub = s == S.fromList (map VInt [lb..ub])
+    RangedSet lb ub == ExplicitSet s = s == S.fromList (map VInt [lb..ub])
+    -- TODO: complete
+    
+    _ == _ = panic "Cannot compare sets"
+    
+instance Ord ValueSet where
+    compare (ExplicitSet s1) (ExplicitSet s2) = compare s1 s2
+    -- TODO: complete
+
+instance PrettyPrintable ValueSet where
+    prettyPrint Integers = text "Integers"
+    prettyPrint Processes = text "Proc"
+    prettyPrint (IntSetFrom lb) = braces (integer lb <> text "...")
+    prettyPrint (RangedSet lb ub) = 
+        braces (integer lb <> text "..." <> integer ub)
+    prettyPrint (ExplicitSet s) =
+        braces (list (map prettyPrint $ S.toList s))
+    prettyPrint (LazySet vs) =
+        braces (list (map prettyPrint vs))
+    -- TODO: complete
+    
+instance Show ValueSet where
+    show = show . prettyPrint
+
+-- | Produces a ValueSet of the carteisan product of several ValueSets, 
+-- using 'vc' to convert each sequence of values into a single value.
+cartesianProduct :: ([Value] -> Value) -> [ValueSet] -> ValueSet
+cartesianProduct vc = fromList . map vc . sequence . map toList
+
+-- | Returns the powerset of a ValueSet. This requires
+powerset :: ValueSet -> ValueSet
+powerset = fromList . map (VSet . fromList) . 
+            filterM (\x -> [True, False]) . toList
+
+-- | Returns the set of all sequences over the input set
+allSequences :: ValueSet -> ValueSet
+allSequences s = if empty s then emptySet else 
+    let 
+        itemsAsList :: [Value]
+        itemsAsList = toList s
+        list :: Integer -> [Value]
+        list 0 = [VList []]
+        list n = concatMap (\x -> map (app x) (list (n-1)))  itemsAsList
+            where
+                app :: Value -> Value -> Value
+                app x (VList xs) = VList $ x:xs
+    in LazySet (list 0)
+
+-- | The empty set
+emptySet :: ValueSet
+emptySet = ExplicitSet S.empty
+
+-- | Converts a list to a set
+fromList :: [Value] -> ValueSet
+fromList = ExplicitSet . S.fromList
+
+-- | Converts a set to list.
+toList :: ValueSet -> [Value]
+toList (ExplicitSet s) = S.toList s
+toList (RangedSet lb ub) = map VInt [lb..ub]
+toList (IntSetFrom lb) = map VInt [lb..]
+toList (LazySet xs) = xs
+-- TODO: rest
+
+-- | Returns the value iff the set contains one item only
+singletonValue :: ValueSet -> Maybe Value
+singletonValue s = if card s == 1 then Just (head (toList s)) else Nothing
+
+member :: Value -> ValueSet -> Bool
+member v (ExplicitSet s) = S.member v s
+member (VInt i) Integers = True
+member (VInt i) (IntSetFrom lb) = i >= lb
+member (VInt i) (RangedSet lb ub) = i >= lb && i <= ub
+member v (LazySet xs) = v `elem` xs
+
+card :: ValueSet -> Integer
+card (ExplicitSet s) = toInteger (S.size s)
+card (RangedSet lb ub) = ub-lb+1
+
+empty :: ValueSet -> Bool
+empty Processes = panic "empty(Processes) Not implemented"
+empty (ExplicitSet s) = S.null s
+empty (IntSetFrom lb) = False
+empty (Integers) = False
+empty (RangedSet lb ub) = False
+empty (LazySet xs) =
+    case xs of
+        x:_ -> False
+        _   -> True
+
+mapMonotonic :: (Value -> Value) -> ValueSet -> ValueSet
+mapMonotonic f (ExplicitSet s) = ExplicitSet $ S.mapMonotonic f s
+
+unions :: [ValueSet] -> ValueSet
+unions vs = foldr union (ExplicitSet S.empty) vs
+
+intersections :: [ValueSet] -> ValueSet
+intersections vs = panic "Unions not implemented"
+
+union :: ValueSet -> ValueSet -> ValueSet
+union (ExplicitSet s1) (ExplicitSet s2) =
+     ExplicitSet (S.union s1 s2)
+union (IntSetFrom lb1) (IntSetFrom lb2) = 
+     IntSetFrom (min lb1 lb2)
+union (IntSetFrom lb) Integers =Integers
+union Integers (IntSetFrom lb) =Integers
+union (IntSetFrom lb1) (RangedSet lb2 ub2) | lb1 <= ub2 =
+     IntSetFrom (min lb1 lb2)
+union (RangedSet lb2 ub2) (IntSetFrom lb1) | lb1 <= ub2 =
+     IntSetFrom (min lb1 lb2)
+union x y | x == y =  x
+
+intersection :: ValueSet -> ValueSet -> ValueSet
+intersection (ExplicitSet s1) (ExplicitSet s2) =
+     ExplicitSet (S.intersection s1 s2)
+intersection (IntSetFrom lb1) (IntSetFrom lb2) = 
+     IntSetFrom (min lb1 lb2)
+intersection (IntSetFrom lb) Integers =IntSetFrom lb
+intersection Integers (IntSetFrom lb) =IntSetFrom lb
+intersection (IntSetFrom lb1) (RangedSet lb2 ub2) =
+    if lb1 <= ub2 then RangedSet (max lb2 lb1) ub2
+    else ExplicitSet S.empty
+intersection (RangedSet lb2 ub2) (IntSetFrom lb1) | lb1 <= ub2 =
+    intersection (IntSetFrom lb1) (RangedSet lb2 ub2)
+inter x y | x == y =  x
+
+difference :: ValueSet -> ValueSet -> ValueSet
+difference (ExplicitSet s1) (ExplicitSet s2) =
+     ExplicitSet (S.difference s1 s2)
+difference (IntSetFrom lb1) (IntSetFrom lb2) = 
+    if lb1 < lb2 then RangedSet lb1 (lb2-1)
+    else ExplicitSet S.empty
+difference (IntSetFrom lb) Integers = ExplicitSet S.empty
+--difference Integers (IntSetFrom lb) = 
+--   InfSetTo (lb-1)
+--difference (IntSetFrom lb1) (RangedSet lb2 ub2) =
+--  if lb1 <= ub2 thenRangedSet (max lb2 lb1) ub2
+--  elseExplicitSet empty
+--difference (RangedSet lb2 ub2) (IntSetFrom lb1) | lb1 <= ub2 =
+difference x y | x == y = ExplicitSet S.empty 
+
+
+valueSetToEventSet :: ValueSet -> CE.EventSet
+valueSetToEventSet = CS.fromList . map valueEventToEvent . toList
diff --git a/src/CSPM/Evaluator/ValueSet.hs-boot b/src/CSPM/Evaluator/ValueSet.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/ValueSet.hs-boot
@@ -0,0 +1,9 @@
+module CSPM.Evaluator.ValueSet where
+
+import Util.PrettyPrint
+
+data ValueSet
+
+instance Eq ValueSet
+instance Ord ValueSet
+instance PrettyPrintable ValueSet
diff --git a/src/CSPM/Evaluator/Values.hs b/src/CSPM/Evaluator/Values.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/Values.hs
@@ -0,0 +1,81 @@
+module CSPM.Evaluator.Values (
+    Value(..), Proc(..), Event(..),
+    procId,
+    valueEventToEvent,
+) where
+
+import CSPM.Compiler.Events
+import CSPM.Compiler.Processes
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.Evaluator.Exceptions
+import CSPM.Evaluator.Monad
+import {-# SOURCE #-} CSPM.Evaluator.ValueSet
+import CSPM.PrettyPrinter
+import Util.Prelude
+import Util.PrettyPrint
+
+data Value =
+    VInt Integer
+    | VBool Bool
+    | VTuple [Value]
+    -- TODO: the following one may be completely incorrect, needs 
+    -- testing
+    | VDot [Value]
+    | VEvent Name [Value]
+    | VDataType Name [Value]
+    | VList [Value]
+    | VSet ValueSet
+    | VFunction ([Value] -> EvaluationMonad Value)
+    | VProc Proc
+
+instance Eq Value where
+    VInt i1 == VInt i2 = i1 == i2
+    VBool b1 == VBool b2 = b1 == b2
+    VTuple vs1 == VTuple vs2 = vs1 == vs2
+    VDot vs1 == VDot vs2 = vs1 == vs2
+    VEvent n1 vs1 == VEvent n2 vs2 = n1 == n2 && vs1 == vs2
+    VDataType n1 vs1 == VDataType n2 vs2 = n1 == n2 && vs1 == vs2
+    VList vs1 == VList vs2 = vs1 == vs2
+    VSet s1 == VSet s2 = s1 == s2
+    
+    v1 == v2 = throwError $ typeCheckerFailureMessage "Cannot compare for eq"
+    
+instance Ord Value where
+    compare (VInt i1) (VInt i2) = compare i1 i2
+    compare (VTuple vs1) (VTuple vs2) = compare vs1 vs2
+    compare (VList vs1) (VList vs2) = compare vs1 vs2
+    compare (VSet s1) (VSet s2) = compare s1 s2
+    
+    -- These are only ever used for the internal set implementation
+    compare (VDot vs1) (VDot vs2) = compare vs1 vs2
+    compare (VEvent n vs1) (VEvent n' vs2) =
+        compare n n' `thenCmp` compare vs1 vs2
+    compare (VDataType n vs1) (VDataType n' vs2) = 
+        compare n n' `thenCmp` compare vs1 vs2
+    
+    compare v1 v2 = throwError $ typeCheckerFailureMessage "Cannot order"
+
+instance PrettyPrintable Value where
+    prettyPrint (VInt i) = integer i
+    prettyPrint (VBool True) = text "true"
+    prettyPrint (VBool False) = text "false"
+    prettyPrint (VTuple vs) = parens (list $ map prettyPrint vs)
+    prettyPrint (VDot vs) = dotSep (map prettyPrint vs)
+    prettyPrint (VEvent n vs) = dotSep (prettyPrint n:map prettyPrint vs)
+    prettyPrint (VDataType n vs) = dotSep (prettyPrint n:map prettyPrint vs)
+    prettyPrint (VList vs) = angles (list $ map prettyPrint vs)
+    prettyPrint (VSet s) = prettyPrint s
+    prettyPrint (VFunction _) = text "<function>"
+    prettyPrint (VProc p) = prettyPrint p
+
+instance Show Value where
+    show v = show (prettyPrint v)
+
+-- TODO take acount of let within statements
+procId :: Name -> [[Value]] -> String
+procId n vss = show $
+    prettyPrint n <> hcat (map (parens . list) (map (map prettyPrint) vss))
+
+valueEventToEvent :: Value -> Event
+valueEventToEvent (ev@(VEvent _ _)) = UserEvent (show (prettyPrint ev))
diff --git a/src/CSPM/Evaluator/Values.hs-boot b/src/CSPM/Evaluator/Values.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Evaluator/Values.hs-boot
@@ -0,0 +1,9 @@
+module CSPM.Evaluator.Values where
+
+import Util.PrettyPrint
+
+data Value
+instance Eq Value
+instance Ord Value
+instance PrettyPrintable Value
+instance Show Value
diff --git a/src/CSPM/Parser.hs b/src/CSPM/Parser.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Parser.hs
@@ -0,0 +1,30 @@
+module CSPM.Parser (
+    parseFile, parseInteractiveStmt, parseExpression, parseStringAsFile,
+    
+    ParseMonad, runParser,
+) 
+where
+
+import CSPM.DataStructures.Syntax
+import CSPM.Parser.Monad
+import CSPM.Parser.Parser
+import Util.Annotated
+
+-- External Interface
+parseInteractiveStmt :: String -> ParseMonad PInteractiveStmt
+parseInteractiveStmt str =
+    pushFileContents "<interactive>" str >> parseInteractiveStmt_
+
+parseExpression :: String -> ParseMonad PExp
+parseExpression str = 
+    pushFileContents "<interactive>" str >> parseExpression_
+
+parseFile :: String -> ParseMonad [PModule]
+parseFile fname = do
+    decls <- pushFile fname parseFile_
+    return [An Unknown dummyAnnotation (GlobalModule decls)]
+
+parseStringAsFile :: String -> ParseMonad [PModule]
+parseStringAsFile str = do
+    decls <- pushFileContents "<interactive>" str >> parseFile_
+    return [An Unknown dummyAnnotation (GlobalModule decls)]
diff --git a/src/CSPM/Parser/Exceptions.hs b/src/CSPM/Parser/Exceptions.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Parser/Exceptions.hs
@@ -0,0 +1,46 @@
+module CSPM.Parser.Exceptions (
+    invalidPatternErrorMessage,
+    invalidDeclarationErrorMessage,
+    invalidExpressionErrorMessage,
+    invalidIncludeErrorMessage,
+    lexicalErrorMessage,
+    parseErrorMessage,
+    fileAccessErrorMessage,
+    
+    throwSourceError
+)
+where
+
+import CSPM.DataStructures.Syntax
+import CSPM.DataStructures.Tokens
+import CSPM.PrettyPrinter
+import Util.Annotated
+import Util.Exception
+import Util.PrettyPrint
+
+invalidPatternErrorMessage :: PExp -> ErrorMessage
+invalidPatternErrorMessage e = mkErrorMessage (loc e) $
+    hang (prettyPrint e) tabWidth (text "is not a valid pattern")
+    
+invalidDeclarationErrorMessage :: PDecl -> ErrorMessage
+invalidDeclarationErrorMessage d = mkErrorMessage (loc d) $
+    hang (prettyPrint d) tabWidth (text "is not a valid declaration")
+
+invalidExpressionErrorMessage :: PExp -> ErrorMessage
+invalidExpressionErrorMessage e = mkErrorMessage (loc e) $
+    hang (prettyPrint e) tabWidth (text "is not a valid expression")
+
+invalidIncludeErrorMessage :: SrcSpan -> ErrorMessage
+invalidIncludeErrorMessage srcspan = 
+    mkErrorMessage srcspan (text "Invalid include directive")
+
+lexicalErrorMessage :: SrcSpan -> ErrorMessage
+lexicalErrorMessage srcspan = mkErrorMessage srcspan (text "Lexical error")
+
+parseErrorMessage :: LToken -> ErrorMessage
+parseErrorMessage tok = mkErrorMessage (locatedLoc tok) $
+    text "Unexpected token" <+> prettyPrint tok
+
+fileAccessErrorMessage :: FilePath -> ErrorMessage
+fileAccessErrorMessage fp = mkErrorMessage Unknown $
+    text "Could not open the file" <+> quotes (text fp)
diff --git a/src/CSPM/Parser/Lexer.x b/src/CSPM/Parser/Lexer.x
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Parser/Lexer.x
@@ -0,0 +1,329 @@
+{
+{-# LANGUAGE DoAndIfThenElse #-}
+{-# OPTIONS_GHC -fno-warn-lazy-unlifted-bindings #-}
+module CSPM.Parser.Lexer where
+
+import Data.List
+
+import Control.Monad.Trans
+import CSPM.DataStructures.Tokens
+import CSPM.Parser.Exceptions
+import CSPM.Parser.Monad
+import Util.Annotated
+import Util.Exception
+
+}
+
+$digit      = [0-9]
+$whitechar   = [\ \n\r\f\v\t]
+$white_no_nl = $whitechar # \n
+$not_white = [^$whitechar]
+$alpha = [A-Za-z]
+$upperalpha = [A-Z]
+$alphaspace = [ $alpha]
+$alphanum = [A-Za-z0-9_]
+$propertychars = [A-Za-z0-9\ _\-]
+$prime = '
+$notid = [[^0-9a-zA-Z_]\(\[$whitechar]
+
+@property = $propertychars+(\[$upperalpha+\])?
+
+@white_no_nl = ((\-\-.*)|$white_no_nl)+
+@nl = ((\-\-.*\n)|$whitechar)*
+@comment = (\-\-.*) 
+@nltok = (@comment|())\n@nl
+
+-- *************************************************************************
+-- TODO: get correct lambda function syntax
+
+-- Note that we allow newlines to preceed all tokens, except for those that
+-- may possibly be at the start of a new expression. Therefore, for example,
+-- as a + may never be at the start of an expression we allow newlines before
+-- them. However, - and < may either appear in the middle of an expression or
+-- the start of one and thus we do not allow newlines to come between them.
+tokens :-
+    <0>@nl:\[                   { begin sem_prop }
+    <sem_prop>"tau priority"    { tok TTauPriority }
+    <sem_prop>"tau priority over" { tok TTauPriority }
+    <sem_prop>"deadlock free"   { tok TDeadlockFree }
+    <sem_prop>"deadlock-free"   { tok TDeadlockFree }
+    <sem_prop>"livelock free"   { tok TLivelockFree }
+    <sem_prop>"livelock-free"   { tok TLivelockFree }
+    <sem_prop>"divergence free" { tok TDivergenceFree }
+    <sem_prop>"divergence-free" { tok TDivergenceFree }
+    <sem_prop>"deterministic"   { tok TDeterministic }
+    <sem_prop>@nl"[T]"          { tok (TModel Traces) }
+    <sem_prop>@nl"[F]"          { tok (TModel Failures) }
+    <sem_prop>@nl"[FD]"         { tok (TModel FailuresDivergences) }
+    <sem_prop>@nl"[V]"          { tok (TModel Revivals) }
+    <sem_prop>@nl"[VD]"         { tok (TModel RevivalsDivergences) }
+    <sem_prop>@nl"[R]"          { tok (TModel Refusals) }
+    <sem_prop>@nl"[RD]"         { tok (TModel RefusalsDivergences) }
+    <sem_prop>"]:"              { begin 0 }
+    <sem_prop>"]"               { begin 0 }
+
+    <0>@nl"[T="@nl              { tok (TRefines Traces) }
+    <0>@nl"[F="@nl              { tok (TRefines Failures) }
+    <0>@nl"[FD="@nl             { tok (TRefines FailuresDivergences) }
+    <0>@nl"[V="@nl              { tok (TRefines Revivals) }
+    <0>@nl"[VD="@nl             { tok (TRefines RevivalsDivergences) }
+    <0>@nl"[R="@nl              { tok (TRefines Refusals) }
+    <0>@nl"[RD="@nl             { tok (TRefines RefusalsDivergences) }
+
+    <soak>((\-\-.*\n)|$whitechar)+  { skip }
+    <soak>""/$not_white         { begin 0 }
+
+    <0>@white_no_nl             { skip }
+
+    <0>@nl"{-"                  { nestedComment }
+
+    <0>@nl"false"/$notid        { tok TFalse }
+    <0>@nl"true"/$notid         { tok TTrue }
+
+    <0>"include"$white_no_nl+.*\n { switchInput }
+
+    -- Process Syntax
+    <0>@nl"[]"@nl               { tok TExtChoice }
+    <0>@nl"|~|"@nl              { tok TIntChoice }
+    <0>@nl"|||"@nl              { tok TInterleave }
+    <0>@nl"/\"@nl               { tok TInterrupt }
+    <0>@nl"->"@nl               { tok TPrefix }
+    <0>@nl"[>"@nl               { tok TSlidingChoice }
+    <0>@nl"|>"@nl               { tok TRException }
+    <0>@nl"||"@nl               { tok TParallel }
+    <0>@nl";"@nl                { tok TSemiColon }
+    <0>@nl"&"@nl                { tok TGuard }
+
+    -- Boolean Operators
+    <0>@nl"and"/$notid          { soakTok TAnd }
+    <0>@nl"or"/$notid           { soakTok TOr }
+    <0>@nl"not"/$notid          { soakTok TNot }
+    <0>@nl"=="@nl               { tok TEq }
+    <0>@nl"!="@nl               { tok TNotEq }
+    <0>@nl"<="@nl               { tok TLtEq }
+    <0>@nl">="@nl               { tok TGtEq }
+    -- We need a empty sequence token since the parser will not execute the
+    <0>"<"$whitechar*">"        { tok TEmptySeq }
+    <0>"<"@nl                   { tok TLt }
+    <0>@nl">"                   { gt }
+
+    -- Parenthesis
+    <0>"("@nl                   { openseq TLParen }
+    <0>@nl")"                   { closeseq TRParen }
+    <0>"{|"@nl                  { openseq TLPipeBrace }
+    <0>@nl"|}"                  { closeseq TRPipeBrace }
+    <0>"{"@nl                   { openseq TLBrace }
+    <0>@nl"}"                   { closeseq TRBrace }
+    <0>@nl"[["@nl               { openseq TLDoubleSqBracket }
+    <0>@nl"]]"                  { closeseq TRDoubleSqBracket }
+    <0>@nl"[|"@nl               { openseq TLPipeSqBracket }
+    <0>@nl"|]"@nl               { closeseq TRPipeSqBracket }
+    <0>@nl"["@nl                { tok TLSqBracket }
+    <0>@nl"]"@nl                { tok TRSqBracket }
+
+    -- General Symbols
+    <0>@nl"|"@nl                { tok TPipe }
+    <0>@nl","@nl                { tok TComma }
+    <0>@nl".."@nl               { tok TDoubleDot }
+    <0>@nl"."@nl                { tok TDot }
+    <0>@nl"?"@nl                { tok TQuestionMark }
+    <0>@nl"!"@nl                { tok TExclamationMark }
+    <0>@nl"$"@nl                { tok TDollar }
+    <0>@nl"<-"@nl               { tok TDrawnFrom }
+    <0>@nl"<->"@nl              { tok TTie }
+    <0>@nl":"@nl                { tok TColon }
+
+    <0>@nl"@@"@nl               { tok TDoubleAt }
+
+    -- Program Structure
+    <0>@nl"="@nl                { tok TDefineEqual }
+    <0>@nl"if"/$notid           { soakTok TIf }
+    <0>@nl"then"/$notid         { soakTok TThen }
+    <0>@nl"else"/$notid         { soakTok TElse }
+    <0>@nl"let"/$notid          { soakTok TLet }
+    <0>@nl"within"/$notid       { soakTok TWithin }
+    <0>"channel"/$notid         { soakTok TChannel }
+    <0>"assert"/$notid          { soakTok TAssert }
+    <0>"datatype"/$notid        { soakTok TDataType }
+    <0>"external"/$notid        { soakTok TExternal }
+    <0>"transparent"/$notid     { soakTok TTransparent }
+    <0>"nametype"/$notid        { soakTok TNameType }
+
+    <0>@nl"\"@nl                { tok TBackSlash }
+    <0>@nl"@"@nl                { tok TLambdaDot }
+
+    -- Arithmetic
+    <0>@nl"+"@nl                { tok TPlus }
+    <0>"-"@nl                   { tok TMinus }
+    <0>@nl"*"@nl                { tok TTimes }
+    <0>@nl"/"@nl                { tok TDivide }
+    <0>@nl"%"@nl                { tok TMod }
+
+    -- Sequence Symbols
+    <0>@nl"^"@nl                { tok TConcat }
+    <0>"#"@nl                   { tok THash }
+
+    -- 'Wildcards'
+    <0>$alpha+$alphanum*$prime* { stok (\s -> TIdent s) }
+    <0>@nl$digit+               { stok (\ s -> TInteger (read s)) }
+
+    -- Must be after names
+    <0>@nl"_"@nl                { tok TWildCard }
+
+    <0>@nltok                   { tok TNewLine }
+
+{
+wschars :: String
+wschars = " \t\r\n"
+
+strip :: String -> String
+strip = lstrip . rstrip
+
+-- | Same as 'strip', but applies only to the left side of the string.
+lstrip :: String -> String
+lstrip s = case s of
+    [] -> []
+    (x:xs) -> if elem x wschars then lstrip xs else s
+
+-- | Same as 'strip', but applies only to the right side of the string.
+rstrip :: String -> String
+rstrip = reverse . lstrip . reverse
+
+openseq token inp len = 
+    do
+        --cs <- getSequenceStack
+        --setSequenceStack (0:cs)
+        tok token inp len
+closeseq token inp len = 
+    do
+        --(c:cs) <- getSequenceStack
+        --setSequenceStack cs
+        tok token inp len
+
+gt :: AlexInput -> Int -> ParseMonad LToken
+gt inp len = do
+    (c:cs) <- getSequenceStack
+    tok (if c > 0 then TCloseSeq else TGt) inp len
+
+soakTok :: Token -> AlexInput -> Int -> ParseMonad LToken
+soakTok t inp len = setCurrentStartCode soak >> tok t inp len
+
+-- TODO: don't count whitespace in the tokens
+tok :: Token -> AlexInput -> Int -> ParseMonad LToken
+tok t (ParserState { fileStack = fps:_ }) len =
+        return $ L (SrcSpanOneLine f lineno colno (colno+len)) t
+    where
+        (FileParserState { tokenizerPos = FilePosition offset lineno colno, 
+                            fileName = f }) = fps
+
+stok :: (String -> Token) -> AlexInput -> Int -> ParseMonad LToken
+stok f (st @ ParserState { fileStack = stk }) len = do
+        tok (f (filter (\ c -> c /= '\n') (takeChars len stk))) st len
+
+skip input len = getNextToken
+
+takeChars :: Int -> [FileParserState] -> String
+takeChars 0 _ = ""
+takeChars len (FileParserState {input = [] }:stk) = takeChars len stk
+takeChars len (fps@(FileParserState {input = (c:cs) }):stk) = 
+    c:(takeChars (len-1) (fps {input = cs}:stk))
+
+nestedComment :: AlexInput -> Int -> ParseMonad LToken
+nestedComment _ _ = do
+    st <- getParserState
+    go 1 st
+    where 
+        err :: ParseMonad a
+        err = do
+            FileParserState { 
+                fileName = fname, 
+                tokenizerPos = pos, 
+                currentStartCode = sc } <- getTopFileParserState
+            throwSourceError [lexicalErrorMessage (filePositionToSrcLoc fname pos)]
+        go :: Int -> AlexInput -> ParseMonad LToken
+        go 0 st = do setParserState st; getNextToken
+        go n st = do
+            case alexGetChar st of
+                Nothing  -> err
+                Just (c,st) -> do
+                    case c of
+                        '-' -> do
+                            case alexGetChar st of
+                                Nothing          -> err
+                                Just ('\125',st) -> go (n-1) st
+                                Just (c,st)      -> go n st
+                        '\123' -> do
+                            case alexGetChar st of
+                                Nothing       -> err
+                                Just ('-',st) -> go (n+1) st
+                                Just (c,st)   -> go n st
+                        c -> go n st
+
+switchInput :: AlexInput -> Int -> ParseMonad LToken
+switchInput st len = do
+    FileParserState { 
+        fileName = fname, 
+        tokenizerPos = pos, 
+        currentStartCode = sc } <- getTopFileParserState
+    let
+        str = takeChars len (fileStack st)
+        quotedFname = strip (drop (length "include") str)
+        
+        hasStartQuote ('\"':cs) = True
+        hasStartQuote _ = False
+
+        hasEndQuote [] = False
+        hasEndQuote ('\"':cs) = True
+        hasEndQuote (c:cs) = hasEndQuote cs
+        
+        file = calcFile (tail quotedFname)
+        calcFile ('\"':cs) = ""
+        calcFile (c:cs) = c:calcFile cs
+
+    if not (hasStartQuote quotedFname) || not (hasEndQuote (tail quotedFname)) then
+        throwSourceError [invalidIncludeErrorMessage (filePositionToSrcLoc fname pos)]
+    else pushFile file getNextToken
+
+type AlexInput = ParserState
+
+begin :: Int -> AlexInput -> Int -> ParseMonad LToken
+begin sc' st len = setCurrentStartCode sc' >> getNextToken
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar (ParserState { fileStack = fps:_ })= previousChar fps
+
+alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
+alexGetChar (ParserState { fileStack = [] }) = Nothing
+alexGetChar (st @ (ParserState { fileStack = fps:fpss })) = gc fps
+    where
+        gc (fps @ (FileParserState { input = [] })) = 
+            alexGetChar (st { fileStack = fpss })
+        gc (fps @ (FileParserState { tokenizerPos = p, input = (c:s) })) =
+                p' `seq` Just (c, st')
+            where
+                p' = movePos p c
+                fps' = fps { input = s, tokenizerPos = p', previousChar = c }
+                st' = st { fileStack = fps':fpss }
+
+getNextToken :: ParseMonad LToken
+getNextToken = do
+    FileParserState { 
+        fileName = fname, 
+        tokenizerPos = pos, 
+        currentStartCode = sc } <- getTopFileParserState
+    st <- getParserState
+    case alexScan st sc of
+        AlexEOF -> return $ L Unknown TEOF
+        AlexError st' -> 
+            throwSourceError [lexicalErrorMessage (filePositionToSrcLoc fname pos)]
+        AlexSkip st' len -> do
+            setParserState st'
+            getNextToken
+        AlexToken st' len action -> do
+            setParserState st'
+            action st len
+
+getNextTokenWrapper :: (LToken -> ParseMonad a) -> ParseMonad a
+getNextTokenWrapper cont = getNextToken >>= cont
+
+}
diff --git a/src/CSPM/Parser/Monad.hs b/src/CSPM/Parser/Monad.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Parser/Monad.hs
@@ -0,0 +1,143 @@
+module CSPM.Parser.Monad (
+    ParseMonad, ParserState(..), 
+    FileParserState(..), movePos,
+    setParserState, getParserState, 
+    FilePosition(..), filePositionToSrcLoc,
+    modifyTopFileParserState, getTopFileParserState,
+    
+    runParser, pushFile, pushFileContents,
+    getTokenizerPos, getFileName, getInput, 
+    getPreviousChar, getCurrentStartCode, setCurrentStartCode, 
+    getSequenceStack, setSequenceStack
+)
+where
+
+import Control.Monad.State
+import Data.Typeable
+import Prelude
+import System.FilePath
+import System.IO
+import System.IO.Error
+
+import CSPM.DataStructures.Tokens
+import CSPM.Parser.Exceptions
+import Util.Annotated
+
+-- *************************************************************************
+-- Parser Support Types
+-- *************************************************************************
+
+-- TAKEN FROM ALEX
+-- `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 FilePosition = FilePosition !Int !Int !Int
+    deriving (Eq,Show)
+
+startPos :: FilePosition
+startPos = FilePosition 0 1 1
+
+filePositionToSrcLoc :: String -> FilePosition -> SrcSpan
+filePositionToSrcLoc filePath (FilePosition _ line col) = 
+    SrcSpanPoint filePath line col
+    
+movePos :: FilePosition -> Char -> FilePosition
+-- Don't treat tabs any differently (editors don't)
+--movePos (FilePosition a l c) '\t' = 
+--  FilePosition (a+1)  l     (((c+7) `div` 8)*8+1)
+movePos (FilePosition a l c) '\n' = FilePosition (a+1) (l+1)   1
+movePos (FilePosition a l c) _    = FilePosition (a+1)  l     (c+1)
+
+-- *************************************************************************
+-- Parser Monad
+-- *************************************************************************
+data ParserState = ParserState {
+        rootDir :: !String,
+        fileStack :: ![FileParserState]
+    }
+    deriving Show
+
+data FileParserState = FileParserState {
+        tokenizerPos :: !FilePosition,
+        fileName :: !String,
+        input :: String,
+        previousChar :: !Char,
+        currentStartCode :: !Int, -- current startcode
+        
+        sequenceStack :: ![Int]
+    } 
+    deriving Show
+
+-- The parser monad takes a sequence of parser states, representing the
+-- current stack of include files
+type ParseMonad = StateT ParserState IO
+
+runParser :: ParseMonad a -> String -> IO a
+runParser prog dirname =
+    runStateT prog (ParserState dirname [])
+    >>= return . fst
+
+getTopFileParserState :: ParseMonad FileParserState
+getTopFileParserState = gets (head . fileStack)
+
+getParserState :: ParseMonad ParserState
+getParserState = gets id
+
+setParserState :: ParserState -> ParseMonad ()
+setParserState st = modify (\ _ -> st)
+
+modifyTopFileParserState :: (FileParserState -> FileParserState) -> ParseMonad ()
+modifyTopFileParserState stf =
+    modify (\ st -> let fs:fss = fileStack st in 
+                        st { fileStack = (stf fs):fss })
+
+pushFile :: String -> ParseMonad a -> ParseMonad a
+pushFile fname prog =
+    do
+        dirname <- gets rootDir     
+        let filename = combine dirname fname
+        str <- liftIO $ catch (readFile filename) (\err ->
+            throwSourceError [fileAccessErrorMessage filename])
+        pushFileContents filename str
+        x <- prog
+        return x
+
+pushFileContents :: String -> String -> ParseMonad ()
+pushFileContents filename input = 
+    modify (\ st -> let
+            fs = FileParserState startPos filename input '\n' 0 [0]
+        in
+            st { fileStack = fs:(fileStack st) })
+
+setFileParserState :: FileParserState -> ParseMonad ()
+setFileParserState fs = 
+    modify (\ st -> st { fileStack = fs:(tail (fileStack st)) } )
+
+getTokenizerPos :: ParseMonad FilePosition
+getTokenizerPos = getTopFileParserState >>= (return . tokenizerPos)
+
+getFileName :: ParseMonad String
+getFileName = getTopFileParserState >>= (return . fileName)
+
+getInput :: ParseMonad String
+getInput = getTopFileParserState >>= (return . input)
+
+getPreviousChar :: ParseMonad Char
+getPreviousChar = getTopFileParserState >>= (return . previousChar)
+
+getCurrentStartCode :: ParseMonad Int
+getCurrentStartCode = getTopFileParserState >>= (return . currentStartCode)
+
+getSequenceStack :: ParseMonad [Int]
+getSequenceStack = getTopFileParserState >>= (return . sequenceStack)
+
+setCurrentStartCode :: Int -> ParseMonad ()
+setCurrentStartCode sc = 
+    modifyTopFileParserState (\ st -> st { currentStartCode = sc })
+
+setSequenceStack :: [Int] -> ParseMonad ()
+setSequenceStack st = 
+    modifyTopFileParserState (\ s -> s { sequenceStack = st })
diff --git a/src/CSPM/Parser/Parser.hs b/src/CSPM/Parser/Parser.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/Parser/Parser.hs
@@ -0,0 +1,2383 @@
+{-# OPTIONS_GHC -w #-}
+{-# OPTIONS -fglasgow-exts -cpp #-}
+module CSPM.Parser.Parser (
+	parseFile_, parseInteractiveStmt_, parseExpression_
+) 
+where
+
+import Data.Char
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.DataStructures.Tokens
+import CSPM.DataStructures.Types hiding (TDot)
+import CSPM.Parser.Exceptions
+import CSPM.Parser.Lexer
+import CSPM.Parser.Monad
+import Util.Annotated
+import qualified Data.Array as Happy_Data_Array
+import qualified GHC.Exts as Happy_GHC_Exts
+
+-- parser produced by Happy Version 1.18.6
+
+newtype HappyAbsSyn t8 t9 t28 t29 = HappyAbsSyn HappyAny
+#if __GLASGOW_HASKELL__ >= 607
+type HappyAny = Happy_GHC_Exts.Any
+#else
+type HappyAny = forall a . a
+#endif
+happyIn6 :: ([PDecl]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn6 #-}
+happyOut6 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PDecl])
+happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut6 #-}
+happyIn7 :: (PInteractiveStmt) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn7 #-}
+happyOut7 :: (HappyAbsSyn t8 t9 t28 t29) -> (PInteractiveStmt)
+happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut7 #-}
+happyIn8 :: t8 -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn8 #-}
+happyOut8 :: (HappyAbsSyn t8 t9 t28 t29) -> t8
+happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut8 #-}
+happyIn9 :: t9 -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn9 #-}
+happyOut9 :: (HappyAbsSyn t8 t9 t28 t29) -> t9
+happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut9 #-}
+happyIn10 :: ([PDecl]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn10 #-}
+happyOut10 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PDecl])
+happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut10 #-}
+happyIn11 :: ([PDecl]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn11 #-}
+happyOut11 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PDecl])
+happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut11 #-}
+happyIn12 :: ([PDecl]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn12 #-}
+happyOut12 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PDecl])
+happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut12 #-}
+happyIn13 :: (Maybe PDecl) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn13 #-}
+happyOut13 :: (HappyAbsSyn t8 t9 t28 t29) -> (Maybe PDecl)
+happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut13 #-}
+happyIn14 :: (PDecl) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn14 #-}
+happyOut14 :: (HappyAbsSyn t8 t9 t28 t29) -> (PDecl)
+happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut14 #-}
+happyIn15 :: (PDecl) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn15 #-}
+happyOut15 :: (HappyAbsSyn t8 t9 t28 t29) -> (PDecl)
+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut15 #-}
+happyIn16 :: (Assertion) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn16 #-}
+happyOut16 :: (HappyAbsSyn t8 t9 t28 t29) -> (Assertion)
+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut16 #-}
+happyIn17 :: (SemanticProperty) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn17 #-}
+happyOut17 :: (HappyAbsSyn t8 t9 t28 t29) -> (SemanticProperty)
+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut17 #-}
+happyIn18 :: (ModelOption) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn18 #-}
+happyOut18 :: (HappyAbsSyn t8 t9 t28 t29) -> (ModelOption)
+happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut18 #-}
+happyIn19 :: (PDataTypeClause) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn19 #-}
+happyOut19 :: (HappyAbsSyn t8 t9 t28 t29) -> (PDataTypeClause)
+happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut19 #-}
+happyIn20 :: ([PDataTypeClause]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn20 #-}
+happyOut20 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PDataTypeClause])
+happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut20 #-}
+happyIn21 :: ([PDataTypeClause]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn21 #-}
+happyOut21 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PDataTypeClause])
+happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut21 #-}
+happyIn22 :: (Located Name) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn22 #-}
+happyOut22 :: (HappyAbsSyn t8 t9 t28 t29) -> (Located Name)
+happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut22 #-}
+happyIn23 :: ([Located Name]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn23 #-}
+happyOut23 :: (HappyAbsSyn t8 t9 t28 t29) -> ([Located Name])
+happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut23 #-}
+happyIn24 :: ([Located Name]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn24 #-}
+happyOut24 :: (HappyAbsSyn t8 t9 t28 t29) -> ([Located Name])
+happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut24 #-}
+happyIn25 :: (Located QualifiedName) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn25 #-}
+happyOut25 :: (HappyAbsSyn t8 t9 t28 t29) -> (Located QualifiedName)
+happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut25 #-}
+happyIn26 :: (Located Literal) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn26 #-}
+happyOut26 :: (HappyAbsSyn t8 t9 t28 t29) -> (Located Literal)
+happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut26 #-}
+happyIn27 :: (PPat) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn27 #-}
+happyOut27 :: (HappyAbsSyn t8 t9 t28 t29) -> (PPat)
+happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut27 #-}
+happyIn28 :: t28 -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn28 #-}
+happyOut28 :: (HappyAbsSyn t8 t9 t28 t29) -> t28
+happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut28 #-}
+happyIn29 :: t29 -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn29 #-}
+happyOut29 :: (HappyAbsSyn t8 t9 t28 t29) -> t29
+happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut29 #-}
+happyIn30 :: (PExp) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn30 #-}
+happyOut30 :: (HappyAbsSyn t8 t9 t28 t29) -> (PExp)
+happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut30 #-}
+happyIn31 :: (PExp) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn31 #-}
+happyOut31 :: (HappyAbsSyn t8 t9 t28 t29) -> (PExp)
+happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut31 #-}
+happyIn32 :: (PExp) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn32 #-}
+happyOut32 :: (HappyAbsSyn t8 t9 t28 t29) -> (PExp)
+happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut32 #-}
+happyIn33 :: (PField) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn33 #-}
+happyOut33 :: (HappyAbsSyn t8 t9 t28 t29) -> (PField)
+happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut33 #-}
+happyIn34 :: ((PExp, PExp)) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn34 #-}
+happyOut34 :: (HappyAbsSyn t8 t9 t28 t29) -> ((PExp, PExp))
+happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut34 #-}
+happyIn35 :: ([(PExp, PExp)]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn35 #-}
+happyOut35 :: (HappyAbsSyn t8 t9 t28 t29) -> ([(PExp, PExp)])
+happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut35 #-}
+happyIn36 :: ([(PExp, PExp)]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn36 #-}
+happyOut36 :: (HappyAbsSyn t8 t9 t28 t29) -> ([(PExp, PExp)])
+happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut36 #-}
+happyIn37 :: ((PExp, PExp)) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn37 #-}
+happyOut37 :: (HappyAbsSyn t8 t9 t28 t29) -> ((PExp, PExp))
+happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut37 #-}
+happyIn38 :: ([(PExp, PExp)]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn38 #-}
+happyOut38 :: (HappyAbsSyn t8 t9 t28 t29) -> ([(PExp, PExp)])
+happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut38 #-}
+happyIn39 :: ([(PExp, PExp)]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn39 #-}
+happyOut39 :: (HappyAbsSyn t8 t9 t28 t29) -> ([(PExp, PExp)])
+happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut39 #-}
+happyIn40 :: ([PField]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn40 #-}
+happyOut40 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PField])
+happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut40 #-}
+happyIn41 :: ([PField]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn41 #-}
+happyOut41 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PField])
+happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut41 #-}
+happyIn42 :: ([PExp]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn42 #-}
+happyOut42 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PExp])
+happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut42 #-}
+happyIn43 :: ([PExp]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn43 #-}
+happyOut43 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PExp])
+happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut43 #-}
+happyIn44 :: ([PExp]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn44 #-}
+happyOut44 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PExp])
+happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut44 #-}
+happyIn45 :: ([PExp]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn45 #-}
+happyOut45 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PExp])
+happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut45 #-}
+happyIn46 :: ([PStmt]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn46 #-}
+happyOut46 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PStmt])
+happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut46 #-}
+happyIn47 :: (PStmt) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn47 #-}
+happyOut47 :: (HappyAbsSyn t8 t9 t28 t29) -> (PStmt)
+happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut47 #-}
+happyIn48 :: ([PStmt]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn48 #-}
+happyOut48 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PStmt])
+happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut48 #-}
+happyIn49 :: ([PStmt]) -> (HappyAbsSyn t8 t9 t28 t29)
+happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn49 #-}
+happyOut49 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PStmt])
+happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut49 #-}
+happyInTok :: (LToken) -> (HappyAbsSyn t8 t9 t28 t29)
+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyInTok #-}
+happyOutTok :: (HappyAbsSyn t8 t9 t28 t29) -> (LToken)
+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOutTok #-}
+
+
+happyActOffsets :: HappyAddr
+happyActOffsets = HappyA# "\x00\x00\x4c\x01\x70\x01\x00\x00\x4d\x00\x00\x00\x00\x00\x70\x01\x64\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x01\x96\x00\x70\x01\x70\x01\x00\x00\x00\x00\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\xcf\x00\x00\x00\x01\x06\x96\x00\x70\x01\xcf\x00\x00\x00\xe9\xff\x05\x01\x17\x01\x00\x00\x00\x00\xfe\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x70\x01\x00\x00\xc6\x00\xe5\x00\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x2a\x00\xde\x02\x00\x00\xf4\x00\xf7\x00\xe9\x00\xe3\x00\xe1\x00\xea\x00\x00\x00\xa8\x00\xf1\x00\x68\x05\x01\x06\xf7\xff\xed\x00\x35\x05\xf1\xff\x31\x02\xb7\x00\x04\x00\x9d\x01\x9c\x08\xcd\x00\x01\x06\xb5\x01\xee\x04\xa7\x04\xf8\xff\x00\x00\x00\x00\x00\x00\x00\x00\x70\x01\x00\x00\x03\x01\x70\x01\x70\x01\x70\x01\x00\x00\x70\x01\x00\x00\x70\x01\x00\x00\xba\x00\x70\x01\x70\x01\x00\x00\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x97\x00\x70\x01\x70\x01\x2a\x08\x2a\x08\xf8\x07\xc6\x07\x2a\x08\xfd\x06\x62\x07\x94\x07\x60\x04\xd3\x00\x97\x02\xca\x00\x00\x00\xbb\x00\xc3\x00\x8e\x00\xeb\xff\x04\x00\x04\x00\x04\x00\x9d\x01\x9d\x01\x8b\x08\x8b\x08\x8b\x08\x8b\x08\x8b\x08\x8b\x08\x69\x08\x7a\x08\x33\x06\xce\x05\x30\x07\xcb\x06\x98\x06\x53\x08\x00\x00\x70\x01\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\xa9\x00\x9e\x00\x70\x01\x01\x00\x00\x00\x70\x01\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x01\x81\x00\x00\x00\x9b\x05\x00\x00\x00\x00\x00\x00\x5b\x00\x70\x01\xa2\x00\xa2\x00\x70\x01\x2a\x08\x70\x01\x70\x01\x00\x00\x70\x01\x5f\x00\x70\x01\x70\x01\x70\x01\x70\x01\x52\x00\x70\x01\x9b\x05\x9b\x05\x70\x01\x00\x00\x9b\x05\x9b\x05\x9b\x05\x00\x00\x85\x00\x00\x00\x76\x00\x4e\x00\x9b\x05\x19\x04\x00\x00\x4f\x00\x80\x00\x9b\x05\x00\x00\xe6\x03\x00\x00\x9f\x03\x58\x00\x00\x00\x00\x00\x70\x01\x00\x00\x00\x00\x00\x00\x70\x01\x70\x01\x58\x03\x11\x03\x70\x01\x65\x06\x65\x06\x00\x00\x00\x00\x00\x00\x00\x00\x30\x07\x30\x07\x00\x00\x00\x00\x00\x00\x00\x00\x74\x00\x67\x00\x00\x00\x00\x00\x70\x01\x00\x00\x70\x01\x7d\x00\x65\x06\x70\x01\x70\x01\x9b\x05\x9b\x05\x9b\x05\x65\x06\x65\x06\x00\x00\x00\x00\x00\x00"#
+
+happyGotoOffsets :: HappyAddr
+happyGotoOffsets = HappyA# "\x6d\x00\x40\x00\xfb\x09\x73\x00\xf0\x03\x00\x00\x00\x00\x2f\x05\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x09\x67\x04\xad\x00\xeb\x09\x00\x00\x00\x00\xe3\x09\xdb\x09\xb6\x01\xe7\x04\xa1\x04\xd3\x09\xaa\x04\x98\x03\x51\x03\xf7\x01\xae\x01\x00\x00\x00\x00\xff\xff\xe8\x02\x5e\x03\x00\x00\x00\x00\x6a\x00\x00\x00\x6c\x00\x00\x00\x00\x00\xff\xff\xce\x00\x56\x00\xc4\x00\x71\x00\x47\x00\x04\x02\x00\x00\x00\x00\x49\x00\xcb\x09\xc3\x09\xbb\x09\xb3\x09\xab\x09\xa3\x09\x9b\x09\x93\x09\x8b\x09\x83\x09\x7b\x09\x73\x09\x6b\x09\x63\x09\x5b\x09\x53\x09\x4b\x09\x43\x09\x3b\x09\x33\x09\x47\x01\x3a\x02\x2b\x09\xa5\x03\x23\x09\x1b\x09\x13\x09\x0b\x09\x03\x09\xfb\x08\xf3\x08\xeb\x08\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x01\x00\x00\x3d\x06\xe3\x08\x0a\x06\xdb\x08\x00\x00\x18\x00\x00\x00\xfe\x00\x00\x00\xd3\x08\xcb\x08\xf6\x00\x00\x00\x8d\x00\xf1\x04\x48\x00\xd7\x05\xc3\x08\x5a\x08\x51\x08\x64\x00\x00\x00\x36\x08\x2e\x08\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x00\x00\x00\x00\x1d\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\x00\x00\x25\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x05\xd0\x07\x00\x00\x02\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x05\x17\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x38\x05\x3c\x00\x08\x00\x22\x04\xff\xff\xf3\x07\x9e\x07\x00\x00\x6d\x02\x00\x00\xfc\xff\x1a\x03\x8f\x07\x6c\x07\x00\x00\x39\x07\xff\xff\xff\xff\x07\x07\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x7a\x00\xf6\xff\x00\x00\x00\x00\xd4\x06\x00\x00\x00\x00\x00\x00\xa1\x06\x6f\x06\xff\xff\xff\xff\x87\x01\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x02\x00\x00\xa1\x02\x26\x00\xff\xff\x63\x01\xd1\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00"#
+
+happyDefActions :: HappyAddr
+happyDefActions = HappyA# "\xf6\xff\x00\x00\x00\x00\x00\x00\xf4\xff\xc8\xff\xc9\xff\x7b\xff\x00\x00\xca\xff\xd1\xff\xd2\xff\xcf\xff\xd0\xff\xa4\xff\x00\x00\x00\x00\x00\x00\x00\x00\xb1\xff\xcd\xff\x00\x00\x00\x00\x00\x00\x7b\xff\x7b\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\xff\xcb\xff\x00\x00\x00\x00\x00\x00\xfa\xff\x00\x00\x00\x00\xf2\xff\xf1\xff\xed\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\x00\x00\x80\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\xff\x70\xff\x00\x00\x72\xff\x00\x00\x00\x00\x00\x00\x00\x00\x82\xff\x00\x00\x83\xff\x00\x00\x78\xff\x00\x00\x7a\xff\x78\xff\x00\x00\x00\x00\x00\x00\xab\xff\xb7\xff\xba\xff\x00\x00\xce\xff\x00\x00\x00\x00\x78\xff\x00\x00\xfc\xff\xf3\xff\xf5\xff\xb0\xff\x00\x00\xcc\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc7\xff\x00\x00\xc3\xff\x00\x00\xaa\xff\x00\x00\x00\x00\x00\x00\xa6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\xff\x97\xff\x98\xff\x9a\xff\xa1\xff\x9d\xff\x9e\xff\xa0\xff\xcb\xff\x77\xff\x00\x00\x00\x00\x86\xff\x77\xff\x87\xff\x00\x00\xac\xff\xb4\xff\xb3\xff\xb2\xff\xb5\xff\xb6\xff\xbd\xff\xbe\xff\xbb\xff\xbc\xff\xbf\xff\xc0\xff\xb9\xff\xb8\xff\x9f\xff\xa3\xff\x89\xff\x8b\xff\x8d\xff\xc6\xff\x7e\xff\x00\x00\xe6\xff\x00\x00\xd6\xff\xd4\xff\xe7\xff\xd5\xff\xe8\xff\x00\x00\xeb\xff\x00\x00\xef\xff\xf8\xff\x00\x00\xe2\xff\xe0\xff\xdf\xff\xde\xff\xdd\xff\x00\x00\xe4\xff\xe1\xff\xc5\xff\xf0\xff\xee\xff\xf7\xff\xec\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\x00\x00\x00\xc2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\xff\x74\xff\x00\x00\x71\xff\x93\xff\x91\xff\x92\xff\x84\xff\x00\x00\x81\xff\x00\x00\x00\x00\x79\xff\x00\x00\xa8\xff\x00\x00\x7d\xff\xc1\xff\xec\xff\x00\x00\xae\xff\x00\x00\x00\x00\xaf\xff\xad\xff\x00\x00\xa9\xff\xa7\xff\xa5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\xff\x9c\xff\x88\xff\x76\xff\x95\xff\x85\xff\x8a\xff\x8c\xff\xe5\xff\xd3\xff\xd8\xff\xe9\xff\xd9\xff\xda\xff\xea\xff\xe3\xff\x00\x00\xdc\xff\x00\x00\x00\x00\x94\xff\x00\x00\x00\x00\x8e\xff\x8f\xff\xc4\xff\x90\xff\x9b\xff\xd7\xff\xdb\xff"#
+
+happyCheck :: HappyAddr
+happyCheck = HappyA# "\xff\xff\x10\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x10\x00\x10\x00\x20\x00\x21\x00\x22\x00\x23\x00\x17\x00\x25\x00\x13\x00\x14\x00\x15\x00\x16\x00\x12\x00\x13\x00\x19\x00\x1a\x00\x16\x00\x10\x00\x18\x00\x1b\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x22\x00\x23\x00\x0c\x00\x39\x00\x29\x00\x2a\x00\x2b\x00\x27\x00\x31\x00\x3f\x00\x13\x00\x14\x00\x3c\x00\x16\x00\x2e\x00\x2f\x00\x19\x00\x1a\x00\x0d\x00\x33\x00\x3e\x00\x10\x00\x0d\x00\x0e\x00\x38\x00\x39\x00\x37\x00\x3b\x00\x39\x00\x3d\x00\x27\x00\x17\x00\x01\x00\x41\x00\x3f\x00\x43\x00\x28\x00\x45\x00\x46\x00\x47\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x4c\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x13\x00\x14\x00\x28\x00\x16\x00\x10\x00\x18\x00\x19\x00\x1a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x12\x00\x13\x00\x19\x00\x1a\x00\x16\x00\x1b\x00\x18\x00\x10\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x00\x00\x02\x00\x08\x00\x03\x00\x29\x00\x2a\x00\x2b\x00\x27\x00\x0b\x00\x03\x00\x13\x00\x14\x00\x15\x00\x16\x00\x2e\x00\x2f\x00\x19\x00\x1a\x00\x02\x00\x33\x00\x10\x00\x11\x00\x12\x00\x10\x00\x38\x00\x39\x00\x07\x00\x3b\x00\x31\x00\x3d\x00\x3c\x00\x3e\x00\x29\x00\x41\x00\x19\x00\x43\x00\x17\x00\x45\x00\x46\x00\x47\x00\x1b\x00\x44\x00\x01\x00\x02\x00\x4c\x00\x04\x00\x05\x00\x22\x00\x23\x00\x19\x00\x40\x00\x13\x00\x14\x00\x15\x00\x16\x00\x02\x00\x24\x00\x19\x00\x1a\x00\x12\x00\x13\x00\x4f\x00\x0d\x00\x16\x00\x26\x00\x18\x00\x06\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x29\x00\x2a\x00\x2b\x00\x07\x00\x06\x00\x01\x00\x02\x00\x27\x00\x04\x00\x05\x00\x13\x00\x14\x00\x15\x00\x16\x00\x2e\x00\x2f\x00\x19\x00\x1a\x00\x3a\x00\x33\x00\x07\x00\x10\x00\x12\x00\x13\x00\x38\x00\x39\x00\x16\x00\x3b\x00\x18\x00\x3d\x00\x10\x00\x11\x00\x12\x00\x41\x00\x0e\x00\x43\x00\x43\x00\x45\x00\x46\x00\x47\x00\x10\x00\x11\x00\x12\x00\x27\x00\x4c\x00\x10\x00\x13\x00\x14\x00\x19\x00\x16\x00\x2e\x00\x2f\x00\x19\x00\x1a\x00\x44\x00\x33\x00\x09\x00\x0a\x00\x0b\x00\x3a\x00\x38\x00\x39\x00\x07\x00\x3b\x00\x3c\x00\x3d\x00\x07\x00\x0f\x00\x19\x00\x41\x00\x19\x00\x43\x00\x07\x00\x45\x00\x46\x00\x47\x00\x19\x00\x02\x00\x01\x00\x02\x00\x4c\x00\x04\x00\x05\x00\x13\x00\x14\x00\x15\x00\x16\x00\x19\x00\x48\x00\x19\x00\x1a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x12\x00\x13\x00\x19\x00\x1a\x00\x16\x00\x03\x00\x18\x00\x17\x00\xff\xff\x4f\x00\x29\x00\x2a\x00\x2b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\x2b\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x2f\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\x39\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x01\x00\x02\x00\x4c\x00\x04\x00\x05\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\x12\x00\x13\x00\x19\x00\x1a\x00\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\x2b\x00\x1f\x00\xff\xff\x26\x00\x27\x00\xff\xff\xff\xff\x01\x00\x02\x00\x27\x00\x04\x00\x05\x00\x13\x00\x14\x00\xff\xff\x16\x00\x2e\x00\x2f\x00\x19\x00\x1a\x00\xff\xff\x33\x00\xff\xff\xff\xff\x12\x00\x13\x00\x38\x00\x39\x00\x16\x00\x3b\x00\x18\x00\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x27\x00\x4c\x00\xff\xff\x13\x00\x14\x00\xff\xff\x16\x00\x2e\x00\x2f\x00\x19\x00\x1a\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\x39\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x06\x00\x4c\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x11\x00\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\x18\x00\xff\xff\x19\x00\x1a\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x29\x00\x2a\x00\x2b\x00\x24\x00\xff\xff\x3f\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x06\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0a\x00\x11\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\x1c\x00\x1d\x00\x1e\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x3a\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\x1c\x00\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x0d\x00\x0e\x00\x05\x00\x06\x00\x11\x00\x08\x00\x09\x00\x13\x00\x14\x00\xff\xff\x16\x00\x18\x00\x18\x00\x19\x00\x1a\x00\xff\xff\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0a\x00\x11\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x11\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x1f\x00\x20\x00\x21\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\x04\x00\x05\x00\x06\x00\x11\x00\x08\x00\x09\x00\xff\xff\x15\x00\xff\xff\xff\xff\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\x3c\x00\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x05\x00\x06\x00\xff\xff\x08\x00\x09\x00\x11\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\xff\xff\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\x4c\x00\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x13\x00\x14\x00\xff\xff\x16\x00\x11\x00\xff\xff\x19\x00\x1a\x00\xff\xff\x13\x00\x14\x00\x18\x00\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\x26\x00\x27\x00\x1f\x00\x20\x00\x21\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x11\x00\x19\x00\x1a\x00\x14\x00\xff\xff\x13\x00\x14\x00\x18\x00\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\x26\x00\x27\x00\xff\xff\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x13\x00\x14\x00\xff\xff\x16\x00\x11\x00\xff\xff\x19\x00\x1a\x00\xff\xff\x13\x00\x14\x00\x18\x00\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\x26\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x0d\x00\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\xff\xff\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x0d\x00\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\xff\xff\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x45\x00\x19\x00\x1a\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x48\x00\xff\xff\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x48\x00\x13\x00\x14\x00\xff\xff\x16\x00\x4d\x00\x4e\x00\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x08\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x3f\x00\x19\x00\x1a\x00\xff\xff\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x48\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x3f\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x3f\x00\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x3f\x00\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x3f\x00\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x3f\x00\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+
+happyTable :: HappyAddr
+happyTable = HappyA# "\x00\x00\x81\x00\x0b\x00\x0c\x00\xd0\x00\x0d\x00\x0e\x00\x85\x00\x78\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xf8\x00\xca\x00\x05\x00\x06\x00\x56\x00\x07\x00\x0f\x00\x10\x00\x57\x00\x09\x00\x11\x00\x0c\x01\x12\x00\x33\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x12\x01\x4b\x00\x58\x00\x06\x01\x5a\x00\x13\x00\x79\x00\x4c\x00\x05\x00\x06\x00\x82\x00\x07\x00\x14\x00\x15\x00\x63\x00\x09\x00\x1f\x01\x16\x00\x86\x00\x10\x01\x90\x00\x91\x00\x17\x00\x18\x00\x4a\x00\x19\x00\x4b\x00\x1a\x00\xf1\x00\x76\x00\x20\x00\x1b\x00\x4c\x00\x1c\x00\xda\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x01\x0e\x01\x0f\x01\x10\x01\x20\x00\x0b\x00\x0c\x00\x76\x00\x0d\x00\x0e\x00\x05\x00\x06\x00\xdf\x00\x07\x00\xb8\x00\x21\x00\x22\x00\x09\x00\x05\x00\x06\x00\x56\x00\x07\x00\x0f\x00\x10\x00\x57\x00\x09\x00\x11\x00\xb5\x00\x12\x00\xbe\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x25\x00\xc1\x00\x16\x01\x04\x00\x58\x00\xe9\x00\x5a\x00\x13\x00\xc4\x00\x04\x00\x05\x00\x06\x00\x56\x00\x07\x00\x14\x00\x15\x00\x57\x00\x09\x00\xba\x00\x16\x00\xba\x00\xbb\x00\xbc\x00\x17\x01\x17\x00\x18\x00\x84\x00\x19\x00\x79\x00\x1a\x00\xfc\x00\xfe\x00\xe4\x00\x1b\x00\xff\x00\x1c\x00\xf9\x00\x1d\x00\x1e\x00\x1f\x00\x33\x00\x03\x01\x0b\x00\x0c\x00\x20\x00\x0d\x00\x0e\x00\x34\x00\x35\x00\x00\x01\x08\x01\x05\x00\x06\x00\x56\x00\x07\x00\xba\x00\x14\x01\x57\x00\x09\x00\x0f\x00\x10\x00\xfb\xff\xd2\x00\x11\x00\xcc\x00\x12\x00\xd3\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x58\x00\xeb\x00\x5a\x00\xd4\x00\xd5\x00\x0b\x00\x0c\x00\x13\x00\x0d\x00\x0e\x00\x05\x00\x06\x00\x6d\x00\x07\x00\x14\x00\x15\x00\x6e\x00\x09\x00\xd9\x00\x16\x00\xda\x00\xdc\x00\x0f\x00\x10\x00\x17\x00\x18\x00\x11\x00\x19\x00\x12\x00\x1a\x00\xba\x00\xbd\x00\xbc\x00\x1b\x00\xdd\x00\x1c\x00\xe4\x00\x1d\x00\x1e\x00\x1f\x00\xba\x00\xbf\x00\xbc\x00\x13\x00\x20\x00\xdc\x00\x05\x00\x06\x00\x7d\x00\x07\x00\x14\x00\x15\x00\x1d\x01\x09\x00\x89\x00\x16\x00\x38\x00\x39\x00\x3a\x00\x7e\x00\x17\x00\x18\x00\x84\x00\x19\x00\xf0\x00\x1a\x00\x88\x00\x8a\x00\x8b\x00\x1b\x00\x8c\x00\x1c\x00\x8e\x00\x1d\x00\x1e\x00\x1f\x00\x8d\x00\xba\x00\x0b\x00\x0c\x00\x20\x00\x0d\x00\x0e\x00\x05\x00\x06\x00\x56\x00\x07\x00\x8f\x00\xb7\x00\x57\x00\x09\x00\x05\x00\x06\x00\x56\x00\x07\x00\x0f\x00\x10\x00\x57\x00\x09\x00\x11\x00\xc3\x00\x12\x00\xc4\x00\x00\x00\xff\xff\x58\x00\xec\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\xf0\x00\x5a\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x15\x00\x00\x00\x79\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x1d\x00\x1e\x00\x1f\x00\x00\x00\x00\x00\x0b\x00\x0c\x00\x20\x00\x0d\x00\x0e\x00\x05\x00\x06\x00\x56\x00\x07\x00\x00\x00\x00\x00\x57\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x0f\x00\x10\x00\x63\x00\x09\x00\x24\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x58\x00\xf7\x00\x5a\x00\x25\x00\x00\x00\xa0\x00\x65\x00\x00\x00\x00\x00\x0b\x00\x0c\x00\x13\x00\x0d\x00\x0e\x00\x05\x00\x06\x00\x00\x00\x07\x00\x14\x00\x15\x00\x1e\x01\x09\x00\x00\x00\x16\x00\x00\x00\x00\x00\x0f\x00\x10\x00\x17\x00\x18\x00\x11\x00\x19\x00\x12\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x1d\x00\x1e\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x13\x00\x20\x00\x00\x00\x05\x00\x06\x00\x00\x00\x07\x00\x14\x00\x15\x00\x17\x01\x09\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x1d\x00\x1e\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x20\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x05\x00\x06\x00\x56\x00\x07\x00\x00\x00\x3b\x00\x57\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x3c\x00\x00\x00\x68\x00\x09\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x58\x00\x59\x00\x5a\x00\x69\x00\x00\x00\x4c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\xc1\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x05\x00\x06\x00\x56\x00\x07\x00\xb7\x00\x3b\x00\x57\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x27\x00\x22\x00\x09\x00\x00\x00\x58\x00\x5b\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x7f\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x9c\x00\x22\x00\x09\x00\x00\x00\x9d\x00\x9e\x00\x9f\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x80\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x9c\x00\x22\x00\x09\x00\x00\x00\x08\x01\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\xff\xff\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x20\x01\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\xde\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\xdf\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\xce\xff\xce\xff\x28\x00\x29\x00\x3b\x00\x2a\x00\x2b\x00\x05\x00\x06\x00\x00\x00\x07\x00\x3c\x00\x14\x01\x22\x00\x09\x00\x00\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x2c\x00\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x05\x01\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x19\x01\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x05\x00\x06\x00\x56\x00\x07\x00\x26\x00\x3b\x00\x57\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x27\x00\x22\x00\x09\x00\x00\x00\x58\x00\x5c\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x1a\x01\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x05\x00\x06\x00\x56\x00\x07\x00\x00\x00\x3b\x00\x57\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x5e\x00\x99\x00\x09\x00\x00\x00\x58\x00\x5d\x00\x5a\x00\x5f\x00\x9a\x00\x61\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x79\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x00\x00\x73\x00\x74\x00\x29\x00\x3b\x00\x2a\x00\x2b\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x6f\x00\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x0b\x01\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x28\x00\x29\x00\x00\x00\x2a\x00\x2b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x00\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x6f\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\xe1\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x7a\x00\x05\x00\x06\x00\x00\x00\x07\x00\x3b\x00\x00\x00\x63\x00\x09\x00\x00\x00\x05\x00\x06\x00\x3c\x00\x07\x00\x00\x00\x5e\x00\x22\x00\x09\x00\x00\x00\x00\x00\x64\x00\x65\x00\x5f\x00\x60\x00\x61\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x3b\x00\x66\x00\x09\x00\x7b\x00\x00\x00\x05\x00\x06\x00\x3c\x00\x07\x00\x00\x00\x5e\x00\x22\x00\x09\x00\x00\x00\x67\x00\x65\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x83\x00\x05\x00\x06\x00\x00\x00\x07\x00\x3b\x00\x00\x00\x71\x00\x09\x00\x00\x00\x05\x00\x06\x00\x3c\x00\x07\x00\x00\x00\x11\x01\x22\x00\x09\x00\x00\x00\x00\x00\x72\x00\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\xca\x00\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x87\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\xd0\x00\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\xe8\x00\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf3\x00\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\xf5\x00\x00\x00\xf6\x00\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x1a\x01\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x00\x00\x00\x00\x00\x00\x4c\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x4f\x00\x50\x00\x00\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x1b\x01\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x00\x00\x00\x00\x00\x00\x4c\x00\xd8\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x00\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x1c\x01\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x00\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x00\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x01\x01\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x00\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x03\x01\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x4f\x00\x04\x01\x09\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x09\x01\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x00\x00\xcd\x00\xce\x00\x2b\x00\x00\x00\x00\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x6f\x00\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x0a\x01\x09\x00\x52\x00\x00\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xcc\x00\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xd5\x00\x09\x00\x52\x00\x05\x00\x06\x00\x00\x00\x07\x00\x55\x00\x56\x00\xe1\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xe2\x00\x09\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x37\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x4c\x00\xe5\x00\x09\x00\x00\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x52\x00\xe6\x00\x09\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x4c\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x4c\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x4c\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x4c\x00\xe7\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xed\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xee\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xf2\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xf4\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x91\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x92\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x93\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x94\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x95\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x96\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x97\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x98\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x9b\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa1\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa2\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa3\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa4\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa5\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa6\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa7\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa8\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa9\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xaa\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xab\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xac\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xad\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xae\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xaf\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xb0\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xb1\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xb2\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xb3\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xb4\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x62\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x6a\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x6b\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x6c\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x70\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x08\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+happyReduceArr = Happy_Data_Array.array (3, 143) [
+	(3 , happyReduce_3),
+	(4 , happyReduce_4),
+	(5 , happyReduce_5),
+	(6 , happyReduce_6),
+	(7 , happyReduce_7),
+	(8 , happyReduce_8),
+	(9 , happyReduce_9),
+	(10 , happyReduce_10),
+	(11 , happyReduce_11),
+	(12 , happyReduce_12),
+	(13 , happyReduce_13),
+	(14 , happyReduce_14),
+	(15 , happyReduce_15),
+	(16 , happyReduce_16),
+	(17 , happyReduce_17),
+	(18 , happyReduce_18),
+	(19 , happyReduce_19),
+	(20 , happyReduce_20),
+	(21 , happyReduce_21),
+	(22 , happyReduce_22),
+	(23 , happyReduce_23),
+	(24 , happyReduce_24),
+	(25 , happyReduce_25),
+	(26 , happyReduce_26),
+	(27 , happyReduce_27),
+	(28 , happyReduce_28),
+	(29 , happyReduce_29),
+	(30 , happyReduce_30),
+	(31 , happyReduce_31),
+	(32 , happyReduce_32),
+	(33 , happyReduce_33),
+	(34 , happyReduce_34),
+	(35 , happyReduce_35),
+	(36 , happyReduce_36),
+	(37 , happyReduce_37),
+	(38 , happyReduce_38),
+	(39 , happyReduce_39),
+	(40 , happyReduce_40),
+	(41 , happyReduce_41),
+	(42 , happyReduce_42),
+	(43 , happyReduce_43),
+	(44 , happyReduce_44),
+	(45 , happyReduce_45),
+	(46 , happyReduce_46),
+	(47 , happyReduce_47),
+	(48 , happyReduce_48),
+	(49 , happyReduce_49),
+	(50 , happyReduce_50),
+	(51 , happyReduce_51),
+	(52 , happyReduce_52),
+	(53 , happyReduce_53),
+	(54 , happyReduce_54),
+	(55 , happyReduce_55),
+	(56 , happyReduce_56),
+	(57 , happyReduce_57),
+	(58 , happyReduce_58),
+	(59 , happyReduce_59),
+	(60 , happyReduce_60),
+	(61 , happyReduce_61),
+	(62 , happyReduce_62),
+	(63 , happyReduce_63),
+	(64 , happyReduce_64),
+	(65 , happyReduce_65),
+	(66 , happyReduce_66),
+	(67 , happyReduce_67),
+	(68 , happyReduce_68),
+	(69 , happyReduce_69),
+	(70 , happyReduce_70),
+	(71 , happyReduce_71),
+	(72 , happyReduce_72),
+	(73 , happyReduce_73),
+	(74 , happyReduce_74),
+	(75 , happyReduce_75),
+	(76 , happyReduce_76),
+	(77 , happyReduce_77),
+	(78 , happyReduce_78),
+	(79 , happyReduce_79),
+	(80 , happyReduce_80),
+	(81 , happyReduce_81),
+	(82 , happyReduce_82),
+	(83 , happyReduce_83),
+	(84 , happyReduce_84),
+	(85 , happyReduce_85),
+	(86 , happyReduce_86),
+	(87 , happyReduce_87),
+	(88 , happyReduce_88),
+	(89 , happyReduce_89),
+	(90 , happyReduce_90),
+	(91 , happyReduce_91),
+	(92 , happyReduce_92),
+	(93 , happyReduce_93),
+	(94 , happyReduce_94),
+	(95 , happyReduce_95),
+	(96 , happyReduce_96),
+	(97 , happyReduce_97),
+	(98 , happyReduce_98),
+	(99 , happyReduce_99),
+	(100 , happyReduce_100),
+	(101 , happyReduce_101),
+	(102 , happyReduce_102),
+	(103 , happyReduce_103),
+	(104 , happyReduce_104),
+	(105 , happyReduce_105),
+	(106 , happyReduce_106),
+	(107 , happyReduce_107),
+	(108 , happyReduce_108),
+	(109 , happyReduce_109),
+	(110 , happyReduce_110),
+	(111 , happyReduce_111),
+	(112 , happyReduce_112),
+	(113 , happyReduce_113),
+	(114 , happyReduce_114),
+	(115 , happyReduce_115),
+	(116 , happyReduce_116),
+	(117 , happyReduce_117),
+	(118 , happyReduce_118),
+	(119 , happyReduce_119),
+	(120 , happyReduce_120),
+	(121 , happyReduce_121),
+	(122 , happyReduce_122),
+	(123 , happyReduce_123),
+	(124 , happyReduce_124),
+	(125 , happyReduce_125),
+	(126 , happyReduce_126),
+	(127 , happyReduce_127),
+	(128 , happyReduce_128),
+	(129 , happyReduce_129),
+	(130 , happyReduce_130),
+	(131 , happyReduce_131),
+	(132 , happyReduce_132),
+	(133 , happyReduce_133),
+	(134 , happyReduce_134),
+	(135 , happyReduce_135),
+	(136 , happyReduce_136),
+	(137 , happyReduce_137),
+	(138 , happyReduce_138),
+	(139 , happyReduce_139),
+	(140 , happyReduce_140),
+	(141 , happyReduce_141),
+	(142 , happyReduce_142),
+	(143 , happyReduce_143)
+	]
+
+happy_n_terms = 80 :: Int
+happy_n_nonterms = 44 :: Int
+
+happyReduce_3 = happySpecReduce_2  0# happyReduction_3
+happyReduction_3 happy_x_2
+	happy_x_1
+	 =  case happyOut10 happy_x_2 of { happy_var_2 -> 
+	happyIn6
+		 (happy_var_2
+	)}
+
+happyReduce_4 = happyMonadReduce 4# 1# happyReduction_4
+happyReduction_4 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	case happyOut30 happy_x_4 of { happy_var_4 -> 
+	( do
+													d <- convDecl happy_var_2 happy_var_4 
+													return $ annotate2 happy_var_1 happy_var_4 (Bind d))}}}
+	) (\r -> happyReturn (happyIn7 r))
+
+happyReduce_5 = happySpecReduce_2  1# happyReduction_5
+happyReduction_5 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut16 happy_x_2 of { happy_var_2 -> 
+	happyIn7
+		 (annotate happy_var_1 (RunAssertion happy_var_2)
+	)}}
+
+happyReduce_6 = happySpecReduce_1  1# happyReduction_6
+happyReduction_6 happy_x_1
+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
+	happyIn7
+		 (annotate happy_var_1 (Evaluate happy_var_1)
+	)}
+
+happyReduce_7 = happySpecReduce_1  2# happyReduction_7
+happyReduction_7 happy_x_1
+	 =  happyIn8
+		 (
+	)
+
+happyReduce_8 = happySpecReduce_2  2# happyReduction_8
+happyReduction_8 happy_x_2
+	happy_x_1
+	 =  happyIn8
+		 (
+	)
+
+happyReduce_9 = happySpecReduce_0  3# happyReduction_9
+happyReduction_9  =  happyIn9
+		 (
+	)
+
+happyReduce_10 = happySpecReduce_2  3# happyReduction_10
+happyReduction_10 happy_x_2
+	happy_x_1
+	 =  happyIn9
+		 (
+	)
+
+happyReduce_11 = happySpecReduce_0  4# happyReduction_11
+happyReduction_11  =  happyIn10
+		 ([]
+	)
+
+happyReduce_12 = happySpecReduce_1  4# happyReduction_12
+happyReduction_12 happy_x_1
+	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
+	happyIn10
+		 (happy_var_1
+	)}
+
+happyReduce_13 = happySpecReduce_1  5# happyReduction_13
+happyReduction_13 happy_x_1
+	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
+	happyIn11
+		 (combineDecls (reverse happy_var_1)
+	)}
+
+happyReduce_14 = happySpecReduce_1  6# happyReduction_14
+happyReduction_14 happy_x_1
+	 =  case happyOut14 happy_x_1 of { happy_var_1 -> 
+	happyIn12
+		 ([happy_var_1]
+	)}
+
+happyReduce_15 = happySpecReduce_3  6# happyReduction_15
+happyReduction_15 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
+	case happyOut13 happy_x_3 of { happy_var_3 -> 
+	happyIn12
+		 (case happy_var_3 of 
+													Just d -> d:happy_var_1
+													Nothing -> happy_var_1
+	)}}
+
+happyReduce_16 = happySpecReduce_0  7# happyReduction_16
+happyReduction_16  =  happyIn13
+		 (Nothing
+	)
+
+happyReduce_17 = happySpecReduce_1  7# happyReduction_17
+happyReduction_17 happy_x_1
+	 =  case happyOut14 happy_x_1 of { happy_var_1 -> 
+	happyIn13
+		 (Just happy_var_1
+	)}
+
+happyReduce_18 = happyMonadReduce 1# 8# happyReduction_18
+happyReduction_18 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut15 happy_x_1 of { happy_var_1 -> 
+	( annotateWithSymbolTable happy_var_1)}
+	) (\r -> happyReturn (happyIn14 r))
+
+happyReduce_19 = happyMonadReduce 3# 9# happyReduction_19
+happyReduction_19 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut30 happy_x_3 of { happy_var_3 -> 
+	( convDecl happy_var_1 happy_var_3)}}
+	) (\r -> happyReturn (happyIn15 r))
+
+happyReduce_20 = happySpecReduce_2  9# happyReduction_20
+happyReduction_20 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut23 happy_x_2 of { happy_var_2 -> 
+	happyIn15
+		 (annotate2List happy_var_1 happy_var_2 (Channel (map unLoc happy_var_2) Nothing)
+	)}}
+
+happyReduce_21 = happyReduce 4# 9# happyReduction_21
+happyReduction_21 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut23 happy_x_2 of { happy_var_2 -> 
+	case happyOut30 happy_x_4 of { happy_var_4 -> 
+	happyIn15
+		 (annotate2 happy_var_1 happy_var_4 (Channel (map unLoc happy_var_2) (Just happy_var_4))
+	) `HappyStk` happyRest}}}
+
+happyReduce_22 = happyReduce 4# 9# happyReduction_22
+happyReduction_22 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut22 happy_x_2 of { happy_var_2 -> 
+	case happyOut20 happy_x_4 of { happy_var_4 -> 
+	happyIn15
+		 (annotate2List happy_var_1 happy_var_4 (DataType (unLoc happy_var_2) happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_23 = happySpecReduce_2  9# happyReduction_23
+happyReduction_23 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut23 happy_x_2 of { happy_var_2 -> 
+	happyIn15
+		 (annotate2List happy_var_1 happy_var_2 (External (map unLoc happy_var_2))
+	)}}
+
+happyReduce_24 = happySpecReduce_2  9# happyReduction_24
+happyReduction_24 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut23 happy_x_2 of { happy_var_2 -> 
+	happyIn15
+		 (annotate2List happy_var_1 happy_var_2 (Transparent (map unLoc happy_var_2))
+	)}}
+
+happyReduce_25 = happySpecReduce_2  9# happyReduction_25
+happyReduction_25 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut16 happy_x_2 of { happy_var_2 -> 
+	happyIn15
+		 (annotate happy_var_1 (Assert happy_var_2)
+	)}}
+
+happyReduce_26 = happyReduce 4# 9# happyReduction_26
+happyReduction_26 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut22 happy_x_2 of { happy_var_2 -> 
+	case happyOut30 happy_x_4 of { happy_var_4 -> 
+	happyIn15
+		 (annotate2 happy_var_1 happy_var_4 (NameType (unLoc happy_var_2) happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_27 = happySpecReduce_3  10# happyReduction_27
+happyReduction_27 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut30 happy_x_3 of { happy_var_3 -> 
+	happyIn16
+		 ((Refinement happy_var_1 (getRefinesModel happy_var_2) happy_var_3 [])
+	)}}}
+
+happyReduce_28 = happyReduce 4# 10# happyReduction_28
+happyReduction_28 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut30 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut30 happy_x_3 of { happy_var_3 -> 
+	case happyOut18 happy_x_4 of { happy_var_4 -> 
+	happyIn16
+		 ((Refinement happy_var_1 (getRefinesModel happy_var_2) happy_var_3 [happy_var_4])
+	) `HappyStk` happyRest}}}}
+
+happyReduce_29 = happySpecReduce_2  10# happyReduction_29
+happyReduction_29 happy_x_2
+	happy_x_1
+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
+	case happyOut17 happy_x_2 of { happy_var_2 -> 
+	happyIn16
+		 ((PropertyCheck happy_var_1 happy_var_2 Nothing)
+	)}}
+
+happyReduce_30 = happySpecReduce_3  10# happyReduction_30
+happyReduction_30 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
+	case happyOut17 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	happyIn16
+		 ((PropertyCheck happy_var_1 happy_var_2 (Just (getPropModel happy_var_3)))
+	)}}}
+
+happyReduce_31 = happySpecReduce_1  11# happyReduction_31
+happyReduction_31 happy_x_1
+	 =  happyIn17
+		 (DeadlockFreedom
+	)
+
+happyReduce_32 = happySpecReduce_1  11# happyReduction_32
+happyReduction_32 happy_x_1
+	 =  happyIn17
+		 (LivelockFreedom
+	)
+
+happyReduce_33 = happySpecReduce_1  11# happyReduction_33
+happyReduction_33 happy_x_1
+	 =  happyIn17
+		 (LivelockFreedom
+	)
+
+happyReduce_34 = happySpecReduce_1  11# happyReduction_34
+happyReduction_34 happy_x_1
+	 =  happyIn17
+		 (Deterministic
+	)
+
+happyReduce_35 = happySpecReduce_2  12# happyReduction_35
+happyReduction_35 happy_x_2
+	happy_x_1
+	 =  case happyOut30 happy_x_2 of { happy_var_2 -> 
+	happyIn18
+		 (TauPriority happy_var_2
+	)}
+
+happyReduce_36 = happySpecReduce_3  13# happyReduction_36
+happyReduction_36 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut22 happy_x_1 of { happy_var_1 -> 
+	case happyOut30 happy_x_3 of { happy_var_3 -> 
+	happyIn19
+		 (annotate2 happy_var_1 happy_var_3 (DataTypeClause (unLoc happy_var_1) (Just happy_var_3))
+	)}}
+
+happyReduce_37 = happySpecReduce_1  13# happyReduction_37
+happyReduction_37 happy_x_1
+	 =  case happyOut22 happy_x_1 of { happy_var_1 -> 
+	happyIn19
+		 (annotate happy_var_1 (DataTypeClause (unLoc happy_var_1) Nothing)
+	)}
+
+happyReduce_38 = happySpecReduce_1  14# happyReduction_38
+happyReduction_38 happy_x_1
+	 =  case happyOut21 happy_x_1 of { happy_var_1 -> 
+	happyIn20
+		 (reverse happy_var_1
+	)}
+
+happyReduce_39 = happySpecReduce_1  15# happyReduction_39
+happyReduction_39 happy_x_1
+	 =  case happyOut19 happy_x_1 of { happy_var_1 -> 
+	happyIn21
+		 ([happy_var_1]
+	)}
+
+happyReduce_40 = happySpecReduce_3  15# happyReduction_40
+happyReduction_40 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut21 happy_x_1 of { happy_var_1 -> 
+	case happyOut19 happy_x_3 of { happy_var_3 -> 
+	happyIn21
+		 (happy_var_3:happy_var_1
+	)}}
+
+happyReduce_41 = happySpecReduce_1  16# happyReduction_41
+happyReduction_41 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn22
+		 (liftLoc happy_var_1 (Name (getName happy_var_1))
+	)}
+
+happyReduce_42 = happySpecReduce_1  17# happyReduction_42
+happyReduction_42 happy_x_1
+	 =  case happyOut24 happy_x_1 of { happy_var_1 -> 
+	happyIn23
+		 (reverse happy_var_1
+	)}
+
+happyReduce_43 = happySpecReduce_1  18# happyReduction_43
+happyReduction_43 happy_x_1
+	 =  case happyOut22 happy_x_1 of { happy_var_1 -> 
+	happyIn24
+		 ([happy_var_1]
+	)}
+
+happyReduce_44 = happySpecReduce_3  18# happyReduction_44
+happyReduction_44 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut24 happy_x_1 of { happy_var_1 -> 
+	case happyOut22 happy_x_3 of { happy_var_3 -> 
+	happyIn24
+		 (happy_var_3:happy_var_1
+	)}}
+
+happyReduce_45 = happySpecReduce_1  19# happyReduction_45
+happyReduction_45 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn25
+		 (liftLoc happy_var_1 (UnQual (Name (getName happy_var_1)))
+	)}
+
+happyReduce_46 = happySpecReduce_1  20# happyReduction_46
+happyReduction_46 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn26
+		 (liftLoc happy_var_1 (Int (getInt happy_var_1))
+	)}
+
+happyReduce_47 = happySpecReduce_1  20# happyReduction_47
+happyReduction_47 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn26
+		 (liftLoc happy_var_1 (Bool True)
+	)}
+
+happyReduce_48 = happySpecReduce_1  20# happyReduction_48
+happyReduction_48 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn26
+		 (liftLoc happy_var_1 (Bool False)
+	)}
+
+happyReduce_49 = happySpecReduce_1  21# happyReduction_49
+happyReduction_49 happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	happyIn27
+		 (convPat happy_var_1
+	)}
+
+happyReduce_50 = happyMonadReduce 1# 22# happyReduction_50
+happyReduction_50 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( do
+									modifyTopFileParserState (
+										\ st @ (FileParserState { sequenceStack = (c:cs) }) -> 
+											st { sequenceStack = (c+1):cs })
+									return happy_var_1)}
+	) (\r -> happyReturn (happyIn28 r))
+
+happyReduce_51 = happyMonadReduce 1# 23# happyReduction_51
+happyReduction_51 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( do
+									modifyTopFileParserState (
+										\ st @ (FileParserState { sequenceStack = (c:cs) }) -> 
+											st { sequenceStack = (c-1):cs })
+									return happy_var_1)}
+	) (\r -> happyReturn (happyIn29 r))
+
+happyReduce_52 = happySpecReduce_1  24# happyReduction_52
+happyReduction_52 happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	happyIn30
+		 (checkExp happy_var_1
+	)}
+
+happyReduce_53 = happyMonadReduce 1# 25# happyReduction_53
+happyReduction_53 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut32 happy_x_1 of { happy_var_1 -> 
+	( do
+										t <- freshPType
+										let An l _ e = happy_var_1
+										return $ An l (Nothing, t) e)}
+	) (\r -> happyReturn (happyIn31 r))
+
+happyReduce_54 = happySpecReduce_1  26# happyReduction_54
+happyReduction_54 happy_x_1
+	 =  case happyOut26 happy_x_1 of { happy_var_1 -> 
+	happyIn32
+		 (liftLoc happy_var_1 (Lit (unLoc happy_var_1))
+	)}
+
+happyReduce_55 = happySpecReduce_1  26# happyReduction_55
+happyReduction_55 happy_x_1
+	 =  case happyOut25 happy_x_1 of { happy_var_1 -> 
+	happyIn32
+		 (liftLoc happy_var_1 (Var (unLoc happy_var_1))
+	)}
+
+happyReduce_56 = happySpecReduce_3  26# happyReduction_56
+happyReduction_56 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut42 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (Tuple happy_var_2)
+	)}}}
+
+happyReduce_57 = happySpecReduce_3  26# happyReduction_57
+happyReduction_57 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (DotApp happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_58 = happyReduce 4# 26# happyReduction_58
+happyReduction_58 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut11 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_4 of { happy_var_4 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_4 (Let (checkLetDecls happy_var_2) happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_59 = happyReduce 6# 26# happyReduction_59
+happyReduction_59 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_4 of { happy_var_4 -> 
+	case happyOut31 happy_x_6 of { happy_var_6 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_6 (If happy_var_2 happy_var_4 happy_var_6)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_60 = happySpecReduce_3  26# happyReduction_60
+happyReduction_60 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (Paren happy_var_2)
+	)}}}
+
+happyReduce_61 = happyReduce 4# 26# happyReduction_61
+happyReduction_61 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_4 (App happy_var_1 happy_var_3)
+	) `HappyStk` happyRest}}}
+
+happyReduce_62 = happyReduce 4# 26# happyReduction_62
+happyReduction_62 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut27 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_4 of { happy_var_4 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_4 (Lambda happy_var_2 happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_63 = happySpecReduce_3  26# happyReduction_63
+happyReduction_63 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp Equals happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_64 = happySpecReduce_3  26# happyReduction_64
+happyReduction_64 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp NotEquals happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_65 = happySpecReduce_3  26# happyReduction_65
+happyReduction_65 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp LessThan happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_66 = happySpecReduce_3  26# happyReduction_66
+happyReduction_66 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp GreaterThan happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_67 = happySpecReduce_3  26# happyReduction_67
+happyReduction_67 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp LessThanEq happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_68 = happySpecReduce_3  26# happyReduction_68
+happyReduction_68 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp GreaterThanEq happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_69 = happySpecReduce_2  26# happyReduction_69
+happyReduction_69 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_2 (BooleanUnaryOp Not happy_var_2)
+	)}}
+
+happyReduce_70 = happySpecReduce_3  26# happyReduction_70
+happyReduction_70 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp Or happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_71 = happySpecReduce_3  26# happyReduction_71
+happyReduction_71 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp And happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_72 = happySpecReduce_2  26# happyReduction_72
+happyReduction_72 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_2 (MathsUnaryOp Negate happy_var_2)
+	)}}
+
+happyReduce_73 = happySpecReduce_3  26# happyReduction_73
+happyReduction_73 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (MathsBinaryOp Plus happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_74 = happySpecReduce_3  26# happyReduction_74
+happyReduction_74 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (MathsBinaryOp Minus happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_75 = happySpecReduce_3  26# happyReduction_75
+happyReduction_75 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (MathsBinaryOp Mod happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_76 = happySpecReduce_3  26# happyReduction_76
+happyReduction_76 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (MathsBinaryOp Divide happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_77 = happySpecReduce_3  26# happyReduction_77
+happyReduction_77 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (MathsBinaryOp Times happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_78 = happySpecReduce_1  26# happyReduction_78
+happyReduction_78 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn32
+		 (annotate happy_var_1 (List [])
+	)}
+
+happyReduce_79 = happySpecReduce_3  26# happyReduction_79
+happyReduction_79 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut28 happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_2 of { happy_var_2 -> 
+	case happyOut29 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (List happy_var_2)
+	)}}}
+
+happyReduce_80 = happyReduce 5# 26# happyReduction_80
+happyReduction_80 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut28 happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_2 of { happy_var_2 -> 
+	case happyOut48 happy_x_4 of { happy_var_4 -> 
+	case happyOut29 happy_x_5 of { happy_var_5 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_5 (ListComp happy_var_2 happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_81 = happyReduce 4# 26# happyReduction_81
+happyReduction_81 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut28 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	case happyOut29 happy_x_4 of { happy_var_4 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_4 (ListEnumFrom happy_var_2)
+	) `HappyStk` happyRest}}}
+
+happyReduce_82 = happyReduce 5# 26# happyReduction_82
+happyReduction_82 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut28 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_4 of { happy_var_4 -> 
+	case happyOut29 happy_x_5 of { happy_var_5 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_5 (ListEnumFromTo happy_var_2 happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_83 = happySpecReduce_3  26# happyReduction_83
+happyReduction_83 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (Concat happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_84 = happySpecReduce_2  26# happyReduction_84
+happyReduction_84 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_2 (ListLength happy_var_2)
+	)}}
+
+happyReduce_85 = happySpecReduce_3  26# happyReduction_85
+happyReduction_85 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (Set happy_var_2)
+	)}}}
+
+happyReduce_86 = happyReduce 5# 26# happyReduction_86
+happyReduction_86 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_2 of { happy_var_2 -> 
+	case happyOut48 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { happy_var_5 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_5 (SetComp happy_var_2 happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_87 = happyReduce 4# 26# happyReduction_87
+happyReduction_87 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_4 (SetEnumFrom happy_var_2)
+	) `HappyStk` happyRest}}}
+
+happyReduce_88 = happyReduce 5# 26# happyReduction_88
+happyReduction_88 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { happy_var_5 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_5 (SetEnumFromTo happy_var_2 happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_89 = happySpecReduce_3  26# happyReduction_89
+happyReduction_89 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (SetEnum happy_var_2)
+	)}}}
+
+happyReduce_90 = happyReduce 5# 26# happyReduction_90
+happyReduction_90 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_2 of { happy_var_2 -> 
+	case happyOut48 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { happy_var_5 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_5 (SetEnumComp happy_var_2 happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_91 = happySpecReduce_1  26# happyReduction_91
+happyReduction_91 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn32
+		 (liftLoc happy_var_1 (ExpPatWildCard)
+	)}
+
+happyReduce_92 = happySpecReduce_3  26# happyReduction_92
+happyReduction_92 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (liftLoc happy_var_1 (ExpPatDoublePattern happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_93 = happyReduce 4# 26# happyReduction_93
+happyReduction_93 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut40 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_4 of { happy_var_4 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_4 (Prefix happy_var_1 happy_var_2 happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_94 = happySpecReduce_3  26# happyReduction_94
+happyReduction_94 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (Prefix happy_var_1 [] happy_var_3)
+	)}}
+
+happyReduce_95 = happySpecReduce_3  26# happyReduction_95
+happyReduction_95 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (ExternalChoice happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_96 = happySpecReduce_3  26# happyReduction_96
+happyReduction_96 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (Hiding happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_97 = happySpecReduce_3  26# happyReduction_97
+happyReduction_97 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (InternalChoice happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_98 = happySpecReduce_3  26# happyReduction_98
+happyReduction_98 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (Interleave happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_99 = happyReduce 5# 26# happyReduction_99
+happyReduction_99 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	case happyOut31 happy_x_5 of { happy_var_5 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_5 (GenParallel happy_var_1 happy_var_3 happy_var_5)
+	) `HappyStk` happyRest}}}
+
+happyReduce_100 = happyReduce 7# 26# happyReduction_100
+happyReduction_100 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	case happyOut31 happy_x_5 of { happy_var_5 -> 
+	case happyOut31 happy_x_7 of { happy_var_7 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_7 (AlphaParallel happy_var_1 happy_var_3 happy_var_5 happy_var_7)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_101 = happySpecReduce_3  26# happyReduction_101
+happyReduction_101 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (Interrupt happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_102 = happyReduce 5# 26# happyReduction_102
+happyReduction_102 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	case happyOut31 happy_x_5 of { happy_var_5 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_5 (Exception happy_var_1 happy_var_3 happy_var_5)
+	) `HappyStk` happyRest}}}
+
+happyReduce_103 = happySpecReduce_3  26# happyReduction_103
+happyReduction_103 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (SlidingChoice happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_104 = happySpecReduce_3  26# happyReduction_104
+happyReduction_104 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (SequentialComp happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_105 = happySpecReduce_3  26# happyReduction_105
+happyReduction_105 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_3 (GuardedExp happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_106 = happyReduce 5# 26# happyReduction_106
+happyReduction_106 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut35 happy_x_3 of { happy_var_3 -> 
+	case happyOut46 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { happy_var_5 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_5 (Rename happy_var_1 happy_var_3 happy_var_4)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_107 = happyReduce 6# 26# happyReduction_107
+happyReduction_107 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut38 happy_x_3 of { happy_var_3 -> 
+	case happyOut46 happy_x_4 of { happy_var_4 -> 
+	case happyOut31 happy_x_6 of { happy_var_6 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_6 (LinkParallel happy_var_1 happy_var_3 happy_var_4 happy_var_6)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_108 = happyReduce 4# 26# happyReduction_108
+happyReduction_108 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut48 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_4 of { happy_var_4 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_4 (ReplicatedInterleave happy_var_2 happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_109 = happyReduce 4# 26# happyReduction_109
+happyReduction_109 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut48 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_4 of { happy_var_4 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_4 (ReplicatedExternalChoice happy_var_2 happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_110 = happyReduce 4# 26# happyReduction_110
+happyReduction_110 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut48 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_4 of { happy_var_4 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_4 (ReplicatedInternalChoice happy_var_2 happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_111 = happyReduce 7# 26# happyReduction_111
+happyReduction_111 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut48 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_5 of { happy_var_5 -> 
+	case happyOut31 happy_x_7 of { happy_var_7 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_7 (ReplicatedAlphaParallel happy_var_2 happy_var_5 happy_var_7)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_112 = happyReduce 6# 26# happyReduction_112
+happyReduction_112 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	case happyOut48 happy_x_4 of { happy_var_4 -> 
+	case happyOut31 happy_x_6 of { happy_var_6 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_6 (ReplicatedParallel happy_var_2 happy_var_4 happy_var_6)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_113 = happyReduce 6# 26# happyReduction_113
+happyReduction_113 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut38 happy_x_2 of { happy_var_2 -> 
+	case happyOut48 happy_x_4 of { happy_var_4 -> 
+	case happyOut31 happy_x_6 of { happy_var_6 -> 
+	happyIn32
+		 (annotate2 happy_var_1 happy_var_6 (ReplicatedLinkParallel happy_var_2 happy_var_4 happy_var_6)
+	) `HappyStk` happyRest}}}}
+
+happyReduce_114 = happySpecReduce_2  27# happyReduction_114
+happyReduction_114 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	happyIn33
+		 (annotate2 happy_var_1 happy_var_2 (Input (convPat happy_var_2) Nothing)
+	)}}
+
+happyReduce_115 = happyReduce 4# 27# happyReduction_115
+happyReduction_115 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_4 of { happy_var_4 -> 
+	happyIn33
+		 (annotate2 happy_var_1 happy_var_4 (Input (convPat happy_var_2) (Just (checkExp happy_var_4)))
+	) `HappyStk` happyRest}}}
+
+happyReduce_116 = happySpecReduce_2  27# happyReduction_116
+happyReduction_116 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	happyIn33
+		 (annotate2 happy_var_1 happy_var_2 (NonDetInput (convPat happy_var_2) Nothing)
+	)}}
+
+happyReduce_117 = happyReduce 4# 27# happyReduction_117
+happyReduction_117 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	case happyOut31 happy_x_4 of { happy_var_4 -> 
+	happyIn33
+		 (annotate2 happy_var_1 happy_var_4 (NonDetInput (convPat happy_var_2) (Just (checkExp happy_var_4)))
+	) `HappyStk` happyRest}}}
+
+happyReduce_118 = happySpecReduce_2  27# happyReduction_118
+happyReduction_118 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	happyIn33
+		 (annotate2 happy_var_1 happy_var_2 (Output (checkExp happy_var_2))
+	)}}
+
+happyReduce_119 = happySpecReduce_3  28# happyReduction_119
+happyReduction_119 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
+	case happyOut30 happy_x_3 of { happy_var_3 -> 
+	happyIn34
+		 ((happy_var_1, happy_var_3)
+	)}}
+
+happyReduce_120 = happySpecReduce_1  29# happyReduction_120
+happyReduction_120 happy_x_1
+	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
+	happyIn35
+		 (reverse happy_var_1
+	)}
+
+happyReduce_121 = happySpecReduce_1  30# happyReduction_121
+happyReduction_121 happy_x_1
+	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
+	happyIn36
+		 ([happy_var_1]
+	)}
+
+happyReduce_122 = happySpecReduce_3  30# happyReduction_122
+happyReduction_122 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
+	case happyOut34 happy_x_3 of { happy_var_3 -> 
+	happyIn36
+		 (happy_var_3:happy_var_1
+	)}}
+
+happyReduce_123 = happySpecReduce_3  31# happyReduction_123
+happyReduction_123 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
+	case happyOut30 happy_x_3 of { happy_var_3 -> 
+	happyIn37
+		 ((happy_var_1, happy_var_3)
+	)}}
+
+happyReduce_124 = happySpecReduce_1  32# happyReduction_124
+happyReduction_124 happy_x_1
+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
+	happyIn38
+		 (reverse happy_var_1
+	)}
+
+happyReduce_125 = happySpecReduce_1  33# happyReduction_125
+happyReduction_125 happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	happyIn39
+		 ([happy_var_1]
+	)}
+
+happyReduce_126 = happySpecReduce_3  33# happyReduction_126
+happyReduction_126 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
+	case happyOut37 happy_x_3 of { happy_var_3 -> 
+	happyIn39
+		 (happy_var_3:happy_var_1
+	)}}
+
+happyReduce_127 = happySpecReduce_1  34# happyReduction_127
+happyReduction_127 happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	happyIn40
+		 (reverse happy_var_1
+	)}
+
+happyReduce_128 = happySpecReduce_1  35# happyReduction_128
+happyReduction_128 happy_x_1
+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
+	happyIn41
+		 ([happy_var_1]
+	)}
+
+happyReduce_129 = happySpecReduce_2  35# happyReduction_129
+happyReduction_129 happy_x_2
+	happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	case happyOut33 happy_x_2 of { happy_var_2 -> 
+	happyIn41
+		 (happy_var_2:happy_var_1
+	)}}
+
+happyReduce_130 = happySpecReduce_3  36# happyReduction_130
+happyReduction_130 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut45 happy_x_3 of { happy_var_3 -> 
+	happyIn42
+		 (happy_var_1:(reverse happy_var_3)
+	)}}
+
+happyReduce_131 = happySpecReduce_1  37# happyReduction_131
+happyReduction_131 happy_x_1
+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
+	happyIn43
+		 (reverse happy_var_1
+	)}
+
+happyReduce_132 = happySpecReduce_0  38# happyReduction_132
+happyReduction_132  =  happyIn44
+		 ([]
+	)
+
+happyReduce_133 = happySpecReduce_1  38# happyReduction_133
+happyReduction_133 happy_x_1
+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
+	happyIn44
+		 (reverse happy_var_1
+	)}
+
+happyReduce_134 = happySpecReduce_3  39# happyReduction_134
+happyReduction_134 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn45
+		 (happy_var_3:happy_var_1
+	)}}
+
+happyReduce_135 = happySpecReduce_1  39# happyReduction_135
+happyReduction_135 happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	happyIn45
+		 ([happy_var_1]
+	)}
+
+happyReduce_136 = happySpecReduce_0  40# happyReduction_136
+happyReduction_136  =  happyIn46
+		 ([]
+	)
+
+happyReduce_137 = happySpecReduce_2  40# happyReduction_137
+happyReduction_137 happy_x_2
+	happy_x_1
+	 =  case happyOut48 happy_x_2 of { happy_var_2 -> 
+	happyIn46
+		 (happy_var_2
+	)}
+
+happyReduce_138 = happySpecReduce_3  41# happyReduction_138
+happyReduction_138 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut27 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn47
+		 (annotate2 happy_var_1 happy_var_3 (Generator happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_139 = happySpecReduce_3  41# happyReduction_139
+happyReduction_139 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut27 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_3 of { happy_var_3 -> 
+	happyIn47
+		 (annotate2 happy_var_1 happy_var_3 (Generator happy_var_1 happy_var_3)
+	)}}
+
+happyReduce_140 = happySpecReduce_1  41# happyReduction_140
+happyReduction_140 happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	happyIn47
+		 (annotate happy_var_1 (Qualifier happy_var_1)
+	)}
+
+happyReduce_141 = happySpecReduce_1  42# happyReduction_141
+happyReduction_141 happy_x_1
+	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
+	happyIn48
+		 (reverse happy_var_1
+	)}
+
+happyReduce_142 = happySpecReduce_3  43# happyReduction_142
+happyReduction_142 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
+	case happyOut47 happy_x_3 of { happy_var_3 -> 
+	happyIn49
+		 (happy_var_3:happy_var_1
+	)}}
+
+happyReduce_143 = happySpecReduce_1  43# happyReduction_143
+happyReduction_143 happy_x_1
+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
+	happyIn49
+		 ([happy_var_1]
+	)}
+
+happyNewToken action sts stk
+	= getNextTokenWrapper(\tk -> 
+	let cont i = happyDoAction i tk action sts stk in
+	case tk of {
+	L _ TEOF -> happyDoAction 79# tk action sts stk;
+	L _ (TInteger _) -> cont 1#;
+	L _ (TIdent _) -> cont 2#;
+	L _ TNewLine -> cont 3#;
+	L _ TFalse -> cont 4#;
+	L _ TTrue -> cont 5#;
+	L _ TDefineEqual -> cont 6#;
+	L _ TComma -> cont 7#;
+	L _ TDot -> cont 8#;
+	L _ TQuestionMark -> cont 9#;
+	L _ TDollar -> cont 10#;
+	L _ TExclamationMark -> cont 11#;
+	L _ TDoubleDot -> cont 12#;
+	L _ TColon -> cont 13#;
+	L _ TDrawnFrom -> cont 14#;
+	L _ TTie -> cont 15#;
+	L _ TPipe -> cont 16#;
+	L _ TDoubleAt -> cont 17#;
+	L _ TWildCard -> cont 18#;
+	L _ TIf -> cont 19#;
+	L _ TThen -> cont 20#;
+	L _ TElse -> cont 21#;
+	L _ TLet -> cont 22#;
+	L _ TWithin -> cont 23#;
+	L _ TBackSlash -> cont 24#;
+	L _ TLambdaDot -> cont 25#;
+	L _ TChannel -> cont 26#;
+	L _ TDataType -> cont 27#;
+	L _ TExternal -> cont 28#;
+	L _ TTransparent -> cont 29#;
+	L _ TNameType -> cont 30#;
+	L _ TAssert -> cont 31#;
+	L _ TDeadlockFree -> cont 32#;
+	L _ TLivelockFree -> cont 33#;
+	L _ TDivergenceFree -> cont 34#;
+	L _ TDeterministic -> cont 35#;
+	L _ TTauPriority -> cont 36#;
+	L _ (TRefines _) -> cont 37#;
+	L _ (TModel _) -> cont 38#;
+	L _ TNot -> cont 39#;
+	L _ TAnd -> cont 40#;
+	L _ TOr -> cont 41#;
+	L _ TEq -> cont 42#;
+	L _ TNotEq -> cont 43#;
+	L _ TLtEq -> cont 44#;
+	L _ TGtEq -> cont 45#;
+	L _ TEmptySeq -> cont 46#;
+	L _ TLt -> cont 47#;
+	L _ TGt -> cont 48#;
+	L _ TCloseSeq -> cont 49#;
+	L _ TPlus -> cont 50#;
+	L _ TMinus -> cont 51#;
+	L _ TTimes -> cont 52#;
+	L _ TDivide -> cont 53#;
+	L _ TMod -> cont 54#;
+	L _ TConcat -> cont 55#;
+	L _ THash -> cont 56#;
+	L _ TLParen -> cont 57#;
+	L _ TRParen -> cont 58#;
+	L _ TLBrace -> cont 59#;
+	L _ TRBrace -> cont 60#;
+	L _ TLPipeBrace -> cont 61#;
+	L _ TRPipeBrace -> cont 62#;
+	L _ TLDoubleSqBracket -> cont 63#;
+	L _ TRDoubleSqBracket -> cont 64#;
+	L _ TLPipeSqBracket -> cont 65#;
+	L _ TRPipeSqBracket -> cont 66#;
+	L _ TLSqBracket -> cont 67#;
+	L _ TRSqBracket -> cont 68#;
+	L _ TExtChoice -> cont 69#;
+	L _ TIntChoice -> cont 70#;
+	L _ TInterleave -> cont 71#;
+	L _ TPrefix -> cont 72#;
+	L _ TInterrupt -> cont 73#;
+	L _ TSlidingChoice -> cont 74#;
+	L _ TRException -> cont 75#;
+	L _ TParallel -> cont 76#;
+	L _ TSemiColon -> cont 77#;
+	L _ TGuard -> cont 78#;
+	_ -> happyError' tk
+	})
+
+happyError_ tk = happyError' tk
+
+happyThen :: () => ParseMonad a -> (a -> ParseMonad b) -> ParseMonad b
+happyThen = (>>=)
+happyReturn :: () => a -> ParseMonad a
+happyReturn = (return)
+happyThen1 = happyThen
+happyReturn1 :: () => a -> ParseMonad a
+happyReturn1 = happyReturn
+happyError' :: () => (LToken) -> ParseMonad a
+happyError' tk = parseError tk
+
+parseFile_ = happySomeParser where
+  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut6 x))
+
+parseInteractiveStmt_ = happySomeParser where
+  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut7 x))
+
+parseExpression_ = happySomeParser where
+  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut31 x))
+
+happySeq = happyDontSeq
+
+
+combineDecls :: [PDecl] -> [PDecl]
+combineDecls [] = []
+combineDecls ((An loc1 b (FunBind n ms)):(An loc2 c (FunBind n' ms')):ds) | n == n' = 
+	combineDecls $ (An (combineSpans loc1 loc2) b (FunBind n (ms++ms'))):ds
+combineDecls (d:ds) = d:combineDecls ds
+
+convDecl :: PExp -> PExp -> ParseMonad PDecl
+convDecl (lhs @ (An loc1 b lhsexp)) (rhs @ (An loc2 d _)) = 
+	let
+		span = combineSpans loc1 loc2
+
+		-- REMEMBER: needs to reverse pts
+		getPats :: Exp -> ([[PPat]], Name)
+		getPats (App f args) = 
+				((map convPat args):ps, n)
+			where
+				(ps, n) = getPats (unAnnotate f)
+		getPats (Var (UnQual n)) = ([], n)
+		
+		convFunBind exp = 
+				FunBind	n [An span (dummyAnnotation) (Match (reverse ps) rhs)]
+			where
+				(ps, n) = getPats exp
+
+		convPatBind exp = PatBind (convPat exp) rhs
+	in do
+		symbTable <- freshPSymbolTable
+		case lhsexp of
+			App f args	-> return $ An span (Nothing, symbTable) (convFunBind lhsexp)
+			_			-> return $ An span (Nothing, symbTable) (convPatBind lhs)
+
+-- | Throws an error if a declaration that is not allowed inside a let 
+-- expression is found.
+checkLetDecls :: [PDecl] -> [PDecl]
+checkLetDecls decls = map checkDecl decls
+	where
+		checkDecl :: PDecl -> PDecl
+		checkDecl (anDecl@(An _ _ decl)) =
+			let
+				check (FunBind a b) = anDecl
+				check (PatBind a b) = anDecl
+				check _ = throwSourceError [invalidDeclarationErrorMessage anDecl]
+			in check decl
+
+checkExp :: PExp -> PExp
+checkExp (anExp@(An a b exp)) =
+	let 
+		check :: Exp -> Exp
+		check (App e es) = App (checkExp e) (map checkExp es)
+		check (BooleanBinaryOp op e1 e2) = BooleanBinaryOp op (checkExp e1) (checkExp e2)
+		check (BooleanUnaryOp op e) = BooleanUnaryOp op (checkExp e)
+		check (Concat e1 e2) = Concat (checkExp e1) (checkExp e2)
+		check (DotApp e1 e2) = DotApp (checkExp e1) (checkExp e2)
+		check (If e1 e2 e3) = If (checkExp e1) (checkExp e2) (checkExp e3)
+		check (Lambda p e) = Lambda p (checkExp e)
+		check (Let decls e) = Let decls (checkExp e)
+		check (Lit lit) = Lit lit
+		check (List es) = List (map checkExp es)
+		check (ListComp es stmts) = ListComp (map checkExp es) stmts
+		check (ListEnumFrom e) = ListEnumFrom (checkExp e)
+		check (ListEnumFromTo e1 e2) = ListEnumFromTo (checkExp e1) (checkExp e2)
+		check (ListLength e) = ListLength (checkExp e)
+		check (MathsBinaryOp op e1 e2) = MathsBinaryOp op (checkExp e1) (checkExp e2)
+		check (MathsUnaryOp op e) = MathsUnaryOp op (checkExp e)
+		check (Paren e) = Paren (checkExp e)
+		check (Set es) = Set (map checkExp es)
+		check (SetComp es stmts) = SetComp (map checkExp es) stmts
+		check (SetEnumFrom e) = SetEnumFrom (checkExp e)
+		check (SetEnumFromTo e1 e2) = SetEnumFromTo (checkExp e1) (checkExp e2)
+		check (SetEnum es) = SetEnum (map checkExp es)
+		-- We don't need to check inside stmts as they will have been checked
+		-- upon creation
+		check (SetEnumComp es stmts) = SetEnumComp (map checkExp es) stmts
+		check (Tuple es) = Tuple (map checkExp es)
+		check (Var qname) = Var qname
+
+		check (AlphaParallel e1 e2 e3 e4) = 
+			AlphaParallel (checkExp e1) (checkExp e2) (checkExp e3) (checkExp e4)
+		check (Exception e1 e2 e3) = Exception (checkExp e1) (checkExp e2) (checkExp e3)
+		check (ExternalChoice e1 e2) = ExternalChoice (checkExp e1) (checkExp e2)
+		check (GenParallel e1 e2 e3) = GenParallel (checkExp e1) (checkExp e2) (checkExp e3)
+		check (GuardedExp e1 e2) = GuardedExp (checkExp e1) (checkExp e2)
+		check (Hiding e1 e2) = Hiding (checkExp e1) (checkExp e2)
+		check (InternalChoice e1 e2) = InternalChoice (checkExp e1) (checkExp e2)
+		check (Interrupt e1 e2) = Interrupt (checkExp e1) (checkExp e2)
+		check (Interleave e1 e2) = Interleave (checkExp e1) (checkExp e2)
+		check (LinkParallel e1 ties stmts e2) = 
+			LinkParallel (checkExp e1) ties stmts (checkExp e2)
+		check (Prefix e1 fields e2) = Prefix (checkExp e1) fields (checkExp e2)
+		check (Rename e ties stmts) = Rename (checkExp e) ties stmts
+		check (SequentialComp e1 e2) = SequentialComp (checkExp e1) (checkExp e2)
+		check (SlidingChoice e1 e2) = SlidingChoice (checkExp e1) (checkExp e2)
+
+		check (ReplicatedAlphaParallel stmts e1 e2) = 
+			ReplicatedAlphaParallel stmts (checkExp e1) (checkExp e2)
+		check (ReplicatedInterleave stmts e1) = ReplicatedInterleave stmts (checkExp e1)
+		check (ReplicatedExternalChoice stmts e1) = ReplicatedExternalChoice stmts (checkExp e1)
+		check (ReplicatedInternalChoice stmts e1) = ReplicatedInternalChoice stmts (checkExp e1)
+		check (ReplicatedParallel e1 stmts e2) = 
+			ReplicatedParallel (checkExp e1) stmts (checkExp e2)
+		check (ReplicatedLinkParallel ties stmts e) = 
+			ReplicatedLinkParallel ties stmts (checkExp e)
+		
+		check x = throwSourceError [invalidExpressionErrorMessage anExp]
+	in
+		An a b (check exp)
+
+dotAppToList :: PExp -> [PExp]
+dotAppToList (An a b exp) = 
+	let	
+		list :: Exp -> [PExp]
+		list (DotApp e1 e2) = (dotAppToList e1) ++ (dotAppToList e2)
+		list x = [An a b x]
+	in
+		list exp
+
+convPat :: PExp -> PPat
+convPat (anExp@ (An a b exp)) = 
+	let
+		trans :: Exp -> Pat
+		trans (Concat e1 e2) = PConcat (convPat e1) (convPat e2)
+		trans (DotApp e1 e2) = PDotApp (convPat e1) (convPat e2)
+		trans (List xs) = PList (map convPat xs)
+		trans (Lit x) = PLit x
+		trans (Set xs) = PSet (map convPat xs)
+		trans (Paren x) = PParen (convPat x)
+		trans (Tuple xs) = PTuple (map convPat xs)
+		trans (Var (UnQual x)) = PVar x
+		trans (ExpPatWildCard) = PWildCard
+		trans (ExpPatDoublePattern e1 e2) = 
+			PDoublePattern (convPat e1) (convPat e2)
+		trans x = throwSourceError [invalidPatternErrorMessage anExp]
+	in
+		An a () (trans exp)
+
+-- Helper function to get the contents of tokens
+getInt (L _ (TInteger x)) = x
+getName (L _ (TIdent x)) = x
+getRefinesModel (L _ (TRefines x)) = x
+getPropModel (L _ (TModel x)) = x
+
+class Locatable a where
+	getLoc :: a b -> SrcSpan
+	unLoc :: a b -> b
+	mkLoc :: SrcSpan -> b -> a b
+
+instance Locatable Located where
+	getLoc (L loc _) = loc
+	unLoc (L _ b) = b
+	mkLoc loc b = L loc b
+
+instance Locatable (Annotated a) where
+	getLoc (An loc _ _) = loc
+	unLoc (An _ _ b) = b
+	mkLoc loc b = An loc dummyAnnotation b
+
+annotate :: (Locatable t1, Locatable t2) => t1 a -> b -> t2 b
+annotate t1 b = mkLoc (getLoc t1) b
+
+annotate2 :: 
+	(Locatable t1, Locatable t2, Locatable t3) => t1 a -> t2 b -> c -> t3 c
+annotate2 t1 t2 b = mkLoc (combineSpans (getLoc t1) (getLoc t2)) b
+annotate2List :: 
+	(Locatable t1, Locatable t2, Locatable t3) => t1 a -> [t2 b] -> c -> t3 c
+annotate2List t1 t2 b = annotate2 t1 (last t2) b
+annotate2List' :: 
+	(Locatable t1, Locatable t2, Locatable t3) => [t1 a] -> t2 b -> c -> t3 c
+annotate2List' t1 t2 b = annotate2 (last t1) t2 b
+
+annotateWithSymbolTable 
+	:: Annotated (Maybe SymbolTable, PSymbolTable) a -> ParseMonad (Annotated (Maybe SymbolTable, PSymbolTable) a)
+annotateWithSymbolTable (An l _ a) = do
+	symbTable <- freshPSymbolTable
+	return $ An l (Nothing, symbTable) a
+
+liftLoc :: (Locatable t1, Locatable t2) => t1 a -> b -> t2 b
+liftLoc t1 b = mkLoc (getLoc t1) b
+
+parseError :: LToken -> ParseMonad a
+parseError tok = throwSourceError [parseErrorMessage tok]
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "<built-in>" #-}
+{-# LINE 1 "<command-line>" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
+
+{-# LINE 30 "templates/GenericTemplate.hs" #-}
+
+
+data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList
+
+
+
+
+
+{-# LINE 51 "templates/GenericTemplate.hs" #-}
+
+{-# LINE 61 "templates/GenericTemplate.hs" #-}
+
+{-# LINE 70 "templates/GenericTemplate.hs" #-}
+
+infixr 9 `HappyStk`
+data HappyStk a = HappyStk a (HappyStk a)
+
+-----------------------------------------------------------------------------
+-- starting the parse
+
+happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll
+
+-----------------------------------------------------------------------------
+-- Accepting the parse
+
+-- If the current token is 0#, it means we've just accepted a partial
+-- parse (a %partial parser).  We must ignore the saved token on the top of
+-- the stack in this case.
+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =
+	happyReturn1 ans
+happyAccept j tk st sts (HappyStk ans _) = 
+	(happyTcHack j (happyTcHack st)) (happyReturn1 ans)
+
+-----------------------------------------------------------------------------
+-- Arrays only: do the next action
+
+
+
+happyDoAction i tk st
+	= {- nothing -}
+
+
+	  case action of
+		0#		  -> {- nothing -}
+				     happyFail i tk st
+		-1# 	  -> {- nothing -}
+				     happyAccept i tk st
+		n | (n Happy_GHC_Exts.<# (0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}
+
+				     (happyReduceArr Happy_Data_Array.! rule) i tk st
+				     where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))
+		n		  -> {- nothing -}
+
+
+				     happyShift new_state i tk st
+				     where (new_state) = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))
+   where (off)    = indexShortOffAddr happyActOffsets st
+         (off_i)  = (off Happy_GHC_Exts.+# i)
+	 check  = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#))
+			then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==#  i)
+			else False
+         (action)
+          | check     = indexShortOffAddr happyTable off_i
+          | otherwise = indexShortOffAddr happyDefActions st
+
+{-# LINE 130 "templates/GenericTemplate.hs" #-}
+
+
+indexShortOffAddr (HappyA# arr) off =
+	Happy_GHC_Exts.narrow16Int# i
+  where
+        i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)
+        high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))
+        low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))
+        off' = off Happy_GHC_Exts.*# 2#
+
+
+
+
+
+data HappyAddr = HappyA# Happy_GHC_Exts.Addr#
+
+
+
+
+-----------------------------------------------------------------------------
+-- HappyState data type (not arrays)
+
+{-# LINE 163 "templates/GenericTemplate.hs" #-}
+
+-----------------------------------------------------------------------------
+-- Shifting a token
+
+happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
+     let (i) = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
+--     trace "shifting the error token" $
+     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)
+
+happyShift new_state i tk st sts stk =
+     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)
+
+-- happyReduce is specialised for the common cases.
+
+happySpecReduce_0 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_0 nt fn j tk st@((action)) sts stk
+     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)
+
+happySpecReduce_1 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')
+     = let r = fn v1 in
+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
+
+happySpecReduce_2 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')
+     = let r = fn v1 v2 in
+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
+
+happySpecReduce_3 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')
+     = let r = fn v1 v2 v3 in
+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
+
+happyReduce k i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happyReduce k nt fn j tk st sts stk
+     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of
+	 sts1@((HappyCons (st1@(action)) (_))) ->
+        	let r = fn stk in  -- it doesn't hurt to always seq here...
+       		happyDoSeq r (happyGoto nt j tk st1 sts1 r)
+
+happyMonadReduce k nt fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happyMonadReduce k nt fn j tk st sts stk =
+        happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))
+       where (sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))
+             drop_stk = happyDropStk k stk
+
+happyMonad2Reduce k nt fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happyMonad2Reduce k nt fn j tk st sts stk =
+       happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))
+       where (sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))
+             drop_stk = happyDropStk k stk
+
+             (off) = indexShortOffAddr happyGotoOffsets st1
+             (off_i) = (off Happy_GHC_Exts.+# nt)
+             (new_state) = indexShortOffAddr happyTable off_i
+
+
+
+
+happyDrop 0# l = l
+happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t
+
+happyDropStk 0# l = l
+happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs
+
+-----------------------------------------------------------------------------
+-- Moving to a new state after a reduction
+
+
+happyGoto nt j tk st = 
+   {- nothing -}
+   happyDoAction j tk new_state
+   where (off) = indexShortOffAddr happyGotoOffsets st
+         (off_i) = (off Happy_GHC_Exts.+# nt)
+         (new_state) = indexShortOffAddr happyTable off_i
+
+
+
+
+-----------------------------------------------------------------------------
+-- Error recovery (0# is the error token)
+
+-- parse error if we are in recovery and we fail again
+happyFail  0# tk old_st _ stk =
+--	trace "failing" $ 
+    	happyError_ tk
+
+{-  We don't need state discarding for our restricted implementation of
+    "error".  In fact, it can cause some bogus parses, so I've disabled it
+    for now --SDM
+
+-- discard a state
+happyFail  0# tk old_st (HappyCons ((action)) (sts)) 
+						(saved_tok `HappyStk` _ `HappyStk` stk) =
+--	trace ("discarding state, depth " ++ show (length stk))  $
+	happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))
+-}
+
+-- Enter error recovery: generate an error token,
+--                       save the old token and carry on.
+happyFail  i tk (action) sts stk =
+--      trace "entering error recovery" $
+	happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)
+
+-- Internal happy errors:
+
+notHappyAtAll :: a
+notHappyAtAll = error "Internal Happy error\n"
+
+-----------------------------------------------------------------------------
+-- Hack to get the typechecker to accept our action functions
+
+
+happyTcHack :: Happy_GHC_Exts.Int# -> a -> a
+happyTcHack x y = y
+{-# INLINE happyTcHack #-}
+
+
+-----------------------------------------------------------------------------
+-- Seq-ing.  If the --strict flag is given, then Happy emits 
+--	happySeq = happyDoSeq
+-- otherwise it emits
+-- 	happySeq = happyDontSeq
+
+happyDoSeq, happyDontSeq :: a -> b -> b
+happyDoSeq   a b = a `seq` b
+happyDontSeq a b = b
+
+-----------------------------------------------------------------------------
+-- Don't inline any functions from the template.  GHC has a nasty habit
+-- of deciding to inline happyGoto everywhere, which increases the size of
+-- the generated parser quite a bit.
+
+
+{-# NOINLINE happyDoAction #-}
+{-# NOINLINE happyTable #-}
+{-# NOINLINE happyCheck #-}
+{-# NOINLINE happyActOffsets #-}
+{-# NOINLINE happyGotoOffsets #-}
+{-# NOINLINE happyDefActions #-}
+
+{-# NOINLINE happyShift #-}
+{-# NOINLINE happySpecReduce_0 #-}
+{-# NOINLINE happySpecReduce_1 #-}
+{-# NOINLINE happySpecReduce_2 #-}
+{-# NOINLINE happySpecReduce_3 #-}
+{-# NOINLINE happyReduce #-}
+{-# NOINLINE happyMonadReduce #-}
+{-# NOINLINE happyGoto #-}
+{-# NOINLINE happyFail #-}
+
+-- end of Happy Template.
diff --git a/src/CSPM/PrettyPrinter.hs b/src/CSPM/PrettyPrinter.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/PrettyPrinter.hs
@@ -0,0 +1,287 @@
+{-# LANGUAGE FlexibleInstances #-}
+module CSPM.PrettyPrinter (
+    prettyPrint, prettyPrintMatch,
+)
+where
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import Util.Annotated
+import Util.Exception
+import Util.PrettyPrint
+    
+instance PrettyPrintable Name where
+    prettyPrint (Name s) = text s
+instance PrettyPrintable QualifiedName where
+    prettyPrint (UnQual name) = prettyPrint name
+
+instance PrettyPrintable [Module] where
+    prettyPrint = vcat . map prettyPrint
+
+instance PrettyPrintable Module where
+    prettyPrint (GlobalModule decls) = 
+        vcat (punctuate (char '\n') (map prettyPrint decls))
+
+instance PrettyPrintable InteractiveStmt where
+    prettyPrint (Evaluate e) = prettyPrint e
+    prettyPrint (Bind decl) = 
+        text "let" <+> prettyPrint decl
+    
+prettyPrintMatch :: Name -> AnMatch -> Doc
+prettyPrintMatch n (An _ _ (Match groups exp)) = 
+        hang ((prettyPrint n <> hcat (map ppGroup groups))
+             <+> equals)
+            tabWidth (prettyPrint exp)
+    where
+        ppGroup ps = parens (list (map prettyPrint ps))
+
+instance PrettyPrintable Decl where
+    prettyPrint (FunBind n ms) =
+            vcat (map (prettyPrintMatch n) ms)
+    prettyPrint (PatBind pat exp) =
+        hang (prettyPrint pat <+> equals)
+            tabWidth (prettyPrint exp)
+    prettyPrint (Channel ns Nothing) =
+        text "channel" <+> list (map prettyPrint ns)
+    prettyPrint (Channel ns (Just e)) =
+        text "channel" <+> list (map prettyPrint ns)
+        <+> text ":" <+> prettyPrint e
+    prettyPrint (External ns) =
+        text "external" <+> list (map prettyPrint ns)
+    prettyPrint (Transparent ns) =
+        text "transparent" <+> list (map prettyPrint ns)
+    prettyPrint (DataType n dtcs) =
+        text "datatype" <+> prettyPrint n <+> text "=" 
+            <+> fsep (punctuate (text "|") (map prettyPrint dtcs))
+    prettyPrint (Assert a) =
+        text "assert" <+> prettyPrint a
+        
+instance PrettyPrintable Assertion where
+    prettyPrint (Refinement e1 m e2 opts) =
+        hang (hang (prettyPrint e1) tabWidth
+                (char '[' <> prettyPrint m <> char '=' <+> prettyPrint e2))
+            tabWidth (fcat (map prettyPrint opts))
+    prettyPrint (PropertyCheck e1 prop Nothing) =
+        hang (prettyPrint e1) tabWidth
+            (text ":[" <> prettyPrint prop <> text "]")
+    prettyPrint (PropertyCheck e1 prop (Just m)) =
+        hang (prettyPrint e1) tabWidth
+            (colon <> brackets (prettyPrint prop <+> brackets (prettyPrint m)))
+instance PrettyPrintable Model where
+    prettyPrint Traces = text "T"
+    prettyPrint Failures = text "F"
+    prettyPrint FailuresDivergences = text "FD"
+    prettyPrint Refusals = text "R"
+    prettyPrint RefusalsDivergences = text "RD"
+    prettyPrint Revivals = text "V"
+    prettyPrint RevivalsDivergences = text "VD"
+    
+instance PrettyPrintable ModelOption where
+    prettyPrint (TauPriority e) = 
+        text ":[tau priority over]:" <+> prettyPrint e
+
+instance PrettyPrintable SemanticProperty where
+    prettyPrint DeadlockFreedom = text "deadlock free"
+    prettyPrint Deterministic = text "deterministic"
+    prettyPrint LivelockFreedom = text "divergence free"
+
+instance PrettyPrintable DataTypeClause where
+    prettyPrint (DataTypeClause n Nothing) = prettyPrint n
+    prettyPrint (DataTypeClause n (Just e)) = 
+        prettyPrint n <> text "." <> prettyPrint e
+
+instance PrettyPrintable Pat where
+    prettyPrint (PConcat e1 e2) =
+        prettyPrint e1 <+> text "^" <+> prettyPrint e2
+    prettyPrint (PDotApp e1 e2) =
+        prettyPrint e1 <> text "." <> prettyPrint e2
+    prettyPrint (PDoublePattern e1 e2) =
+        prettyPrint e1 <+> text "@@" <+> prettyPrint e2
+    prettyPrint (PList patterns) = 
+        angles (list (map prettyPrint patterns))
+    prettyPrint (PLit lit) = prettyPrint lit
+    prettyPrint (PSet patterns) = 
+        braces (list (map prettyPrint patterns))
+    prettyPrint (PParen pattern) =
+        parens (prettyPrint pattern)
+    prettyPrint (PTuple patterns) = 
+        parens (list (map prettyPrint patterns))
+    prettyPrint (PVar name) = prettyPrint name
+    prettyPrint (PWildCard) = char '_'
+    
+    prettyPrint (PCompList _ _ p) = prettyPrint p
+    prettyPrint (PCompDot _ p) = prettyPrint p
+    
+instance PrettyPrintable BinaryBooleanOp where
+    prettyPrint And = text "and"
+    prettyPrint Or = text "or"
+    prettyPrint Equals = text "=="
+    prettyPrint NotEquals = text "!="
+    prettyPrint GreaterThan = text ">"
+    prettyPrint LessThan = text "<"
+    prettyPrint LessThanEq = text "<="
+    prettyPrint GreaterThanEq = text ">="
+
+instance PrettyPrintable UnaryBooleanOp where
+    prettyPrint Not = text "not"
+
+instance PrettyPrintable BinaryMathsOp where
+    prettyPrint Divide = text "/"
+    prettyPrint Minus = text "-"
+    prettyPrint Mod = text "%"
+    prettyPrint Plus = text "+"
+    prettyPrint Times = text "*"
+instance PrettyPrintable UnaryMathsOp where
+    -- We include an extra space here to avoid { -1} being pretty printed as
+    -- {-1} which would start a block comment
+    prettyPrint Negate = text " -"
+
+instance PrettyPrintable Exp where  
+    prettyPrint (App e1 args) = 
+        prettyPrint e1 <> parens (list (map prettyPrint args))
+    prettyPrint (BooleanBinaryOp op e1 e2) = 
+        ppBinOp (prettyPrint e1) (prettyPrint op) (prettyPrint e2)
+    prettyPrint (BooleanUnaryOp op e1) = prettyPrint op <+> prettyPrint e1
+    prettyPrint (Concat e1 e2) =
+        ppBinOp' (prettyPrint e1) (char '^') (prettyPrint e2)
+    prettyPrint (DotApp e1 e2) =
+        ppBinOp' (prettyPrint e1) (char '.') (prettyPrint e2)
+    prettyPrint (If e1 e2 e3) = 
+        sep [hang (text "if" <+> prettyPrint e1 <+> text "then") 
+                tabWidth (prettyPrint e2),
+            text "else" <+> prettyPrint e3]
+    prettyPrint (Lambda pat exp) = 
+        text "\\" <> prettyPrint pat
+        <+> text "@"
+        <+> prettyPrint exp
+    prettyPrint (Let decls exp) = 
+        sep [hang (text "let") tabWidth (vcat (map prettyPrint decls)),
+            hang (text "within") tabWidth (prettyPrint exp)]
+    prettyPrint (ListLength exp) = char '#' <> prettyPrint exp
+    prettyPrint (List exps) = angles (list (map prettyPrint exps))
+    prettyPrint (ListComp es stmts) = angles (ppComp es stmts)
+    prettyPrint (ListEnumFrom lb) = angles (prettyPrint lb <> text "..")
+    prettyPrint (ListEnumFromTo lb ub) = 
+        angles (prettyPrint lb <> text ".." <> prettyPrint ub)
+    prettyPrint (Lit lit) = prettyPrint lit
+    prettyPrint (MathsUnaryOp op e1) = prettyPrint op <> prettyPrint e1
+    prettyPrint (MathsBinaryOp op e1 e2) =
+        ppBinOp' (prettyPrint e1) (prettyPrint op) (prettyPrint e2)
+    prettyPrint (Paren e) = parens (prettyPrint e)
+    prettyPrint (Set exps) = braces (list (map prettyPrint exps))
+    prettyPrint (SetComp es stmts) = braces (ppComp es stmts)
+    prettyPrint (SetEnum es) = (braces . bars . list . map prettyPrint) es
+    prettyPrint (SetEnumComp es stmts) = braces (bars (ppComp es stmts))
+    prettyPrint (SetEnumFrom lb) = braces (prettyPrint lb <> text "..")
+    prettyPrint (SetEnumFromTo lb ub) =
+        braces (prettyPrint lb <> text ".." <> prettyPrint ub)
+    prettyPrint (Tuple exps) = parens (list (map prettyPrint exps))
+    prettyPrint (Var qname) = prettyPrint qname
+        
+    -- Processes
+    prettyPrint(AlphaParallel e1 a1 a2 e2) =
+        ppBinOp (prettyPrint e1) (brackets (prettyPrint a1 <> text "||"
+                                    <> prettyPrint a2)) (prettyPrint e2)
+    prettyPrint (Exception e1 a e2) =
+        ppBinOp (prettyPrint e1) (text "[|" <+> prettyPrint a <+> text "|>") 
+                (prettyPrint e2)
+    prettyPrint (ExternalChoice e1 e2) = 
+        ppBinOp (prettyPrint e1) (text "[]") (prettyPrint e2)
+    prettyPrint (GenParallel e1 alpha e2) = 
+        ppBinOp (prettyPrint e1) (brackets (bars (prettyPrint alpha))) 
+                (prettyPrint e2)
+    prettyPrint (GuardedExp e1 e2) = 
+        ppBinOp (prettyPrint e1) (char '&') (prettyPrint e2)
+    prettyPrint (Hiding e1 e2) = 
+        ppBinOp (prettyPrint e1) (char '\\') (prettyPrint e2)
+    prettyPrint (InternalChoice e1 e2) =
+        ppBinOp (prettyPrint e1) (text "|~|") (prettyPrint e2)
+    prettyPrint (Interrupt e1 e2) =
+        ppBinOp (prettyPrint e1) (text "/\\") (prettyPrint e2)
+    prettyPrint (Interleave e1 e2) =
+        ppBinOp (prettyPrint e1) (text "|||") (prettyPrint e2)
+    prettyPrint (LinkParallel e1 ties stmts e2) =
+        ppBinOp (prettyPrint e1)
+                (ppComp' (map ppTie ties) stmts)
+                (prettyPrint e2)
+    prettyPrint (Prefix ev fs e) =
+        ppBinOp (prettyPrint ev <> hcat (map prettyPrint fs)) (text "->")
+                (prettyPrint e)
+    prettyPrint (Rename e ties stmts) =
+        prettyPrint e <+> brackets (brackets (
+                ppComp' (map ppRename ties) stmts
+            ))
+    prettyPrint (SequentialComp e1 e2) =
+        ppBinOp (prettyPrint e1) (char ';') (prettyPrint e2)
+    prettyPrint (SlidingChoice e1 e2) =
+        ppBinOp (prettyPrint e1) (text "[>") (prettyPrint e2)
+
+    prettyPrint (ReplicatedAlphaParallel stmts alpha e) = 
+        ppRepOp (text "||") stmts 
+                (brackets (prettyPrint alpha) <+> prettyPrint e)
+    prettyPrint (ReplicatedExternalChoice stmts e) = 
+        ppRepOp (text "[]") stmts (prettyPrint e)
+    prettyPrint (ReplicatedInterleave stmts e) = 
+        ppRepOp (text "|||") stmts (prettyPrint e)
+    prettyPrint (ReplicatedInternalChoice stmts e) = 
+        ppRepOp (text "|~|") stmts (prettyPrint e)
+    prettyPrint (ReplicatedLinkParallel ties stmts e) =
+        ppRepOp (brackets (list (map ppTie ties))) stmts (prettyPrint e)
+    prettyPrint (ReplicatedParallel alpha stmts e) =
+        ppRepOp (brackets (bars (prettyPrint alpha))) stmts (prettyPrint e)
+    
+    -- Patterns - this is only used when emitting parser errors about invalid
+    -- expressions.
+    prettyPrint (ExpPatWildCard) = char '_'
+    prettyPrint (ExpPatDoublePattern e1 e2) = 
+        prettyPrint e1 <+> text "@@" <+> prettyPrint e2
+
+instance PrettyPrintable Field where
+    prettyPrint (Output exp) = 
+        char '!' <> prettyPrint exp
+    prettyPrint (Input pat Nothing) =
+        char '?' <> prettyPrint pat
+    prettyPrint (Input pat (Just exp)) =
+        char '?' <> prettyPrint pat <+> colon <+> prettyPrint exp
+    prettyPrint (NonDetInput pat Nothing) = 
+        char '$' <> prettyPrint pat
+    prettyPrint (NonDetInput pat (Just exp)) =
+        char '$' <> prettyPrint pat <+> colon <+> prettyPrint exp
+
+instance PrettyPrintable Stmt where
+    prettyPrint (Generator pat exp) = 
+        sep [prettyPrint pat, text "<-" <+> prettyPrint exp]
+    prettyPrint (Qualifier exp) = 
+        prettyPrint exp
+
+instance PrettyPrintable Literal where
+    prettyPrint (Int n) = integer n
+    prettyPrint (Bool True) = text "true"
+    prettyPrint (Bool False) = text "false"
+
+ppTie :: (AnExp, AnExp) -> Doc
+ppTie (l, r) = prettyPrint l <+> text "<->" <+> prettyPrint r
+
+ppRename :: (AnExp, AnExp) -> Doc
+ppRename (l, r) = prettyPrint l <+> text "<-" <+> prettyPrint r
+
+ppRepOp :: Doc -> [AnStmt] -> Doc -> Doc
+ppRepOp op stmts exp =
+    hang op tabWidth (
+        hang (list (map prettyPrint stmts) <+> char '@')
+            tabWidth exp)
+
+ppComp :: [AnExp] -> [AnStmt] -> Doc
+ppComp es stmts = ppComp' (map prettyPrint es) stmts 
+        
+ppComp' :: [Doc] -> [AnStmt] -> Doc
+ppComp' es stmts = 
+    hang (list es) tabWidth
+        (if stmts /= [] then char '|' <+> list (map prettyPrint stmts)
+        else empty)
+        
+ppBinOp :: Doc -> Doc -> Doc -> Doc
+ppBinOp arg1 op arg2 = sep [arg1, op <+> arg2]
+
+ppBinOp' :: Doc -> Doc -> Doc -> Doc
+ppBinOp' arg1 op arg2 = cat [arg1, op <> arg2]
diff --git a/src/CSPM/TypeChecker.hs b/src/CSPM/TypeChecker.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE FlexibleContexts #-}
+module CSPM.TypeChecker (
+    typeCheck, typeCheckExpect,
+    typeOfExp, dependenciesOfExp,
+    
+    initTypeChecker,
+    TypeCheckMonad, TypeInferenceState,
+    runTypeChecker, runFromStateToState,
+) where
+
+import Control.Monad.Trans
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.DataStructures.Types
+import CSPM.TypeChecker.BuiltInFunctions
+import qualified CSPM.TypeChecker.Common as TC
+import CSPM.TypeChecker.Compressor
+import CSPM.TypeChecker.Dependencies
+import CSPM.TypeChecker.Environment
+import CSPM.TypeChecker.Expr
+import CSPM.TypeChecker.InteractiveStmt
+import CSPM.TypeChecker.Module
+import CSPM.TypeChecker.Monad
+import CSPM.TypeChecker.Unification
+import Util.Annotated
+import Util.Exception
+
+runFromStateToState :: TypeInferenceState -> TypeCheckMonad a -> 
+            IO (a, [ErrorMessage], TypeInferenceState)
+runFromStateToState st prog = runTypeChecker st $ do
+    r <- prog
+    ws <- getWarnings
+    resetWarnings
+    s <- getState
+    return (r, ws, s)
+
+initTypeChecker :: IO TypeInferenceState
+initTypeChecker = runTypeChecker newTypeInferenceState $ do
+    injectBuiltInFunctions
+    -- Add a blank level in the environment to allow built in functions
+    -- to be overriden.
+    local [] getState
+
+typeCheckExpect :: (Compressable a, TC.TypeCheckable a Type) => Type -> a -> TypeCheckMonad a
+typeCheckExpect t exp = TC.typeCheckExpect exp t >> mcompress exp
+
+typeCheck :: (Compressable a, TC.TypeCheckable a b) => a -> TypeCheckMonad a
+typeCheck exp = TC.typeCheck exp >> mcompress exp
+
+typeOfExp :: PExp -> TypeCheckMonad Type
+typeOfExp exp = do
+    -- See if has been type checked, if so, return type,
+    -- else type check
+    mt <- liftIO $ readPType (snd (annotation exp))
+    case mt of 
+        Just t -> evaluateDots t >>= compress
+        Nothing -> typeCheck exp >> typeOfExp exp
+
+-- | Returns the list of names that this expression depends on
+dependenciesOfExp :: TCExp -> TypeCheckMonad [Name]
+dependenciesOfExp exp = dependencies exp
diff --git a/src/CSPM/TypeChecker/BuiltInFunctions.hs b/src/CSPM/TypeChecker/BuiltInFunctions.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/BuiltInFunctions.hs
@@ -0,0 +1,132 @@
+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
+module CSPM.TypeChecker.BuiltInFunctions(
+    injectBuiltInFunctions, externalFunctions, transparentFunctions,
+    builtInNames, replacementForDeprecatedName,
+) where
+
+import CSPM.DataStructures.Types
+import CSPM.TypeChecker.Monad
+
+import CSPM.DataStructures.Names
+import Util.Exception
+import Util.PartialFunctions
+
+sets :: [Type -> (String, [Type], Type)]
+sets = 
+    let
+        cspm_union fv = ("union", [TSet fv, TSet fv], TSet fv)
+        cspm_inter fv = ("inter", [TSet fv, TSet fv], TSet fv)
+        cspm_diff fv = ("diff", [TSet fv, TSet fv], TSet fv)
+        cspm_Union fv = ("Union", [TSet (TSet fv)], TSet fv)
+        cspm_Inter fv = ("Inter", [TSet (TSet fv)], TSet fv)
+        cspm_member fv = ("member", [fv, TSet fv], TBool)
+        cspm_card fv = ("card", [TSet fv], TInt)
+        cspm_empty fv = ("empty", [TSet fv], TBool)
+        cspm_set fv = ("set", [TSeq fv], TSet fv)
+        cspm_Set fv = ("Set", [TSet fv], TSet (TSet fv))
+        cspm_Seq fv = ("Seq", [TSet fv], TSet (TSeq fv))
+        cspm_seq fv = ("seq", [TSet fv], TSeq fv)
+    in
+        [cspm_union, cspm_inter, cspm_diff, cspm_Union, cspm_Inter,
+                cspm_member, cspm_card, cspm_empty, cspm_set, cspm_Set,
+                cspm_Seq, cspm_seq]
+seqs :: [Type -> (String, [Type], Type)]
+seqs = 
+    let
+        cspm_length fv = ("length", [TSeq fv], TInt)
+        cspm_null fv = ("null", [TSeq fv], TBool)
+        cspm_head fv = ("head", [TSeq fv], fv)
+        cspm_tail fv = ("tail", [TSeq fv], TSeq fv)
+        cspm_concat fv = ("concat", [TSeq (TSeq fv)], TSeq fv)
+        cspm_elem fv = ("elem", [fv, TSeq fv], TBool)       
+    in
+        [cspm_length, cspm_null, cspm_head, cspm_tail, cspm_concat,
+                cspm_elem]
+
+builtInProcs :: [(String, Type)]
+builtInProcs =
+    let
+        cspm_STOP = ("STOP", TProc)
+        cspm_SKIP = ("SKIP", TProc)
+        cspm_CHAOS = ("CHAOS", TFunction [TSet TEvent] TProc)
+        cspm_prioritise = ("prioritise", TFunction [TProc, TSeq (TSet TEvent)] TProc)
+    in
+        [cspm_STOP, cspm_SKIP, cspm_CHAOS, cspm_prioritise]
+
+typeConstructors :: [(String, Type)]
+typeConstructors =
+    let
+        cspm_Int = ("Int", TSet TInt)
+        cspm_Bool = ("Bool", TSet TBool)
+        cspm_Proc = ("Proc", TSet TProc)
+        cspm_Events = ("Events", TSet TEvent)
+        cspm_true = ("true", TBool)
+        cspm_false = ("false", TBool)
+        cspm_True = ("True", TBool)
+        cspm_False = ("False", TBool)        
+    in  
+        [cspm_Int, cspm_Bool, cspm_Proc, cspm_Events, cspm_true, 
+        cspm_false, cspm_True, cspm_False]
+
+injectBuiltInFunctions :: TypeCheckMonad ()
+injectBuiltInFunctions =
+    let
+        mkFuncType cs func = 
+            do
+                fv @ (TVar (TypeVarRef tv _ _)) <- freshTypeVarWithConstraints cs
+                let (n, args, ret) = func fv
+                let t = ForAll [(tv, cs)] (TFunction args ret)
+                setType (Name n) t
+        mkUnsafeFuncType s = do
+            fv1 @ (TVar (TypeVarRef tv1 _ _)) <- freshTypeVarWithConstraints []
+            fv2 @ (TVar (TypeVarRef tv2 _ _)) <- freshTypeVarWithConstraints []
+            setType (Name s) (ForAll [(tv1, []), (tv2, [])] (TFunction [fv1] fv2))
+        mkPatternType func =
+            do 
+                let (n, t) = func
+                setType (Name n) (ForAll [] t)
+    in do
+        mapM_ (mkFuncType []) seqs
+        mapM_ (mkFuncType [Eq]) sets
+        mapM_ mkPatternType typeConstructors
+        mapM_ mkPatternType builtInProcs
+        mapM_ mkUnsafeFuncType unsafeFunctionNames
+        mapM_ (markAsDeprecated . Name) deprecatedNames
+        mapM_ (markTypeAsUnsafe . Name) unsafeFunctionNames
+
+externalFunctions :: PartialFunction String Type
+externalFunctions = []
+
+transparentFunctions :: PartialFunction String Type
+transparentFunctions = [
+    ("diamond", TFunction [TProc] TProc),
+    ("normal", TFunction [TProc] TProc),
+    ("sbisim", TFunction [TProc] TProc),
+    ("tau_loop_factor", TFunction [TProc] TProc),
+    ("model_compress", TFunction [TProc] TProc),
+    ("explicate", TFunction [TProc] TProc),
+    ("wbisim", TFunction [TProc] TProc),
+    ("chase", TFunction [TProc] TProc)
+    ]
+
+builtInNames :: [String]
+builtInNames = 
+        map fst externalFunctions
+        ++ map fst transparentFunctions
+        ++ map fst typeConstructors
+        ++ map extract seqs
+        ++ map extract sets
+        ++ unsafeFunctionNames
+    where
+        extract f = let (a,_,_) = f (panic "Dummy type var evaluated") in a
+
+unsafeFunctionNames :: [String]
+unsafeFunctionNames = ["productions", "extensions"]
+
+deprecatedNames :: [String]
+deprecatedNames = ["True", "False"]
+
+replacementForDeprecatedName :: Name -> Maybe Name
+replacementForDeprecatedName (Name "True") = Just $ Name $ "true"
+replacementForDeprecatedName (Name "False") = Just $ Name $ "false"
+replacementForDeprecatedName _ = Nothing
diff --git a/src/CSPM/TypeChecker/Common.hs b/src/CSPM/TypeChecker/Common.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/Common.hs
@@ -0,0 +1,67 @@
+{-# LANGUAGE FlexibleContexts, MultiParamTypeClasses, FunctionalDependencies #-}
+module CSPM.TypeChecker.Common where
+
+import CSPM.DataStructures.Syntax
+import CSPM.DataStructures.Types
+import CSPM.TypeChecker.BuiltInFunctions
+import CSPM.TypeChecker.Exceptions
+import CSPM.TypeChecker.Monad
+import CSPM.TypeChecker.Unification
+import Util.PrettyPrint
+
+-- a -> b <=> We can't have two instances that match on a but differ on b
+class TypeCheckable a b | a -> b where
+    typeCheck :: a -> TypeCheckMonad b
+    typeCheck a = 
+        case errorContext a of
+            Just c -> addErrorContext c (typeCheck' a)
+            Nothing -> typeCheck' a
+    
+    typeCheckExpect :: a -> Type -> TypeCheckMonad b
+    typeCheckExpect _ _ = panic "typeCheckExpect not supported"
+    
+    typeCheck' :: a -> TypeCheckMonad b
+    errorContext :: a -> Maybe ErrorContext
+
+instance TypeCheckable Literal Type where
+    errorContext a = Nothing
+    typeCheck' (Int n) = return TInt
+    typeCheck' (Bool b) = return TBool
+    
+ensureAreEqual :: TypeCheckable a Type => [a] -> TypeCheckMonad Type
+ensureAreEqual [] = freshTypeVar
+ensureAreEqual (e:es) = do
+    t <- typeCheck e
+    mapM (\e -> typeCheckExpect e t) es
+    return t
+
+ensureIsList :: TypeCheckable a b => a -> TypeCheckMonad b
+ensureIsList e = do
+    fv <- freshTypeVar
+    typeCheckExpect e (TSeq fv)
+
+ensureIsSet :: TypeCheckable a b => a -> TypeCheckMonad b
+ensureIsSet e = do
+    fv <- freshTypeVarWithConstraints [Eq]
+    typeCheckExpect e (TSet fv)
+
+ensureIsBool :: TypeCheckable a b => a -> TypeCheckMonad b
+ensureIsBool e = typeCheckExpect e TBool
+
+ensureIsInt :: TypeCheckable a b => a -> TypeCheckMonad b
+ensureIsInt e = typeCheckExpect e TInt
+
+ensureIsChannel :: TypeCheckable a b => a -> TypeCheckMonad b
+ensureIsChannel e = typeCheckExpect e TEventable
+
+ensureIsEvent :: TypeCheckable a b => a -> TypeCheckMonad b
+ensureIsEvent e = typeCheckExpect e TEvent
+
+ensureIsProc :: TypeCheckable a b => a -> TypeCheckMonad b
+ensureIsProc e = typeCheckExpect e TProc
+
+ensureHasConstraint :: Constraint -> Type -> TypeCheckMonad Type
+ensureHasConstraint c t = do
+    fv1 <- freshTypeVarWithConstraints [c]
+    unify fv1 t
+
diff --git a/src/CSPM/TypeChecker/Compressor.hs b/src/CSPM/TypeChecker/Compressor.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/Compressor.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE FlexibleInstances #-}
+module CSPM.TypeChecker.Compressor(
+    Compressable, mcompress
+) where
+
+import CSPM.DataStructures.Types
+import CSPM.DataStructures.Syntax
+import CSPM.TypeChecker.Monad
+import Util.Annotated
+
+class Compressable a where
+    -- | Map compress
+    mcompress :: a -> TypeCheckMonad a
+
+($$) :: TypeCheckMonad (a -> b) -> TypeCheckMonad a -> TypeCheckMonad b
+($$) fm argm = do
+    f <- fm
+    arg <- argm
+    return $ f arg
+
+instance (Compressable a) => Compressable (Annotated (Maybe SymbolTable, PSymbolTable) a) where
+    mcompress (An l (_, pt) v) = do
+        symbtable <- readPSymbolTable pt
+        symbtable' <- mapM (\ (n, t) -> do
+            t' <- compressTypeScheme t
+            return (n,t')) symbtable
+        v' <- mcompress v
+        return $ An l (Just symbtable', pt) v'
+instance (Compressable a) => Compressable (Annotated (Maybe Type, PType) a) where
+    mcompress (An l (_, pt) v) = do
+        Just t <- readPType pt
+        t' <- compress t
+        v' <- mcompress v
+        return $ An l (Just t', pt) v'
+instance (Compressable a) => Compressable (Annotated () a) where
+    mcompress (An l t v) = do
+        v' <- mcompress v
+        return $ An l t v'
+
+instance Compressable a => Compressable [a] where
+    mcompress as = mapM mcompress as
+instance Compressable a => Compressable (Maybe a) where
+    mcompress Nothing = return Nothing
+    mcompress (Just v) = mcompress v >>= return . Just
+instance (Compressable a, Compressable b) => Compressable (a, b) where
+    mcompress (v1, v2) = do
+        v1' <- mcompress v1
+        v2' <- mcompress v2
+        return (v1', v2')
+instance Compressable Exp where
+    mcompress (App e es) = return App $$ mcompress e $$ mcompress es
+    mcompress (BooleanBinaryOp op e1 e2) = return 
+        (BooleanBinaryOp op) $$ mcompress e1 $$ mcompress e2
+    mcompress (BooleanUnaryOp op e) = return
+        (BooleanUnaryOp op) $$ mcompress e
+    mcompress (Concat e1 e2) = return Concat $$ mcompress e1 $$ mcompress e2
+    mcompress (DotApp e1 e2) = return DotApp $$ mcompress e1 $$ mcompress e2
+    mcompress (If e1 e2 e3) = return If $$ mcompress e1 $$ mcompress e2 $$ mcompress e3
+    mcompress (Lambda p e) = return Lambda $$ mcompress p $$ mcompress e
+    mcompress (Let ds e) = return Let $$ mcompress ds $$ mcompress e
+    mcompress (Lit l) = return Lit $$ mcompress l
+    mcompress (List es) = return List $$ mcompress es
+    mcompress (ListComp es stmts) = return ListComp $$ mcompress es $$ mcompress stmts  
+    mcompress (ListEnumFrom e) = return ListEnumFrom $$ mcompress e
+    mcompress (ListEnumFromTo e1 e2) = return ListEnumFromTo $$ mcompress e1 $$ mcompress e2
+    mcompress (ListLength e) = return ListLength $$ mcompress e
+    mcompress (MathsBinaryOp op e1 e2) = return 
+        (MathsBinaryOp op) $$ mcompress e1 $$ mcompress e2
+    mcompress (MathsUnaryOp op e) = return (MathsUnaryOp op) $$ mcompress e
+    -- TODO: do we want to do this?
+    mcompress (Paren e) = return unAnnotate $$ mcompress e
+    mcompress (Set es) = return Set $$ mcompress es
+    mcompress (SetComp es stmts) = return SetComp $$ mcompress es $$ mcompress stmts
+    mcompress (SetEnum es) = return SetEnum $$ mcompress es
+    mcompress (SetEnumComp es stmts) = return SetEnumComp $$ mcompress es $$ mcompress stmts
+    mcompress (SetEnumFrom e) = return SetEnumFrom $$ mcompress e
+    mcompress (SetEnumFromTo e1 e2) = return SetEnumFromTo $$ mcompress e1 $$ mcompress e2
+    mcompress (Tuple es) = return Tuple $$ mcompress es
+    mcompress (Var n) = return (Var n)
+
+    mcompress (AlphaParallel e1 e2 e3 e4) = return
+        AlphaParallel $$ mcompress e1 $$ mcompress e2 $$ mcompress e3 $$ mcompress e4
+    mcompress (Exception e1 e2 e3) = return
+        Exception $$ mcompress e1 $$ mcompress e2 $$ mcompress e3
+    mcompress (ExternalChoice e1 e2) = return ExternalChoice $$ mcompress e1 $$ mcompress e2
+    mcompress (GenParallel e1 e2 e3) = return
+        GenParallel $$ mcompress e1 $$ mcompress e2 $$ mcompress e3
+    mcompress (GuardedExp e1 e2) = return GuardedExp $$ mcompress e1 $$ mcompress e2
+    mcompress (Hiding e1 e2) = return Hiding $$ mcompress e1 $$ mcompress e2
+    mcompress (InternalChoice e1 e2) = return InternalChoice $$ mcompress e1 $$ mcompress e2
+    mcompress (Interrupt e1 e2) = return Interrupt $$ mcompress e1 $$ mcompress e2
+    mcompress (Interleave e1 e2) = return Interleave $$ mcompress e1 $$ mcompress e2
+    mcompress (LinkParallel e1 ties stmts e2) = return 
+        LinkParallel $$ mcompress e1 $$ mcompress ties $$ mcompress stmts $$ mcompress e2
+    mcompress (Prefix e1 fs e2) = return Prefix $$ mcompress e1 $$ mcompress fs $$ mcompress e2
+    mcompress (Rename e1 ties stmts) = return
+        Rename $$ mcompress e1 $$ mcompress ties $$ mcompress stmts
+    mcompress (SequentialComp e1 e2) = return SequentialComp $$ mcompress e1 $$ mcompress e2
+    mcompress (SlidingChoice e1 e2) = return SlidingChoice $$ mcompress e1 $$ mcompress e2
+    
+    mcompress (ReplicatedAlphaParallel stmts e1 e2) =
+        return ReplicatedAlphaParallel $$ mcompress stmts $$ mcompress e1 $$ mcompress e2
+    mcompress (ReplicatedInterleave stmts e) =
+        return ReplicatedInterleave $$ mcompress stmts $$ mcompress e
+    mcompress (ReplicatedExternalChoice stmts e) =
+        return ReplicatedExternalChoice $$ mcompress stmts $$ mcompress e
+    mcompress (ReplicatedInternalChoice stmts e) =
+        return ReplicatedInternalChoice $$ mcompress stmts $$ mcompress e
+    mcompress (ReplicatedParallel stmts e1 e2) =
+        return ReplicatedParallel $$ mcompress stmts $$ mcompress e1 $$ mcompress e2
+    mcompress (ReplicatedLinkParallel ties stmts e) =
+        return ReplicatedLinkParallel $$ mcompress ties $$ mcompress stmts $$ mcompress e
+
+    mcompress a = panic (show a)
+instance Compressable Module where
+    mcompress (GlobalModule ds) = return GlobalModule $$ mcompress ds
+
+instance Compressable Decl where
+    mcompress (FunBind n ms) = return (FunBind n) $$ mcompress ms
+    mcompress (PatBind p e) = return PatBind $$ mcompress p $$ mcompress e
+    mcompress (Assert a) = return Assert $$ mcompress a
+    mcompress (External ns) = return (External ns)
+    mcompress (Transparent ns) = return (Transparent ns)
+    mcompress (Channel ns me) = return (Channel ns) $$ mcompress me
+    mcompress (DataType n cs) = return (DataType n) $$ mcompress cs
+    mcompress (NameType n e) = return (NameType n) $$ mcompress e
+
+instance Compressable Assertion where
+    mcompress (Refinement e1 m e2 opts) = return 
+        Refinement $$ mcompress e1 $$ mcompress m $$ mcompress e2 $$ mcompress opts
+    mcompress (PropertyCheck e p m) = return 
+        PropertyCheck $$ mcompress e $$ mcompress p $$ mcompress m
+
+instance Compressable ModelOption where
+    mcompress (TauPriority e) = return TauPriority $$ mcompress e
+
+instance Compressable DataTypeClause where
+    mcompress (DataTypeClause n me) = return (DataTypeClause n) $$ mcompress me
+
+instance Compressable Match where
+    mcompress (Match pss e) = return Match $$ mcompress pss $$ mcompress e
+
+instance Compressable Field where
+    mcompress (Output e) = return Output $$ mcompress e
+    mcompress (Input p e) = return Input $$ mcompress p $$ mcompress e
+    mcompress (NonDetInput p e) = return NonDetInput $$ mcompress p $$ mcompress e
+
+instance Compressable Stmt where
+    mcompress (Generator p e) = return Generator $$ mcompress p $$ mcompress e
+    mcompress (Qualifier e) = return Qualifier $$ mcompress e
+
+instance Compressable InteractiveStmt where
+    mcompress (Bind d) = return Bind $$ mcompress d
+    mcompress (Evaluate e) = return Evaluate $$ mcompress e
+    mcompress (RunAssertion a) = return RunAssertion $$ mcompress a
+    
+instance Compressable Pat where
+    mcompress (PConcat p1 p2) = return PConcat $$ mcompress p1 $$ mcompress p2
+    mcompress (PList ps) = return PList $$ mcompress ps
+    mcompress (PDotApp p1 p2) = return PDotApp $$ mcompress p1 $$ mcompress p2
+    mcompress (PDoublePattern p1 p2) =
+        return PDoublePattern $$ mcompress p1 $$ mcompress p2
+    mcompress (PLit l) = return PLit $$ mcompress l
+    mcompress (PParen p) = return PParen $$ mcompress p
+    mcompress (PSet ps) = return PSet $$ mcompress ps
+    mcompress (PTuple ps) = return PTuple $$ mcompress ps
+    mcompress (PVar n) = return (PVar n)
+    mcompress (PWildCard) = return PWildCard
+
+instance Compressable SemanticProperty where
+    mcompress l = return l
+instance Compressable Model where
+    mcompress l = return l
+instance Compressable Literal where
+    mcompress l = return l
diff --git a/src/CSPM/TypeChecker/Decl.hs b/src/CSPM/TypeChecker/Decl.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/Decl.hs
@@ -0,0 +1,341 @@
+{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances,
+    DoAndIfThenElse #-}
+module CSPM.TypeChecker.Decl (typeCheckDecls) where
+
+import Control.Monad
+import Control.Monad.Trans
+import Data.Graph.Wrapper
+import qualified Data.Map as M
+import qualified Data.Set as S
+import Data.List (nub, intersect, (\\), sortBy)
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax hiding (getType)
+import CSPM.DataStructures.Types
+import CSPM.PrettyPrinter
+import CSPM.TypeChecker.BuiltInFunctions
+import CSPM.TypeChecker.Common
+import CSPM.TypeChecker.Dependencies
+import CSPM.TypeChecker.Exceptions
+import CSPM.TypeChecker.Expr
+import CSPM.TypeChecker.Monad
+import CSPM.TypeChecker.Pat
+import CSPM.TypeChecker.Unification
+import Util.Annotated
+import Util.List
+import Util.Monad
+import Util.PartialFunctions
+import Util.PrettyPrint
+
+-- | Type check a list of possibly mutually recursive functions
+typeCheckDecls :: [PDecl] -> TypeCheckMonad ()
+typeCheckDecls decls = do
+    namesBoundByDecls <- mapM (\ decl -> do
+        namesBound <- namesBoundByDecl decl
+        return (decl, namesBound)) decls
+        
+    let 
+        -- | Map from declarations to integer identifiers
+        declMap = zip decls [0..]
+        invDeclMap = invert declMap
+        -- | Map from names to the identifier of the declaration that it is
+        -- defined by.
+        varToDeclIdMap = 
+            [(n, apply declMap d) | (d, ns) <- namesBoundByDecls, n <- ns]
+        boundVars = map fst varToDeclIdMap
+        namesToLocations = [(n, loc d) | (d, ns) <- namesBoundByDecls, n <- ns]
+
+    -- Throw an error if a name is defined multiple times
+    manyErrorsIfFalse (noDups boundVars) 
+        (duplicatedDefinitionsMessage namesToLocations)
+
+    -- We prebind the datatypes and channels as they can be matched on in 
+    -- patterns (and thus, given a var in a pattern we can't decide if it
+    -- is free or a dependency otherwise).
+    mapM_ registerChannelsAndDataTypes (map unAnnotate decls)
+
+    -- Map from decl id -> [decl id] meaning decl id depends on the list of
+    -- ids
+    declDeps <- mapM (\ decl -> do
+            deps <- dependencies decl
+            let depsInThisGroup = intersect deps boundVars
+            return (apply declMap decl, mapPF varToDeclIdMap depsInThisGroup)
+        ) decls
+
+    let 
+        -- | Edge from n -> n' iff n uses n'
+        declGraph :: Graph Int Int
+        declGraph = fromListSimple [(id, deps) | (id, deps) <- declDeps]
+        -- | The graph of strongly connected components, with an edge
+        -- from scc i to scc j if j depends on i, but i does not depend
+        -- on j.
+        sccgraph :: Graph (S.Set Int) (M.Map Int Int)
+        sccgraph = transpose (sccGraph declGraph)
+        -- | The strongly connected components themselves, topologically sorted
+        sccs :: [S.Set Int]
+        sccs = topologicalSort sccgraph
+        
+        -- | Get the declarations corresponding to certain ids
+        typeInferenceGroup = mapPF invDeclMap
+
+        -- When an error occurs continue type checking, but only
+        -- type check groups that do not depend on the failed group.
+        -- failM is called at the end if any error has occured.
+        typeCheckGroups [] b = if b then failM else return ()
+        typeCheckGroups (g:gs) b = do
+            err <- tryAndRecover (do
+                typeCheckMutualyRecursiveGroup (typeInferenceGroup (S.toList g))
+                return False
+                ) (return True)
+            if not err then typeCheckGroups gs b
+            -- Else, continue type checking but remove all declaration groups
+            -- that are reachable from this group. Also, set the flag to be 
+            -- True to indicate that an error has occured so that failM is 
+            -- called at the end.
+            else typeCheckGroups (gs \\ (reachableVertices sccgraph g)) True
+    
+    -- Start type checking the groups
+    typeCheckGroups sccs False
+
+-- This method heavily affects the DataType clause of typeCheckDecl.
+-- If any changes are made here changes will need to be made to typeCheckDecl
+-- too
+
+-- We have to prebind all datatype clauses and channel names so
+-- that we can identify when a particular pattern uses these clauses and
+-- channels. We do this by injecting them into the symbol table earlier
+-- than normal.
+registerChannelsAndDataTypes :: Decl -> TypeCheckMonad ()
+registerChannelsAndDataTypes (DataType n cs) = do
+    mapM_ (\ c -> case unAnnotate c of
+            DataTypeClause n' _ -> addDataTypeOrChannel n'
+        ) cs
+registerChannelsAndDataTypes (Channel ns _) = 
+    mapM_ addDataTypeOrChannel ns
+registerChannelsAndDataTypes _ = return ()
+
+-- | Type checks a group of certainly mutually recursive functions. Only 
+-- functions that are mutually recursive should be included otherwise the
+-- types could end up being less general.
+typeCheckMutualyRecursiveGroup :: [PDecl] -> TypeCheckMonad ()
+typeCheckMutualyRecursiveGroup ds' = do
+    -- TODO: fix temporary hack
+    let 
+        cmp x y = case (unAnnotate x, unAnnotate y) of
+            (DataType _ _, DataType _ _) -> EQ
+            (DataType _ _, _) -> LT
+            (_, DataType _ _) -> GT
+            (_, _) -> EQ
+        ds = sortBy cmp ds'
+    fvs <- liftM nub (concatMapM namesBoundByDecl ds)
+
+    ftvs <- replicateM (length fvs) freshTypeVar
+    zipWithM setType fvs (map (ForAll []) ftvs)
+    
+    -- The list of all variables bound by these declaration
+    fvs <- liftM nub (concatMapM namesBoundByDecl ds)
+
+    -- Type check each declaration then generalise the types
+    nts <- generaliseGroup fvs (map typeCheck ds)
+    -- Add the type of each declaration (if one exists to each declaration)
+    zipWithM annotate nts ds
+
+    -- Compress all the types we have inferred here (they should never be 
+    -- touched again)
+    mapM_ (\ n -> do
+        t <- getType n
+        t' <- compressTypeScheme t
+        setType n t') fvs
+    where        
+        annotate nts (An _ psymbtable _) = setPSymbolTable (snd psymbtable) nts
+
+-- | Takes a type and returns the inner type, i.e. the type that this
+-- is a set of. For example TSet t1 -> t, TTuple [TSet t1, TSet t2] -> (t1, t2).
+-- The type that is returned is guaranteed to satisfy Eq since, at the
+-- recursion only bottoms out on reaching something that is of type TSet.
+evalTypeExpression :: Type -> TypeCheckMonad Type
+evalTypeExpression (TTuple ts) = do
+    -- TTuple [TSet t1,...] = TSet (TTuple [t1,...])
+    ts' <- mapM evalTypeExpression ts
+    return $ TTuple ts'
+evalTypeExpression (TDot t1 t2) = do
+    -- TDot (TSet t1) (TSet t2) = TSet (TDot t1 t2)
+    t1' <- evalTypeExpression t1
+    t2' <- evalTypeExpression t2
+    return $ TDot t1' t2'
+-- Otherwise, it must be a set.
+evalTypeExpression t = do
+    fv <- freshTypeVar
+    unify t (TSet fv)
+    return fv
+
+instance TypeCheckable PDecl [(Name, Type)] where
+    errorContext an = Nothing
+    typeCheck' an = setSrcSpan (loc an) $ typeCheck (inner an)
+
+instance TypeCheckable Decl [(Name, Type)] where
+    errorContext (FunBind n ms) = Just $ 
+        -- This will only be helpful if the equations don't match in
+        -- type
+        text "In the declaration of:" <+> prettyPrint n
+    errorContext (p@(PatBind pat exp)) = Just $
+        hang (text "In a pattern binding:") tabWidth (prettyPrint p)
+    errorContext (DataType n cs) = Just $
+        text "In the declaration of:" <+> prettyPrint n
+    errorContext (NameType n e) = Just $
+        text "In the declaration of:" <+> prettyPrint n
+    errorContext (Channel ns es) = Just $
+        text "In the declaration of:" <+> list (map prettyPrint ns)
+    errorContext (Assert a) = Just $
+        text "In the assertion:" <+> prettyPrint a
+    errorContext (Transparent ns) = Nothing
+    errorContext (External ns) = Nothing
+    
+    typeCheck' (FunBind n ms) = do
+        ts <- mapM (\ m -> addErrorContext (matchCtxt m) $ typeCheck m) ms
+        ForAll [] t <- getType n
+        -- This unification also ensures that each equation has the same number
+        -- of arguments.
+        (t' @ (TFunction tsargs _)) <- unifyAll (t:ts)
+        return [(n, t')]
+        where
+            matchCtxt an = 
+                hang (text "In an equation for" <+> prettyPrint n <> colon) 
+                    tabWidth (prettyPrintMatch n an)
+    typeCheck' (PatBind pat exp) = do
+        tpat <- typeCheck pat
+        texp <- typeCheck exp
+        -- We evaluate the dots to implement the 'longest match' rule. For
+        -- example, suppose we have the following declaration:
+        --   datatype A = B.Integers.Integers
+        --   f(B.x) = x
+        -- Then we make the decision that x should be of type Int.Int.
+        tpat <- evaluateDots tpat
+        texp <- evaluateDots texp
+        -- We must disallow symmetric unification here as we don't want
+        -- to allow patterns such as:
+        --     x.y = B
+        disallowSymmetricUnification (unify texp tpat)
+        ns <- namesBoundByDecl' (PatBind pat exp)
+        ts <- mapM getType ns
+        return $ zip ns [t | ForAll _ t <- ts]
+    -- The following two clauses rely on the fact that they have been 
+    -- prebound.
+    typeCheck' (Channel ns Nothing) = do
+        -- We now unify the each type to be a TEvent
+        mapM (\ n -> do
+            ForAll [] t <- getType n
+            unify TEvent t) ns
+        -- (Now getType n for any n in ns will return TEvent)
+        return [(n, TEvent) | n <- ns]
+    typeCheck' (Channel ns (Just e)) = do
+        t <- typeCheck e
+        valueType <- evalTypeExpression t
+        dotList <- typeToDotList valueType
+        let t = foldr TDotable TEvent dotList
+        mapM (\ n -> do
+            ForAll [] t' <- getType n
+            unify t' t) ns
+        return $ [(n, t) | n <- ns]
+    typeCheck' (DataType n clauses) = do
+        nts <- mapM (\ clause -> do
+            let 
+                n' = case unAnnotate clause of
+                        DataTypeClause x _ -> x
+            ForAll [] t <- getType n'
+            (n', ts) <- typeCheck clause
+            let texp = foldr TDotable (TDatatype n) ts
+            t <- unify texp t
+            return (n', t)
+            ) clauses
+        ForAll [] t <- getType n
+        t' <- unify t (TSet (TDatatype n))
+        return $ (n, t'):nts
+    typeCheck' (NameType n e) = do
+        t <- typeCheck e
+        valueType <- evalTypeExpression t
+        return [(n, TSet valueType)]
+    typeCheck' (Transparent ns) = do
+        mapM_ (\ (n@(Name s)) -> do
+            texp <- applyPFOrError (transparentFunctionNotRecognised n) 
+                                transparentFunctions s
+            ForAll [] t <- getType n
+            unify texp t) ns
+        return []
+    typeCheck' (External ns) = do
+        mapM_ (\ (n@(Name s)) -> do
+            texp <- applyPFOrError (externalFunctionNotRecognised n) 
+                                externalFunctions s
+            ForAll [] t <- getType n
+            unify texp t) ns
+        return []
+    typeCheck' (Assert a) = typeCheck a >> return []
+
+instance TypeCheckable Assertion () where
+    errorContext a = Just $ 
+        hang (text "In the assertion" <> colon) tabWidth (prettyPrint a)
+    typeCheck' (PropertyCheck e1 p m) = do
+        ensureIsProc e1
+        return ()
+    typeCheck' (Refinement e1 m e2 opts) = do
+        ensureIsProc e1
+        ensureIsProc e2
+        mapM_ typeCheck opts
+
+instance TypeCheckable ModelOption () where
+    errorContext a = Nothing
+    typeCheck' (TauPriority e) = do
+        typeCheckExpect e (TSet TEvent)
+        return ()
+
+instance TypeCheckable PDataTypeClause (Name, [Type]) where
+    errorContext an = Nothing
+    typeCheck' an = setSrcSpan (loc an) $ typeCheck (inner an)
+
+instance TypeCheckable DataTypeClause (Name, [Type]) where
+    errorContext c = Just $
+        hang (text "In the data type clause" <> colon) tabWidth 
+            (prettyPrint c)
+    typeCheck' (DataTypeClause n' Nothing) = do
+        return (n', [])
+    typeCheck' (DataTypeClause n' (Just e)) = do
+        t <- typeCheck e
+        valueType <- evalTypeExpression t
+        dotList <- typeToDotList valueType
+        return (n', dotList)
+
+instance TypeCheckable PMatch Type where
+    errorContext an = Nothing
+    typeCheck' an = setSrcSpan (loc an) $ typeCheck (inner an)
+instance TypeCheckable Match Type where
+    -- We create the error context in FunBind as that has access
+    -- to the name
+    errorContext (Match groups exp) = Nothing
+    typeCheck' (Match groups exp) = do
+        -- Introduce free variables for all the parameters
+        fvs <- liftM concat (mapM freeVars groups)
+        local fvs $ do
+            tgroups <- mapM (\ pats -> mapM (\ pat -> 
+                    -- We evaluate the dots here to implment the longest 
+                    -- match rule
+                    typeCheck pat >>= evaluateDots
+                ) pats) groups
+    
+            -- We evaluate the dots here to implment the longest match rule
+            tr <- typeCheck exp >>= evaluateDots
+            
+            -- We need to evaluate the dots in the patterns twice just in case 
+            -- the type inferences on the RHS have resulted in extra dots on 
+            -- the left being able to be removed.
+            tgroups <- mapM (\ pats -> mapM (\ pat -> 
+                    typeCheck pat >>= evaluateDots
+                ) pats) groups
+
+            return $ foldr (\ targs tr -> TFunction targs tr) tr tgroups
+
+applyPFOrError 
+    :: Eq a => Error -> PartialFunction a b -> a -> TypeCheckMonad b
+applyPFOrError err pf a = 
+    case safeApply pf a of
+        Just a -> return a
+        Nothing -> raiseMessageAsError err
diff --git a/src/CSPM/TypeChecker/Decl.hs-boot b/src/CSPM/TypeChecker/Decl.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/Decl.hs-boot
@@ -0,0 +1,7 @@
+module CSPM.TypeChecker.Decl where
+
+import CSPM.DataStructures.Syntax
+import CSPM.DataStructures.Types
+import CSPM.TypeChecker.Monad
+
+typeCheckDecls :: [PDecl] -> TypeCheckMonad ()
diff --git a/src/CSPM/TypeChecker/Dependencies.hs b/src/CSPM/TypeChecker/Dependencies.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/Dependencies.hs
@@ -0,0 +1,270 @@
+{-# LANGUAGE FlexibleInstances #-}
+module CSPM.TypeChecker.Dependencies (
+    Dependencies, dependencies, namesBoundByDecl, namesBoundByDecl',
+    FreeVars, freeVars
+) where
+
+import Control.Monad
+import Data.List (nub, (\\))
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.DataStructures.Types
+import CSPM.TypeChecker.Exceptions
+import CSPM.TypeChecker.Monad
+import Util.Annotated
+import Util.List
+import Util.Monad
+
+-- This file exports two main type classes, Dependencies and FreeVars. The first
+-- computes what names a given expression/pattern/field/etc depends on.
+-- The second computes the free variables within each statement.
+-- Clearly these depend on each other heavily as a name is free iff
+-- it is not a dependency.
+
+namesBoundByDecl :: AnDecl -> TypeCheckMonad [Name]
+namesBoundByDecl =  namesBoundByDecl' . unAnnotate
+namesBoundByDecl' (FunBind n ms) = return [n]
+namesBoundByDecl' (PatBind p ms) = freeVars p
+namesBoundByDecl' (Channel ns es) = return ns
+namesBoundByDecl' (DataType n dcs) = 
+    let
+        namesBoundByDtClause (DataTypeClause n _) = [n]
+    in
+        return $ n:concatMap (namesBoundByDtClause . unAnnotate) dcs
+namesBoundByDecl' (NameType n e) = return [n]
+namesBoundByDecl' (External ns) = return ns
+namesBoundByDecl' (Transparent ns) = return ns
+namesBoundByDecl' (Assert _) = return []
+
+class Dependencies a where
+    dependencies :: a -> TypeCheckMonad [Name]
+    dependencies xs = liftM nub (dependencies' xs)
+    dependencies' :: a -> TypeCheckMonad [Name]
+
+instance Dependencies a => Dependencies [a] where
+    dependencies' xs = concatMapM dependencies xs
+instance Dependencies a => Dependencies (Maybe a) where
+    dependencies' (Just x) = dependencies' x
+    dependencies' Nothing = return []
+instance Dependencies a => Dependencies (Annotated b a) where
+    dependencies' (An _ _ inner) = dependencies inner
+
+instance Dependencies Pat where
+    dependencies' (PVar n) = do
+        res <- isDataTypeOrChannel n
+        return $ if res then [n] else []
+    dependencies' (PConcat p1 p2) = do
+        fvs1 <- dependencies' p1
+        fvs2 <- dependencies' p2
+        return $ fvs1++fvs2
+    dependencies' (PDotApp p1 p2) = dependencies' [p1,p2]
+    dependencies' (PList ps) = dependencies' ps
+    dependencies' (PWildCard) = return []
+    dependencies' (PTuple ps) = dependencies' ps
+    dependencies' (PSet ps) = dependencies' ps
+    dependencies' (PParen p) = dependencies' p
+    dependencies' (PLit l) = return []
+    dependencies' (PDoublePattern p1 p2) = do
+        fvs1 <- dependencies' p1
+        fvs2 <- dependencies' p2
+        return $ fvs1++fvs2
+    
+instance Dependencies Exp where
+    dependencies' (App e es) = dependencies' (e:es)
+    dependencies' (BooleanBinaryOp _ e1 e2) = dependencies' [e1,e2]
+    dependencies' (BooleanUnaryOp _ e) = dependencies' e
+    dependencies' (Concat e1 e2) = dependencies' [e1,e2]
+    dependencies' (DotApp e1 e2) = dependencies' [e1,e2]
+    dependencies' (If e1 e2 e3) = dependencies' [e1,e2, e3]
+    dependencies' (Lambda p e) = do
+        fvsp <- freeVars p
+        depsp <- dependencies p
+        fvse <- dependencies e
+        return $ (fvse \\ fvsp)++depsp
+    dependencies' (Let ds e) = do
+        fvsd <- dependencies ds
+        newBoundVars <- liftM nub (concatMapM namesBoundByDecl ds)
+        fvse <- dependencies e
+        return $ nub (fvse++fvsd) \\ newBoundVars
+    dependencies' (Lit _) = return []
+    dependencies' (List es) = dependencies es
+    dependencies' (ListComp es stmts) = do
+        fvStmts <- freeVars stmts
+        depsStmts <- dependencies stmts
+        fvses' <- dependencies es
+        let fvse = nub (fvses'++depsStmts)
+        return $ fvse \\ fvStmts
+    dependencies' (ListEnumFrom e1) = dependencies' e1
+    dependencies' (ListEnumFromTo e1 e2) = dependencies' [e1,e2]
+    dependencies' (ListLength e) = dependencies' e
+    dependencies' (MathsBinaryOp _ e1 e2) = dependencies' [e1,e2]
+    dependencies' (MathsUnaryOp _ e1) = dependencies' e1
+    dependencies' (Paren e) = dependencies' e
+    dependencies' (Set es) = dependencies es
+    dependencies' (SetComp es stmts) = do
+        fvStmts <- freeVars stmts
+        depsStmts <- dependencies stmts
+        fvses' <- dependencies es
+        let fvse = nub (fvses'++depsStmts)
+        return $ fvse \\ fvStmts
+    dependencies' (SetEnumComp es stmts) = do
+        fvStmts <- freeVars stmts
+        depsStmts <- dependencies stmts
+        fvses' <- dependencies es
+        let fvse = nub (fvses'++depsStmts)
+        return $ fvse \\ fvStmts
+    dependencies' (SetEnumFrom e1) = dependencies' e1
+    dependencies' (SetEnumFromTo e1 e2) = dependencies' [e1,e2]
+    dependencies' (SetEnum es) = dependencies' es
+    dependencies' (Tuple es) = dependencies' es
+    dependencies' (Var (UnQual n)) = return [n]
+    
+    -- Processes
+    dependencies' (AlphaParallel e1 e2 e3 e4) = dependencies' [e1,e2,e3,e4]
+    dependencies' (Exception e1 e2 e3) = dependencies' [e1,e2,e3]
+    dependencies' (ExternalChoice e1 e2) = dependencies' [e1,e2]
+    dependencies' (GenParallel e1 e2 e3) = dependencies' [e1,e2,e3]
+    dependencies' (GuardedExp e1 e2) = dependencies' [e1,e2]
+    dependencies' (Hiding e1 e2) = dependencies' [e1,e2]
+    dependencies' (InternalChoice e1 e2) = dependencies' [e1,e2]
+    dependencies' (Interrupt e1 e2) = dependencies' [e1,e2]
+    dependencies' (LinkParallel e1 links stmts e2) = do
+        ds1 <- dependencies [e1,e2]
+        ds2 <- dependenciesStmts stmts (concat (map (\ (x,y) -> x:y:[]) links))
+        return $ ds1++ds2
+    dependencies' (Interleave e1 e2) = dependencies' [e1,e2]
+    dependencies' (Prefix e1 fields e2) = do
+        depse <- dependencies' [e1,e2]
+        depsfields <- dependencies fields
+        fvfields <- freeVars fields
+        let fvse = nub (fvfields++depsfields++depse)
+        return $ fvse \\ fvfields
+    dependencies' (Rename e1 renames stmts) = do
+        d1 <- dependencies' e1
+        d2 <- dependenciesStmts stmts (es++es')
+        return $ d1++d2
+        where (es, es') = unzip renames
+    dependencies' (SequentialComp e1 e2) = dependencies' [e1,e2]
+    dependencies' (SlidingChoice e1 e2) = dependencies' [e1,e2]
+
+    dependencies' (ReplicatedAlphaParallel stmts e1 e2) = 
+        dependenciesStmts stmts [e1,e2]
+    dependencies' (ReplicatedInterleave stmts e1) = 
+        dependenciesStmts stmts [e1]
+    dependencies' (ReplicatedExternalChoice stmts e1) = 
+        dependenciesStmts stmts [e1]
+    dependencies' (ReplicatedInternalChoice stmts e1) = 
+        dependenciesStmts stmts [e1]
+    dependencies' (ReplicatedLinkParallel ties stmts e) =
+        dependenciesStmts stmts (e:es++es')
+        where  (es, es') = unzip ties
+    dependencies' (ReplicatedParallel e1 stmts e2) = dependenciesStmts stmts [e1,e2]
+    
+    dependencies' x = panic ("TCDependencies.hs: unrecognised exp "++show x)
+
+-- Recall that a later stmt can depend on values that appear in an ealier stmt
+-- For example, consider <x | x <- ..., f(x)>. Therefore we do a foldr to correctly
+-- consider cases like <x | f(x), x <- ... >
+dependenciesStmts :: Dependencies a => [PStmt] -> a -> TypeCheckMonad [Name]
+dependenciesStmts [] e = dependencies e
+dependenciesStmts (stmt:stmts) e = do
+    depse <- dependenciesStmts stmts e
+    depsstmt <- dependencies stmt
+    fvstmt <- freeVars stmt
+    let depse' = nub (depsstmt++depse)
+    return $ depse' \\ fvstmt
+
+instance Dependencies Stmt where
+    dependencies' (Generator p e) = do
+        ds1 <- dependencies p
+        ds2 <- dependencies e
+        return $ ds1++ds2
+    dependencies' (Qualifier e) = dependencies e
+
+instance Dependencies Field where
+    dependencies' (Input p e) = dependencies e
+    dependencies' (NonDetInput p e) = dependencies e
+    dependencies' (Output e) = dependencies e
+
+instance Dependencies Decl where
+    dependencies' (FunBind n ms) = do
+        fvsms <- dependencies ms
+        return $ fvsms
+    dependencies' (PatBind p e) = do
+        depsp <- dependencies p
+        fvsp <- freeVars p
+        depse <- dependencies e
+        return $ depsp++depse
+    dependencies' (Channel ns es) = dependencies es
+    dependencies' (DataType n cs) = dependencies [cs]
+    dependencies' (NameType n e) = dependencies' e
+    dependencies' (External ns) = return []
+    dependencies' (Transparent ns) = return []
+    dependencies' (Assert a) = dependencies a
+
+instance Dependencies Assertion where
+    dependencies' (Refinement e1 m e2 opts) = do
+        d1 <- dependencies [e1, e2]
+        d2 <- dependencies opts
+        return $ d1++d2
+    dependencies' (PropertyCheck e1 p m) = dependencies [e1]
+    dependencies' (BoolAssertion e1) = dependencies [e1]
+    dependencies' (ASNot a) = dependencies a
+
+instance Dependencies ModelOption where
+    dependencies' (TauPriority e) = dependencies' e
+    
+instance Dependencies Match where
+    dependencies' (Match ps e) =
+        do
+            fvs1 <- freeVars ps
+            depsPs <- dependencies ps
+            fvs2 <- dependencies e
+            return $ (fvs2 \\ fvs1) ++ depsPs
+
+instance Dependencies DataTypeClause where
+    dependencies' (DataTypeClause n Nothing) = return []
+    dependencies' (DataTypeClause n (Just e)) = dependencies' e
+
+
+class FreeVars a where
+    freeVars :: a -> TypeCheckMonad [Name]
+    freeVars = liftM nub . freeVars'
+    
+    freeVars' :: a -> TypeCheckMonad [Name]
+
+instance FreeVars a => FreeVars [a] where
+    freeVars' xs = concatMapM freeVars' xs
+    
+instance FreeVars a => FreeVars (Annotated b a) where
+    freeVars' (An _ _ inner) = freeVars inner
+
+instance FreeVars Pat where
+    freeVars' (PVar n) = do
+        res <- isDataTypeOrChannel n
+        return $ if res then [] else [n]
+    freeVars' (PConcat p1 p2) = do
+        fvs1 <- freeVars' p1
+        fvs2 <- freeVars' p2
+        return $ fvs1++fvs2
+    freeVars' (PDotApp p1 p2) = freeVars' [p1,p2]
+    freeVars' (PList ps) = freeVars' ps
+    freeVars' (PWildCard) = return []
+    freeVars' (PTuple ps) = freeVars' ps
+    freeVars' (PSet ps) = freeVars' ps
+    freeVars' (PParen p) = freeVars' p
+    freeVars' (PLit l) = return []
+    freeVars' (PDoublePattern p1 p2) = do
+        fvs1 <- freeVars' p1
+        fvs2 <- freeVars' p2
+        return $ fvs1++fvs2
+
+instance FreeVars Stmt where
+    freeVars' (Qualifier e) = return []
+    freeVars' (Generator p e) = freeVars p
+
+instance FreeVars Field where
+    freeVars' (Input p e) = freeVars p
+    freeVars' (NonDetInput p e) = freeVars p
+    freeVars' (Output e) = return []
diff --git a/src/CSPM/TypeChecker/Environment.hs b/src/CSPM/TypeChecker/Environment.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/Environment.hs
@@ -0,0 +1,33 @@
+module CSPM.TypeChecker.Environment (
+    module Util.HierarchicalMap,
+    Environment, 
+    mkSymbolInformation, SymbolInformation(..)
+)
+where
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Types
+import Util.HierarchicalMap
+
+-- | Make symbol information for the type assuming that the symbol
+-- is not deprecated and its type is not unsafe.
+mkSymbolInformation :: TypeScheme -> SymbolInformation
+mkSymbolInformation t = SymbolInformation { 
+        typeScheme = t, 
+        isDeprecated = False, 
+        isTypeUnsafe = False 
+    }
+
+-- | Used to represent information about a symbol
+data SymbolInformation = SymbolInformation {
+        -- | The type of the symbol
+        typeScheme :: TypeScheme,
+        -- | Is this symbol deprecated
+        isDeprecated :: Bool,
+        -- | Is this symbols' type too general (if so
+        -- use of it will emit a soundness warning)
+        isTypeUnsafe :: Bool
+    }
+    deriving (Eq, Show)
+
+type Environment = HierarchicalMap Name SymbolInformation
diff --git a/src/CSPM/TypeChecker/Exceptions.hs b/src/CSPM/TypeChecker/Exceptions.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/Exceptions.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+module CSPM.TypeChecker.Exceptions (
+    Error, Warning,
+    varNotInScopeMessage,
+    infiniteUnificationMessage,
+    unificationErrorMessage,
+    duplicatedDefinitionsMessage,
+    incorrectArgumentCountMessage,
+    constraintUnificationErrorMessage,
+    transparentFunctionNotRecognised,
+    externalFunctionNotRecognised,
+    deprecatedNameUsed,
+    unsafeNameUsed,
+)
+where
+
+import Data.Typeable
+import Data.List (group, sort)
+import Prelude
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.DataStructures.Types
+import CSPM.PrettyPrinter
+import Util.Annotated
+import Util.Exception
+import Util.PartialFunctions
+import Util.PrettyPrint
+
+type Error = Doc
+type Warning = Doc
+
+varNotInScopeMessage :: Name -> Error
+varNotInScopeMessage n = prettyPrint n <+> text "is not in scope"
+
+incorrectArgumentCountMessage :: Doc -> Int -> Int -> Error
+incorrectArgumentCountMessage func expected actual = 
+    hang (hang (text "The function") tabWidth func) tabWidth
+        (text "was supplied with" <+> int actual <+> 
+        text "arguments, but was expecting" <+> int expected)
+
+infiniteUnificationMessage :: Type -> Type -> Error
+infiniteUnificationMessage t1 t2 = 
+    let [ppt1, ppt2] = prettyPrintTypes [t1, t2] in
+    text "Cannot construct the infinite type:" <+> ppt1 <+> equals <+> ppt2
+
+unificationErrorMessage :: [(Type, Type)] -> Error
+unificationErrorMessage unificationStack = 
+    let 
+        hd = head unificationStack
+        lt = last unificationStack
+        (it1, it2) = hd
+        (t1, t2) = lt
+        [pit1, pit2, pt1, pt2] = prettyPrintTypes [it1, it2, t1, t2]
+    in
+        sep [text "Couldn't match expected type" <+> pit1,
+            nest 8 (text "with actual type" <+> pit2)]
+        $$
+        if hd == lt then empty
+        else sep [text "whilst matching expected type" <+> pt1,
+            nest 8 (text "with actual type" <+> pt2)]
+
+constraintUnificationErrorMessage :: Constraint -> Type -> Error
+constraintUnificationErrorMessage c t = 
+    hang (hang (text "The type") tabWidth (prettyPrint t)) tabWidth
+        (text "does not have the constraint" <+> prettyPrint c)
+
+duplicatedDefinitionsMessage :: [(Name, SrcSpan)] -> [Error]
+duplicatedDefinitionsMessage ns = duplicatedDefinitionsMessage' $
+    let
+        names = map fst ns
+        dupNames = (map head . filter (\ g -> length g > 1) . group . sort) names
+    in [(n, applyRelation ns n) | n <- dupNames]
+
+duplicatedDefinitionsMessage' :: [(Name, [SrcSpan])] -> [Error]
+duplicatedDefinitionsMessage' nlocs = 
+    map (\ (n, spans) ->
+        hang (text "The variable" <+> prettyPrint n 
+                <+> text "has multiple definitions at" <> colon) tabWidth
+            (vcat (map prettyPrint spans))) nlocs
+
+transparentFunctionNotRecognised :: Name -> Error
+transparentFunctionNotRecognised n =
+    text "The transparent function" <+> prettyPrint n <+> 
+    text "is not recognised."
+externalFunctionNotRecognised :: Name -> Error
+externalFunctionNotRecognised n = 
+    text "The external function" <+> prettyPrint n <+> 
+    text "is not recognised."
+
+deprecatedNameUsed :: Name -> Maybe Name -> Error
+deprecatedNameUsed n Nothing = 
+    prettyPrint n <+> text "is deprecated."
+deprecatedNameUsed n (Just replacement) = 
+    prettyPrint n <+> text "is deprecated - use" <+>
+    prettyPrint replacement <+> text "instead."
+
+unsafeNameUsed :: Name -> Error
+unsafeNameUsed n =
+    text "The invocation of" <+> prettyPrint n 
+        <+> text "has not been type-checked."
+    <+> text "Therefore, a runtime type error may occur here."
diff --git a/src/CSPM/TypeChecker/Expr.hs b/src/CSPM/TypeChecker/Expr.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/Expr.hs
@@ -0,0 +1,367 @@
+{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, DoAndIfThenElse #-}
+module CSPM.TypeChecker.Expr () where
+
+import Control.Monad
+import Control.Monad.Trans
+import Data.List
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax hiding (getType)
+import CSPM.DataStructures.Types
+import CSPM.TypeChecker.BuiltInFunctions
+import CSPM.TypeChecker.Common
+import {-# SOURCE #-} CSPM.TypeChecker.Decl
+import CSPM.TypeChecker.Dependencies
+import CSPM.TypeChecker.Exceptions
+import CSPM.TypeChecker.Pat
+import CSPM.TypeChecker.Monad
+import CSPM.TypeChecker.Unification
+import Util.Annotated
+import Util.Exception
+import Util.List
+import Util.Monad
+import Util.PrettyPrint
+
+checkFunctionCall :: Doc -> [PExp] -> [Type] -> TypeCheckMonad ()
+checkFunctionCall func args expectedTypes = do
+    actTypes <- mapM typeCheck args
+    let
+        as = zip4 [1..] args expectedTypes actTypes
+        unifyArg (count, arg, texp, tact) = 
+            setSrcSpan (loc arg) $ addErrorContext (
+                hang (hang (text "In the" <+> speakNth count 
+                            <+> text "argument of")
+                            tabWidth (func <> comma) )
+                    tabWidth (text "namely" <+> prettyPrint arg)
+            ) (do
+                -- When we computer the type of the function we evaluated all
+                -- dots in the arguments. Therefore, here we can evaluate the
+                -- dots and remove them all.
+                tact <- evaluateDots tact
+                -- We also evaluate the dots in the expected type. This is done
+                -- because during type checking of a recursive function we may
+                -- have not yet have evaluated its dots.
+                texp <- evaluateDots texp
+                -- We must disallow symmetric unification here as we don't want
+                -- to allow patterns such as:
+                --     x.y = B
+                disallowSymmetricUnification (unify texp tact))
+    -- NB. the argument counts must already be correct
+    mapM unifyArg as
+    return ()
+
+instance TypeCheckable PExp Type where
+    errorContext an = Nothing
+    typeCheck' an = do
+        t <- setSrcSpan (loc an) $ typeCheck (inner an)
+        setPType (snd (annotation an)) t
+        return t
+    typeCheckExpect an texp = do
+        -- The unification is done in typeCheck (inner an)
+        t <- setSrcSpan (loc an) $ typeCheckExpect (inner an) texp
+        setPType (snd (annotation an)) t
+        return t
+instance TypeCheckable Exp Type where
+    typeCheckExpect obj texp =
+        case errorContext obj of
+            Just c -> addErrorContext c m
+            Nothing -> m
+        where
+            m = do
+                tact <- typeCheck' obj
+                unify texp tact
+
+    errorContext e = Just $ 
+        hang (text "In the expression:") tabWidth (prettyPrint e)
+    
+    typeCheck' (App f args) = do
+        targs <- replicateM (length args) freshTypeVar
+        tr <- freshTypeVar
+        typeCheckExpect f (TFunction targs tr)
+        checkFunctionCall (prettyPrint f) args targs
+        return tr
+    typeCheck' (BooleanBinaryOp op e1 e2) = (do
+        case op of
+            And -> checkFunctionCall (text "and") [e1,e2] [TBool, TBool]
+            Or  -> checkFunctionCall (text "or") [e1,e2] [TBool, TBool]
+            _   -> do
+                t <- typeCheck e1
+                t <- typeCheckExpect e2 t
+                case op of  
+                    Equals          -> ensureHasConstraint Eq t
+                    NotEquals       -> ensureHasConstraint Eq t
+                    LessThan        -> ensureHasConstraint Ord t
+                    LessThanEq      -> ensureHasConstraint Ord t
+                    GreaterThan     -> ensureHasConstraint Ord t
+                    GreaterThanEq   -> ensureHasConstraint Ord t
+                return ())
+        >> return TBool
+    typeCheck' (BooleanUnaryOp op e1) = do
+        ensureIsBool e1
+    typeCheck' (Concat e1 e2) = do
+        t1 <- ensureIsList e1
+        typeCheckExpect e2 t1
+    typeCheck' (DotApp e1 e2) = do
+        t1 <- typeCheck e1
+        t2 <- typeCheck e2
+        return $ TDot t1 t2
+    typeCheck' (If e1 e2 e3) = do
+        ensureIsBool e1
+        t2 <- typeCheck e2
+        typeCheckExpect e3 t2
+    typeCheck' (Lambda p exp) = do
+        fvs <- freeVars p
+        local fvs $ do
+            tr <- typeCheck exp
+            targ <- typeCheck p
+            return $ TFunction [targ] tr
+    typeCheck' (Let decls exp) =
+        -- Add a new scope: typeCheckDecl will add vars into it 
+        local [] $ do
+            typeCheckDecls decls
+            typeCheck exp
+    typeCheck' (Lit lit) = typeCheck lit
+    typeCheck' (List es) = do
+        t <- ensureAreEqual es
+        return $ TSeq t
+    typeCheck' (ListComp es stmts) =
+        typeCheckStmts TSeq stmts $ do
+            t <- ensureAreEqual es
+            return $ TSeq t
+    typeCheck' (ListEnumFrom lb) = do
+        ensureIsInt lb
+        return $ TSeq TInt
+    typeCheck' (ListEnumFromTo lb ub) = do
+        ensureIsInt lb
+        ensureIsInt ub
+        return $ TSeq TInt
+    typeCheck' (ListLength e) = do
+        ensureIsList e
+        return $ TInt
+    typeCheck' (MathsBinaryOp op e1 e2) = do
+        ensureIsInt e1
+        ensureIsInt e2
+        return TInt
+    typeCheck' (MathsUnaryOp op e1) = do
+        ensureIsInt e1
+        return TInt
+    typeCheck' (Paren e) = typeCheck e
+    typeCheck' (Set es) = do
+        t <- ensureAreEqual es
+        ensureHasConstraint Eq t
+        return $ TSet t
+    typeCheck' (SetComp es stmts) = 
+        typeCheckStmts TSet stmts $ do
+            t <- ensureAreEqual es
+            return $ TSet t
+    typeCheck' (SetEnum es) =  do
+        mapM ensureIsChannel es
+        return $ TSet TEvent
+    typeCheck' (SetEnumComp es stmts) = 
+        typeCheckStmts TSet stmts $ do
+            mapM ensureIsChannel es
+            return $ TSet TEvent
+    typeCheck' (SetEnumFrom lb) = do
+        ensureIsInt lb
+        return $ TSet TInt
+    typeCheck' (SetEnumFromTo lb ub) = do
+        ensureIsInt lb
+        ensureIsInt ub
+        return $ TSet TInt
+    typeCheck' (Tuple es) = do
+        ts <- mapM typeCheck es
+        return $ TTuple ts
+    typeCheck' (Var (UnQual n)) = do
+        b <- isDeprecated n
+        if b then 
+            addWarning (deprecatedNameUsed n (replacementForDeprecatedName n))
+        else return ()
+        b <- isTypeUnsafe n
+        if b then addWarning (unsafeNameUsed n)
+        else return ()
+        
+        t <- getType n
+        instantiate t
+
+    -- Processes
+    typeCheck' (AlphaParallel e1 a1 a2 e2) = do
+        ensureIsProc e1
+        ensureIsProc e2
+        typeCheckExpect a1 (TSet TEvent)
+        typeCheckExpect a2 (TSet TEvent)
+        return TProc
+    typeCheck' (Exception e1 a e2) = do
+        ensureIsProc e1
+        ensureIsProc e2
+        typeCheckExpect a (TSet TEvent)
+        return TProc
+    typeCheck' (ExternalChoice e1 e2) = do
+        ensureIsProc e1
+        ensureIsProc e2
+        return TProc
+    typeCheck' (Hiding e1 e2) = do
+        ensureIsProc e1
+        typeCheckExpect e2 (TSet TEvent)
+        return TProc
+    typeCheck' (GenParallel e1 a e2) = do
+        ensureIsProc e1
+        ensureIsProc e2
+        typeCheckExpect a (TSet TEvent)
+        return TProc
+    typeCheck' (GuardedExp e1 e2) = do
+        ensureIsBool e1
+        ensureIsProc e2
+        return TProc
+    typeCheck' (InternalChoice e1 e2) = do
+        ensureIsProc e1
+        ensureIsProc e2
+        return TProc
+    typeCheck' (Interrupt e1 e2) = do
+        ensureIsProc e1
+        ensureIsProc e2
+        return TProc
+    typeCheck' (Interleave e1 e2) = do
+        ensureIsProc e1
+        ensureIsProc e2
+        return TProc        
+    typeCheck' (SequentialComp e1 e2) = do
+        ensureIsProc e1
+        ensureIsProc e2
+        return TProc
+    typeCheck' (SlidingChoice e1 e2) = do
+        ensureIsProc e1
+        ensureIsProc e2
+        return TProc
+    typeCheck' (Prefix e1 [] e2) = do
+        ensureIsEvent e1
+        ensureIsProc e2
+        return TProc
+    typeCheck' (Prefix e1 fields e2) = do
+        fvsByField <- mapM (\f -> do
+                fvs <- freeVars f
+                return (f, fvs)) fields
+        let 
+            fvs = concatMap snd fvsByField
+            namesToLocations = 
+                [(n, loc f) | (f, fvs) <- fvsByField, n <- fvs]
+        -- Throw an error if a name is defined multiple times
+        manyErrorsIfFalse (noDups fvs) 
+            (duplicatedDefinitionsMessage namesToLocations)
+        t1 <- typeCheck e1
+        let 
+            tcfs [] tsfields = do
+                unify TEvent (TDot t1 (foldr1 TDot (reverse tsfields)))
+                ensureIsProc e2
+            tcfs (f:fs) tsfields =
+                typeCheckField f (\ t -> tcfs fs (t:tsfields))
+        tcfs fields []
+
+    typeCheck' (LinkParallel e1 ties stmts e2) = do
+        ensureIsProc e1
+        ensureIsProc e2
+        typeCheckReplicatedOp stmts $ do
+            let (as, bs) = unzip ties
+            ast <- mapM ensureIsChannel as
+            zipWithM typeCheckExpect bs ast
+            return TProc
+
+    typeCheck' (Rename e1 exps stmts) = do
+        ensureIsProc e1
+        typeCheckReplicatedOp stmts $ do
+            let (as, bs) = unzip exps
+            -- Unify the pairs of channels
+            ast <- mapM ensureIsChannel as
+            zipWithM typeCheckExpect bs ast
+            return TProc
+            
+    -- Replicated Operators
+    typeCheck' (ReplicatedAlphaParallel stmts alpha proc) =
+        typeCheckReplicatedOp stmts $ do
+            t1 <- typeCheck alpha
+            unify (TSet TEvent) t1
+            ensureIsProc proc
+    typeCheck' (ReplicatedParallel alpha stmts proc) =
+        typeCheckReplicatedOp stmts $ do
+            typeCheckExpect alpha (TSet TEvent)
+            ensureIsProc proc
+    typeCheck' (ReplicatedLinkParallel ties stmts proc) = 
+        typeCheckStmts TSeq stmts $ do
+            let (as, bs) = unzip ties
+            ast <- mapM ensureIsChannel as
+            zipWithM typeCheckExpect bs ast
+            ensureIsProc proc
+    typeCheck' (ReplicatedInterleave stmts e1) =
+        typeCheckReplicatedOp stmts (ensureIsProc e1)
+    typeCheck' (ReplicatedExternalChoice stmts e1) =
+        typeCheckReplicatedOp stmts (ensureIsProc e1)
+    typeCheck' (ReplicatedInternalChoice stmts e1) =
+        typeCheckReplicatedOp stmts (ensureIsProc e1)
+    typeCheck' x = panic ("No case for type checking a "++show x)
+
+
+typeCheckField :: PField -> (Type -> TypeCheckMonad a) -> TypeCheckMonad a
+typeCheckField field tc = 
+    let
+        errCtxt = hang (text "In the field:") tabWidth (prettyPrint field)
+        checkInput p e = do
+            t <- typeCheck e
+            fvs <- freeVars p
+            local fvs $ do
+                tp <- addErrorContext errCtxt (do
+                        tp <- typeCheck p
+                        unify (TSet tp) t
+                        return tp)
+                tc tp
+        chkInputNoSet p = do
+            fvs <- freeVars p
+            local fvs (addErrorContext errCtxt (typeCheck p) >>= tc)
+        check (NonDetInput p (Just e)) = checkInput p e
+        check (Input p (Just e)) = checkInput p e
+        check (NonDetInput p Nothing) = chkInputNoSet p
+        check (Input p Nothing) = chkInputNoSet p
+        check (Output e) = addErrorContext errCtxt (typeCheck e) >>= tc
+    in setSrcSpan (loc field) (check (unAnnotate field))
+
+-- | The first argument is a type constructor, which given a type, returns
+-- that type encapsulate in some other type.
+typeCheckStmt :: (Type -> Type) -> PStmt -> TypeCheckMonad a -> TypeCheckMonad a
+typeCheckStmt typc stmt tc = 
+    let
+        errCtxt = hang (text "In the statement of a comprehension:") tabWidth
+                        (prettyPrint stmt)
+        
+        check (Qualifier e) = do
+            addErrorContext errCtxt (ensureIsBool e)
+            tc
+        check (Generator p exp) = do
+            fvs <- freeVars p
+            texp <- addErrorContext errCtxt (typeCheck exp)
+            local fvs $ do
+                addErrorContext errCtxt (do
+                    tpat <- typeCheck p
+                    unify (typc tpat) texp)
+                tc
+    in setSrcSpan (loc stmt) (check (unAnnotate stmt))
+
+-- | Type check a series of statements. For each statement a new scope is added
+-- to ensure that clauses only depend on variables already bound.
+typeCheckStmts :: (Type -> Type) -> [AnStmt] -> TypeCheckMonad a -> TypeCheckMonad a
+typeCheckStmts typc stmts tc = do
+        fvsByStmt <- mapM (\stmt -> do
+                fvs <- freeVars stmt
+                return (stmt, fvs)) stmts
+        let 
+            fvs = concatMap snd fvsByStmt
+            namesToLocations = 
+                [(n, loc f) | (f, fvs) <- fvsByStmt, n <- fvs]
+        -- Throw an error if a name is defined multiple times
+        manyErrorsIfFalse (noDups fvs) 
+            (duplicatedDefinitionsMessage namesToLocations)
+        check stmts
+    where
+        check [] = tc
+        check (stmt:stmts) = typeCheckStmt typc stmt (check stmts)
+
+-- | Shortcut for replicated operators
+typeCheckReplicatedOp :: [AnStmt] -> TypeCheckMonad a -> TypeCheckMonad a
+typeCheckReplicatedOp = typeCheckStmts TSet
diff --git a/src/CSPM/TypeChecker/InteractiveStmt.hs b/src/CSPM/TypeChecker/InteractiveStmt.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/InteractiveStmt.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, TypeSynonymInstances #-}
+module CSPM.TypeChecker.InteractiveStmt where
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Syntax
+import CSPM.DataStructures.Types
+import CSPM.TypeChecker.Common
+import CSPM.TypeChecker.Decl
+import CSPM.TypeChecker.Expr
+import CSPM.TypeChecker.Monad
+import CSPM.TypeChecker.Unification
+import Util.Annotated
+import Util.PrettyPrint
+
+instance TypeCheckable PInteractiveStmt () where
+    errorContext a = Nothing
+    typeCheck' = typeCheck . unAnnotate
+
+instance TypeCheckable InteractiveStmt () where
+    errorContext a = Nothing
+    typeCheck' (Bind decl) = typeCheckDecls [decl]
+    typeCheck' (Evaluate exp) = 
+        typeCheck exp >>= evaluateDots >> return ()
+    typeCheck' (RunAssertion a) = typeCheck a >> return ()
diff --git a/src/CSPM/TypeChecker/Module.hs b/src/CSPM/TypeChecker/Module.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/Module.hs
@@ -0,0 +1,21 @@
+{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances #-}
+module CSPM.TypeChecker.Module where
+
+import CSPM.DataStructures.Syntax
+import CSPM.DataStructures.Types
+import CSPM.TypeChecker.Common
+import CSPM.TypeChecker.Decl
+import CSPM.TypeChecker.Monad
+import Util.Annotated
+
+instance TypeCheckable [PModule] () where
+    errorContext _ = Nothing
+    typeCheck' ([m]) = typeCheck m
+
+instance TypeCheckable PModule () where
+    errorContext _ = Nothing
+    typeCheck' an =  setSrcSpan (loc an) $ typeCheck' (inner an)
+
+instance TypeCheckable Module () where
+    errorContext _ = Nothing
+    typeCheck' (GlobalModule ds) = typeCheckDecls ds
diff --git a/src/CSPM/TypeChecker/Monad.hs b/src/CSPM/TypeChecker/Monad.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/Monad.hs
@@ -0,0 +1,373 @@
+module CSPM.TypeChecker.Monad (
+    readTypeRef, writeTypeRef, freshTypeVar, freshTypeVarWithConstraints,
+    getType, safeGetType, setType, 
+    isDeprecated, isTypeUnsafe, markAsDeprecated, markTypeAsUnsafe,
+    compress, compressTypeScheme, 
+    
+    TypeCheckMonad, runTypeChecker, 
+    newTypeInferenceState,  TypeInferenceState(..), getState,
+    
+    local, getEnvironment,
+    ErrorContext, addErrorContext, getErrorContexts,
+    getSrcSpan, setSrcSpan,
+    getUnificationStack, addUnificationPair,
+    symmetricUnificationAllowed, disallowSymmetricUnification,
+    getInError, setInError,
+    resetWarnings, getWarnings, addWarning,
+    
+    raiseMessageAsError, raiseMessagesAsError, panic,
+    manyErrorsIfFalse, errorIfFalseM, errorIfFalse, tryAndRecover, failM,
+    
+    addDataTypeOrChannel, isDataTypeOrChannel,
+)
+where
+
+import Control.Monad.State
+import Prelude hiding (lookup)
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Types
+import qualified CSPM.TypeChecker.Environment as Env
+import CSPM.TypeChecker.Exceptions
+import Util.Annotated
+import Util.Exception
+import Util.PrettyPrint
+
+-- *************************************************************************
+-- Type Checker Monad
+-- *************************************************************************
+type ErrorContext = Doc
+
+data TypeInferenceState = TypeInferenceState {
+        -- | The type environment, which is a map from names to types.
+        environment :: Env.Environment,
+        -- | List of names that correspond to channels and
+        -- datatypes - used when detecting dependencies.
+        dataTypesAndChannels :: [Name],
+        -- | Next TypeVar to be allocated
+        nextTypeId :: Int,
+        -- | Location of the current AST element - used for error
+        -- pretty printing
+        srcSpan :: SrcSpan,
+        -- | Error stack - provides context information for any
+        -- errors that might be raised
+        errorContexts :: [ErrorContext],
+        -- | Errors that have occured
+        errors :: [ErrorMessage],
+        -- | List of warnings that have occured
+        warnings :: [ErrorMessage],
+        -- | Stack of attempted unifications - the current one
+        -- is at the front. In the form (expected, actual).
+        unificationStack :: [(Type, Type)],
+        -- | Are we currently in an error state
+        inError :: Bool,
+        symUnificationAllowed :: Bool
+    }
+    
+newTypeInferenceState :: TypeInferenceState
+newTypeInferenceState = TypeInferenceState {
+        environment = Env.new,
+        dataTypesAndChannels = [],
+        nextTypeId = 0,
+        srcSpan = Unknown,
+        errorContexts = [],
+        errors = [],
+        warnings = [],
+        unificationStack = [],
+        inError = False,
+        symUnificationAllowed = True
+    }
+
+type TypeCheckMonad = StateT TypeInferenceState IO
+
+-- | Runs the typechecker, starting from state 'st'. If any errors are
+-- encountered then a 'SourceError' will be thrown with the relevent
+-- error messages.
+runTypeChecker :: TypeInferenceState -> TypeCheckMonad a -> IO a
+runTypeChecker st prog = do
+    (a, st) <- runStateT prog st
+    let errs = errors st
+    case errs of
+        [] -> return a
+        _ -> throwSourceError errs
+
+getState :: TypeCheckMonad TypeInferenceState
+getState = gets id
+
+getEnvironment :: TypeCheckMonad Env.Environment
+getEnvironment = gets environment
+
+setEnvironment :: Env.Environment -> TypeCheckMonad ()
+setEnvironment env = modify (\ st -> st { environment = env })
+
+local :: [Name] -> TypeCheckMonad a -> TypeCheckMonad a
+local ns m = 
+    do
+        env <- getEnvironment
+        newArgs <- replicateM (length ns) freshTypeVar
+        let symbs = map (Env.mkSymbolInformation . ForAll []) newArgs
+        setEnvironment (Env.newLayerAndBind env (zip ns symbs))
+        
+        res <- m
+        
+        env <- getEnvironment
+        setEnvironment (Env.popLayer env)
+
+        return res
+
+addDataTypeOrChannel :: Name -> TypeCheckMonad ()
+addDataTypeOrChannel n = modify (\ st -> st { 
+        dataTypesAndChannels = n:dataTypesAndChannels st
+    })
+
+isDataTypeOrChannel :: Name -> TypeCheckMonad Bool
+isDataTypeOrChannel n = do
+    ns <- gets dataTypesAndChannels
+    return $ n `elem` ns
+
+getErrorContexts :: TypeCheckMonad [ErrorContext]
+getErrorContexts = gets errorContexts
+
+addErrorContext :: ErrorContext -> TypeCheckMonad a -> TypeCheckMonad a
+addErrorContext c p = do
+    ctxts <- getErrorContexts
+    modify (\st -> st { errorContexts = c:ctxts })
+    a <- p
+    modify (\st -> st { errorContexts = ctxts })
+    return a
+    
+getErrors :: TypeCheckMonad ErrorMessages
+getErrors = gets errors
+
+addErrors :: [ErrorMessage] -> TypeCheckMonad ()
+addErrors es = modify (\ st -> st { errors = es++(errors st) })
+
+getWarnings :: TypeCheckMonad [ErrorMessage]
+getWarnings = gets warnings
+
+resetWarnings :: TypeCheckMonad ()
+resetWarnings = modify (\st -> st { warnings = [] })
+
+addWarning :: Warning -> TypeCheckMonad ()
+addWarning w = do
+    src <- getSrcSpan
+    let m = mkWarningMessage src w
+    modify (\ st -> st { warnings = m:(warnings st) })
+
+getInError :: TypeCheckMonad Bool
+getInError = gets inError
+
+setInError :: Bool -> TypeCheckMonad a -> TypeCheckMonad a
+setInError b prog = do
+    o <- getInError
+    modify (\st -> st { inError = b })
+    a <- prog
+    modify (\st -> st { inError = o })
+    return a
+
+getSrcSpan :: TypeCheckMonad SrcSpan
+getSrcSpan = gets srcSpan
+
+-- | Sets the SrcSpan only within prog.
+setSrcSpan :: SrcSpan -> TypeCheckMonad a -> TypeCheckMonad a
+setSrcSpan loc prog = do
+    oLoc <- getSrcSpan
+    modify (\st -> st { srcSpan = loc })
+    a <- prog
+    modify (\st -> st { srcSpan = oLoc })
+    return a
+
+getUnificationStack :: TypeCheckMonad [(Type, Type)]
+getUnificationStack = gets unificationStack
+
+addUnificationPair :: (Type, Type) -> TypeCheckMonad a -> TypeCheckMonad a
+addUnificationPair tp p = do
+    stk <- getUnificationStack
+    modify (\st -> st { unificationStack = tp:stk })
+    a <- p
+    modify (\ st -> st { unificationStack = stk })
+    return a
+
+symmetricUnificationAllowed :: TypeCheckMonad Bool
+symmetricUnificationAllowed = gets symUnificationAllowed
+
+disallowSymmetricUnification :: TypeCheckMonad a -> TypeCheckMonad a
+disallowSymmetricUnification prog = do
+    b <- symmetricUnificationAllowed
+    modify (\st -> st { symUnificationAllowed = False })
+    v <- prog
+    modify (\st -> st { symUnificationAllowed = b })
+    return v
+    
+-- Error handling
+
+-- | Report the error if first parameter is False.
+errorIfFalse :: Bool -> Error -> TypeCheckMonad ()
+errorIfFalse b e = manyErrorsIfFalse b [e]
+
+manyErrorsIfFalse :: Bool -> [Error] -> TypeCheckMonad ()
+manyErrorsIfFalse True es = return ()
+manyErrorsIfFalse False es = raiseMessagesAsError es
+
+errorIfFalseM :: TypeCheckMonad Bool -> Error -> TypeCheckMonad ()
+errorIfFalseM m e = m >>= \res -> errorIfFalse res e
+
+failM :: TypeCheckMonad a
+failM = do
+    errs <- getErrors
+    throwSourceError errs
+
+raiseMessageAsError :: Error -> TypeCheckMonad a
+raiseMessageAsError msg = raiseMessagesAsError [msg]
+
+-- | Report a message as an error
+raiseMessagesAsError :: [Error] -> TypeCheckMonad a
+raiseMessagesAsError msgs = do
+    src <- getSrcSpan
+    ctxts <- getErrorContexts
+    let ctxtDocs = ctxts
+    let contextMsg = trimAndRenderContexts maxContexts ctxtDocs
+    addErrors [mkErrorMessage src (msg $$ contextMsg) | msg <- msgs]
+    failM
+    where
+        -- Don't print too much context
+        trimAndRenderContexts 0 _ = empty
+        trimAndRenderContexts n [] = empty
+        trimAndRenderContexts n (doc:docs) = 
+            doc $$ trimAndRenderContexts (n-1) docs
+        maxContexts = 3
+
+tryAndRecover :: 
+    TypeCheckMonad a -> TypeCheckMonad a -> TypeCheckMonad a
+tryAndRecover prog handler = tryM prog >>= \x ->
+    case x of
+        Right a -> return a
+        Left ex -> case ex of
+            SourceError msgs -> do
+                -- The errors will be discarded as the errors propogate up.
+                -- Hence, we reset them.
+                setErrors msgs
+                handler
+            UserError -> handler
+            -- An exception type we don't want to interfer with
+            e           -> throwException e
+    where
+        setErrors :: ErrorMessages -> TypeCheckMonad ()
+        setErrors es = modify (\ st -> st { errors = es })  
+
+
+-- *************************************************************************
+-- Type Operations
+-- *************************************************************************
+readTypeRef :: TypeVarRef -> TypeCheckMonad (Either (TypeVar, [Constraint]) Type)
+readTypeRef (TypeVarRef tv cs ioref) = 
+    do
+        mtyp <- readPType ioref
+        case mtyp of
+            Just t  -> return (Right t)
+            Nothing -> return (Left (tv, cs))
+
+writeTypeRef :: TypeVarRef -> Type -> TypeCheckMonad ()
+writeTypeRef (TypeVarRef tv cs ioref) t = setPType ioref t
+
+freshTypeVar :: TypeCheckMonad Type
+freshTypeVar = freshTypeVarWithConstraints []
+
+freshTypeVarWithConstraints :: [Constraint] -> TypeCheckMonad Type
+freshTypeVarWithConstraints cs =
+    do
+        nextId <- gets nextTypeId
+        modify (\s -> s { nextTypeId = nextId+1 })
+        ioRef <- freshPType
+        return $ TVar (TypeVarRef (TypeVar nextId) cs ioRef)
+
+getSymbolInformation :: Name -> TypeCheckMonad Env.SymbolInformation
+getSymbolInformation n = do
+    env <- gets environment
+    -- Force evaluation of lookup n
+    -- If we don't do this the error is deferred until later
+    case Env.maybeLookup env n of
+        Just symb -> return symb
+        Nothing -> raiseMessagesAsError [varNotInScopeMessage n]
+
+-- | Get the type of 'n' and throw an exception if it doesn't exist.
+getType :: Name -> TypeCheckMonad TypeScheme
+getType n = do
+    symb <- getSymbolInformation n
+    return $ Env.typeScheme symb
+
+-- | Get the type of 'n' if it exists, othewise return Nothing.
+safeGetType :: Name -> TypeCheckMonad (Maybe TypeScheme)
+safeGetType n = do
+    env <- gets environment
+    case Env.maybeLookup env n of
+        Just symb   -> return $ Just $ Env.typeScheme symb
+        Nothing     -> return Nothing
+    
+-- | Sets the type of n to be t in the current scope only. No unification is 
+-- performed.
+setType :: Name -> TypeScheme -> TypeCheckMonad ()
+setType n t = do
+    env <- getEnvironment
+    let 
+        symb = case Env.maybeLookupInTopLayer env n of
+            Just symb -> symb { Env.typeScheme = t }
+            Nothing -> Env.mkSymbolInformation t
+    setSymbolInformation n symb
+
+setSymbolInformation :: Name -> Env.SymbolInformation -> TypeCheckMonad ()
+setSymbolInformation n symb = do
+    env <- getEnvironment
+    setEnvironment (Env.update env n symb)
+
+isDeprecated :: Name -> TypeCheckMonad Bool
+isDeprecated n = do
+    symb <- getSymbolInformation n
+    return $ Env.isDeprecated symb
+
+isTypeUnsafe :: Name -> TypeCheckMonad Bool
+isTypeUnsafe n = do
+    symb <- getSymbolInformation n
+    return $ Env.isTypeUnsafe symb
+
+markAsDeprecated :: Name -> TypeCheckMonad ()
+markAsDeprecated n = do
+    symb <- getSymbolInformation n
+    setSymbolInformation n (symb { Env.isDeprecated = True })
+markTypeAsUnsafe :: Name -> TypeCheckMonad ()
+markTypeAsUnsafe n = do
+    symb <- getSymbolInformation n
+    setSymbolInformation n (symb { Env.isTypeUnsafe = True })
+
+-- | Apply compress to the type of a type scheme.
+compressTypeScheme :: TypeScheme -> TypeCheckMonad TypeScheme
+compressTypeScheme (ForAll ts t) = 
+    do
+        t' <- compress t
+        return $ ForAll ts t'
+
+-- | Takes a type and compresses the type by reading all type variables and
+-- if they point to another type, it returns that type instead.
+compress :: Type -> TypeCheckMonad Type
+compress (tr @ (TVar typeRef)) = do
+    res <- readTypeRef typeRef
+    case res of
+        Left tv -> return tr
+        Right t -> compress t
+compress (TFunction targs tr) = do
+    targs' <- mapM compress targs
+    tr' <- compress tr
+    return $ TFunction targs' tr'
+compress (TSeq t) = compress t >>= return . TSeq
+compress (TSet t) = compress t >>= return . TSet
+compress (TTuple ts) = mapM compress ts >>= return . TTuple
+compress (TDotable t1 t2)= do
+    t1' <- compress t1
+    t2' <- compress t2
+    return $ TDotable t1' t2'
+compress (TDatatype n) = return $ TDatatype n
+compress (TDot t1 t2) = do
+    t1' <- compress t1
+    t2' <- compress t2
+    return $ TDot t1' t2'
+compress t = return t
diff --git a/src/CSPM/TypeChecker/Pat.hs b/src/CSPM/TypeChecker/Pat.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/Pat.hs
@@ -0,0 +1,60 @@
+{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances #-}
+module CSPM.TypeChecker.Pat () where
+
+import CSPM.DataStructures.Syntax hiding (getType)
+import CSPM.DataStructures.Types
+import CSPM.TypeChecker.Common
+import CSPM.TypeChecker.Monad
+import CSPM.TypeChecker.Unification
+import Util.Annotated
+import Util.PrettyPrint
+    
+instance TypeCheckable PPat Type where
+    errorContext an = Nothing
+    typeCheck' an = setSrcSpan (loc an) $ typeCheck (inner an)
+    typeCheckExpect an typ =
+        setSrcSpan (loc an) (typeCheckExpect (inner an) typ)
+instance TypeCheckable Pat Type where
+    typeCheckExpect obj texp =
+        case errorContext obj of
+            Just c -> addErrorContext c m
+            Nothing -> m
+        where
+            m = do
+                tact <- typeCheck' obj
+                unify texp tact
+
+    errorContext p = Just $
+        hang (text "In the pattern" <> colon) tabWidth (prettyPrint p)
+
+    typeCheck' (PConcat p1 p2) = do
+        t <- ensureIsList p1
+        typeCheckExpect p2 t
+    typeCheck' (PDoublePattern p1 p2) = do
+        t <- typeCheck p1
+        typeCheckExpect p2 t
+    typeCheck' (PDotApp p1 p2) = do
+        t1 <- typeCheck p1
+        t2 <- typeCheck p2
+        return $ TDot t1 t2
+    typeCheck' (PList ps) = do
+        t <- ensureAreEqual ps
+        return $ TSeq t
+    typeCheck' (PLit lit) = typeCheck lit
+    typeCheck' (PParen p1) = typeCheck p1
+    typeCheck' (PSet ps) = do
+-- TODO: add to desugarer
+--      errorIfFalse (length ps <= 1) (InvalidSetPattern ps)
+        t <- ensureAreEqual ps
+        ensureHasConstraint Eq t
+        return $ TSet t
+    typeCheck' (PTuple ps) = do
+        ts <- mapM typeCheck ps
+        return $ TTuple ts
+    typeCheck' (PWildCard) = freshTypeVar
+    typeCheck' (PVar n) = do
+        t @ (ForAll _ t') <- getType n
+        -- All variables are already in scope hence we can just return the
+        -- type (since we always typeCheck a pattern in between a 
+        -- local (freeVars pat)).
+        return t'
diff --git a/src/CSPM/TypeChecker/Unification.hs b/src/CSPM/TypeChecker/Unification.hs
new file mode 100644
--- /dev/null
+++ b/src/CSPM/TypeChecker/Unification.hs
@@ -0,0 +1,571 @@
+{-# LANGUAGE DoAndIfThenElse #-}
+module CSPM.TypeChecker.Unification (
+    generaliseGroup, instantiate, unify, unifyAll, evaluateDots,
+    typeToDotList,
+) where
+
+import Control.Monad
+import Control.Monad.Trans
+import Data.List (nub, (\\), intersect, group, sort)
+import Prelude
+
+import CSPM.DataStructures.Names
+import CSPM.DataStructures.Types
+import CSPM.TypeChecker.Environment
+import CSPM.TypeChecker.Exceptions
+import CSPM.TypeChecker.Monad
+import Util.Exception
+import Util.Monad
+import Util.PrettyPrint
+
+-- | Return the free type variables (and their constraints) for all 'TypeVar's 
+-- that occur in 'Type'.
+freeTypeVars :: Type -> TypeCheckMonad [(TypeVar, [Constraint])]
+freeTypeVars = liftM nub . freeTypeVars'    
+freeTypeVars' :: Type -> TypeCheckMonad [(TypeVar, [Constraint])]
+freeTypeVars' (TVar tv) = do
+    typ <- readTypeRef tv
+    case typ of
+        Left (tv, cs)   -> return [(tv, cs)]
+        Right t         -> freeTypeVars' t
+freeTypeVars' (TFunction targs tr) = 
+    liftM concat (mapM freeTypeVars' (tr:targs))
+freeTypeVars' (TSeq t) = freeTypeVars' t
+freeTypeVars' (TSet t) = freeTypeVars' t
+freeTypeVars' (TTuple ts) = liftM concat (mapM freeTypeVars' ts)
+freeTypeVars' (TDotable t1 t2) = liftM concat (mapM freeTypeVars' [t1,t2])
+freeTypeVars' (TDot t1 t2) = liftM concat (mapM freeTypeVars' [t1,t2])
+freeTypeVars' (TDatatype n1) = return []
+freeTypeVars' TInt = return []
+freeTypeVars' TBool = return []
+freeTypeVars' TEvent = return []
+freeTypeVars' TEventable = return []
+freeTypeVars' TProc = return []
+
+-- | Generalise the types of the declarations. The parameter 'names' gives the 
+-- names that were bound by all the declarations that we are interested in. This
+-- is done because we convert a type T into forall vs T where 
+--      vs = fvts (T) - fvts(Env)
+-- where Env does not contain the function whose type we are generalizing
+-- (this is because when we type a declaration we are really typing a 
+-- lambda function).
+generaliseGroup :: [Name] -> [TypeCheckMonad [(Name, Type)]] -> 
+                    TypeCheckMonad [[(Name, TypeScheme)]]
+generaliseGroup names tsm = do
+    -- Perform the type checking
+    ts <- sequence tsm
+    env <- getEnvironment
+    -- Get all the free variables that are currently in the environment that 
+    -- were not bound by any of this group.
+    envfvs <- (liftM nub . concatMapM freeTypeVars)
+            [t | (n, SymbolInformation { 
+                        typeScheme = ForAll _ t 
+                }) <- flatten env, not (n `elem` names)]
+    mapM (\ nts -> mapM (\ (n,t) -> do
+        -- The free vars in this type
+        deffvs <- freeTypeVars t
+        -- All the free variables that were actually bound by this declaration 
+        -- (rather than some other declaration in the environment).
+        let 
+            unboundVars = 
+                filter (\ (fv, cs) -> not (fv `elem` map fst envfvs)) deffvs
+            ts = ForAll unboundVars t
+        setType n ts
+        return (n, ts)) nts) ts
+
+-- | Instantiates the typescheme with some fresh type variables.
+instantiate :: TypeScheme -> TypeCheckMonad Type
+instantiate (ForAll ts t) = do
+    tvs <- mapM (freshTypeVarWithConstraints . snd) ts
+    foldM (\ x y -> substituteType y x) t (zip (map fst ts) tvs)
+        
+-- | Does 'a' occur somewhere in 't'.
+occurs :: TypeVar -> Type -> TypeCheckMonad Bool
+occurs a (TVar (tvref @ (TypeVarRef tv _ _))) = do
+    res <- readTypeRef tvref
+    case res of 
+        Left (tv,cs)-> return $ a == tv
+        Right t     -> occurs a t
+occurs a (TSet t) = occurs a t
+occurs a (TSeq t) = occurs a t
+occurs a (TDot t1 t2) = liftM or (mapM (occurs a) [t1,t2])
+occurs a (TTuple ts) = liftM or (mapM (occurs a) ts)
+occurs a (TFunction ts t) = liftM or (mapM (occurs a) (t:ts))
+occurs a (TDatatype n) = return False
+occurs a (TDotable t1 t2) = liftM or (mapM (occurs a) [t1,t2])
+occurs a TInt = return False
+occurs a TBool = return False
+occurs a TProc = return False
+occurs a TEvent = return False
+occurs a TEventable = return False
+
+-- | Unifys all types to a single type. The first type is  used as the 
+-- expected Type in error messages.
+unifyAll :: [Type] -> TypeCheckMonad Type
+unifyAll [] = freshTypeVar
+unifyAll [t] = return t
+unifyAll (t1:ts) = do
+    t2 <- unifyAll ts
+    unify t1 t2
+
+-- | Takes a constraint and a type and returns True iff the type satisfies the
+-- constraint, or can be made to satsify the constraint by appropriate type
+-- substitutions, in which case the type substitutions are performed.
+unifyConstraint :: Constraint -> Type -> TypeCheckMonad Bool
+unifyConstraint c (TVar v) = do
+    res <- readTypeRef v
+    case res of
+        Left (tva, cs)  -> 
+            if c `elem` cs then return True else do
+                fv <- freshTypeVarWithConstraints (nub (c:cs))
+                applySubstitution v fv
+                return True
+        Right t         -> unifyConstraint c t
+unifyConstraint c TInt = return True
+unifyConstraint Eq TBool = return True -- Bools are not orderable P524
+unifyConstraint c (TSeq t) = unifyConstraint c t
+unifyConstraint c (TDot t1 t2) = liftM and (mapM (unifyConstraint c) [t1,t2])
+unifyConstraint c (TSet t) = return True -- All set elements must support comparison
+unifyConstraint c (TTuple ts) = liftM and (mapM (unifyConstraint c) ts)
+unifyConstraint Eq TEvent = return True -- Events comparable only
+unifyConstraint Eq TEventable = return True -- ditto
+unifyConstraint Eq (TDotable a b) = -- channels and datatypes are only dotable things
+    liftM and (mapM (unifyConstraint Eq) [a,b])
+unifyConstraint Eq (TDatatype n) = return True
+    -- User data types are not orderable P524
+unifyConstraint c t = 
+    raiseMessageAsError $ constraintUnificationErrorMessage c t
+
+
+-- | Takes a type and converts TDot t1 t2 to [t1, t2].
+typeToDotList :: Type -> TypeCheckMonad [Type]
+typeToDotList t = compress t >>= \ t ->
+    case t of
+        TDot t1 t2 -> do
+            (t:ts1) <- typeToDotList t1
+            ts2 <- typeToDotList t2
+            return (t:ts1++ts2)
+        _   -> return [t]
+
+-- | Takes a 'TDotable' and returns a tuple consisting of:
+-- the arguments that it takes and the ultimate return type. Note
+-- that due to the way that TDotables are introduced the return type
+-- is guaranteed to be simple.
+-- This requires that its argument is compressed.
+reduceDotable :: Type -> ([Type], Type)
+reduceDotable (TDotable argt rt) = 
+    let (args, urt) = reduceDotable rt in (argt:args, urt)
+reduceDotable x = ([], x)
+
+-- | We convert all TDotable (TDot t1 t2) to 
+-- TDotable t1 (TDotable t2...). Thus every argument of a TDotable
+-- is not a TDot.
+toNormalForm :: Type -> Type
+toNormalForm (TDotable (TDot t1 t2) rt) = 
+    toNormalForm (TDotable t1 (TDotable t2 rt))
+-- Hence, t1 is atomic (of some sort)
+toNormalForm (TDotable t1 (TDotable t2 rt)) = 
+    TDotable t1 (toNormalForm (TDotable t2 rt))
+toNormalForm x = x
+
+isVar :: Type -> Bool
+isVar (TVar _) = True
+isVar _ = False
+
+isDotable :: Type -> Bool
+isDotable (TDotable _ _) = True
+isDotable _ = False
+
+isSimple :: Type -> Bool
+isSimple a = not (isDotable a) && not (isVar a)
+
+-- Assumption, argument of TDotable is always simple
+-- and that result of TDotable is either another TDotable or
+-- simple.
+
+-- Also, we assume that if a type list is of the form 
+-- [TDotable argt rt, arg] then arg must contribute to argt (though 
+-- obviously argt could itself by a TDotable). In reality, this means
+-- that we prohibit definitions such as:
+--   datatype A = B.{0..1}
+-- f(x) = B.true
+-- Intuitively this can be thought of as prohibiting dots usage
+-- as a functional programming construct.
+
+-- | Takes two type lists and unifies them into one type list.
+combineTypeLists :: [Type] -> [Type] -> TypeCheckMonad [Type]
+combineTypeLists [] [] = return []
+
+-- If either of the front components is a TDot, compute the dot list.
+combineTypeLists ((TDot a1 a2):as) bs = do
+    ts <- typeToDotList (TDot a1 a2)
+    combineTypeLists (ts++as) bs
+combineTypeLists as ((TDot b1 b2):bs) = do
+    ts <- typeToDotList (TDot b1 b2)
+    combineTypeLists as (ts++bs)
+
+-- If one type list has just one component left then this must be equal
+-- to the dotted type of the other.
+combineTypeLists (a:as) [b] = do
+    -- IMPORTANT: The expected type is b
+    t <- unify b (foldr1 TDot (a:as))
+    return [t]
+combineTypeLists [a] (b:bs) = do
+    -- IMPORTANT The expected type is a
+    t <- unify a (foldr1 TDot (b:bs))
+    return [t]
+
+-- Hence, as /= [], bs /= []
+
+-- Otherwise, if both arguments are simple, and not equal to TDot,
+-- then we can just unify them.
+-- Note, if the first item in the list is a var, and b is not dotable 
+-- then, providing there is another item after the var, (by the shortest
+-- match rule) we unify the var and b.
+combineTypeLists (a:as) (b:bs) | not (isDotable a) && not (isDotable b) = do
+    t <- unify a b
+    ts <- combineTypeLists as bs
+    return (t:ts)
+
+-- ASSUMPTION: argt is not a TDot, or a TDotable. 
+
+-- Otherwise, if the head of one of the lists is dotable then we proceed
+-- as follows
+combineTypeLists ((a0@(TDotable argt rt)):a:as) (b:bs)
+    | (isSimple a || (isVar a && as /= [])) = do
+        -- By assumption a is not a TDot and so either, a is simple and
+        -- hence we unify argt and a or, it is a var. Then, providing 
+        -- as /= [] we can use the shortest match rule to justify 
+        -- matching with just with one component.
+        unify argt a
+        combineTypeLists (rt:as) (b:bs)
+    | isVar a = do
+        -- as == [] otherwise the above case applies. Hence, we need to 
+        -- set a to be equal to the args necessary to remove all 
+        -- TDotables from the front, plus any extension needed in order
+        -- to make it match (b:bs). Firstly, compute what the ultimate
+        -- return type (urt) and args to get this will be.
+        let (args, urt) = reduceDotable (TDotable argt rt)
+        -- As urt is simple it immediately follows that the length of
+        -- the urt type list is 1. Therefore, even if bs has a var on 
+        -- the end we still want the b:bs type list to be as short as
+        -- possible (and thus don't need to extend it). Hence, we can
+        -- use the evalTypeListList function.
+        t:ts <- evalTypeList (b:bs)
+        -- The first type in this list must be equal to urt
+        t1 <- unify urt t
+        -- We want to set the var a to all the args, plus any extension
+        -- from bs
+        combineTypeLists (args++ts) [a]
+        return (t1:ts)
+    -- Else, a is not simple, or a var. Hence is a TDotable. 
+    | isDotable a = do
+        -- Compute the ultimate return type of A, and the args to get 
+        -- to it.
+        let (argsA, rtA) = reduceDotable a
+        -- We know rtA has to be the same type as argt
+        unify argt rtA
+        -- Hence, if we can find all the arguments required to produce
+        -- rtA then, we can produce rt. Thus we reduce as follows.
+        combineTypeLists (foldr TDotable rt argsA : as) (b:bs)
+
+-- Symmetric case of above
+combineTypeLists (a:as) ((TDotable argt rt):b:bs)
+    | (isSimple b || (isVar b && bs /= [])) = do
+        unify argt b
+        combineTypeLists (rt:bs) (a:as)
+    | isVar b = do
+        let (args, urt) = reduceDotable (TDotable argt rt)
+        t:ts <- evalTypeList (a:as)
+        t1 <- unify urt t
+        combineTypeLists (args++ts) [b]
+        return (t1:ts)
+    | isDotable b = do
+        let (argsB, rtB) = reduceDotable b
+        unify argt rtB
+        combineTypeLists (foldr TDotable rt argsB : bs) (a:as)
+
+-- TODO: explain why we can't do the unification (it may be because of
+-- a type error, but may well be because of an unsupported type list).
+combineTypeLists as bs = raiseUnificationError True
+
+
+
+
+-- | The main type unification algorithm. This adds values to the unification 
+-- stack in order to ensure error messages are helpful.
+unify :: Type -> Type -> TypeCheckMonad Type
+unify texp tact = do
+    addUnificationPair (texp, tact) (unifyNoStk texp tact)
+
+-- | Unifies the types but doesn't add a pair to the stack.
+unifyNoStk :: Type -> Type -> TypeCheckMonad Type
+unifyNoStk (TVar t1) (TVar t2) | t1 == t2 = 
+    return (TVar t1)
+unifyNoStk (TVar t1) (TVar t2) = do
+    res1 <- readTypeRef t1
+    res2 <- readTypeRef t2
+    case (res1, res2) of
+        (Left (tv1, cs1), Left (tv2,cs2)) -> do
+            fv <- freshTypeVarWithConstraints (nub (cs1 ++ cs2))
+            applySubstitution t1 fv
+            applySubstitution t2 fv
+            return fv
+        (Left _, Right t)       -> unify (TVar t1) t
+        (Right t, Left _)       -> unify t (TVar t2)
+        (Right t1, Right t2)    -> unify t1 t2
+unifyNoStk (TVar a) b = do
+    res <- readTypeRef a
+    case res of
+        Left (tva, cs)  -> do
+            res <- liftM and (mapM (\ c -> unifyConstraint c b) cs)
+            if res then applySubstitution a b
+            else raiseUnificationError False
+        Right t         -> unify t b
+unifyNoStk a (TVar b) = do
+    res <- readTypeRef b
+    case res of
+        Left (tvb, cs)  -> do
+            res <- liftM and (mapM (\ c -> unifyConstraint c a) cs)
+            if res then applySubstitution b a
+            else raiseUnificationError False
+        Right t         -> unify a t
+
+
+-- Type Atoms
+unifyNoStk TInt TInt = return TInt
+unifyNoStk TBool TBool = return TBool
+unifyNoStk TProc TProc = return TProc
+unifyNoStk TEvent TEvent = return TEvent
+unifyNoStk TEventable TEventable = return TEventable
+unifyNoStk TEvent TEventable = return TEvent
+unifyNoStk TEventable TEvent = return TEvent
+unifyNoStk (TDatatype n1) (TDatatype n2) 
+    | n1 == n2 = return $ TDatatype n1
+
+-- Simple cases
+unifyNoStk (TFunction ts1 rt1) (TFunction ts2 rt2) | length ts1 == length ts2 = do
+    ts <- zipWithM unify ts1 ts2
+    rt <- unify rt1 rt2
+    return $ TFunction ts rt
+unifyNoStk (TSeq t1) (TSeq t2) = do
+    t <- unify t1 t2
+    return $ TSeq t
+unifyNoStk (TSet t1) (TSet t2) = do
+    t <- unify t1 t2
+    return $ TSet t
+unifyNoStk (TTuple ts1) (TTuple ts2) | length ts1 == length ts2 = do
+    ts <- zipWithM unify ts1 ts2
+    return $ TTuple ts
+
+unifyNoStk (a@(TDotable _ _)) (b@(TDotable _ _)) = do
+    a <- compress a
+    b <- compress b
+    let
+        -- Compute the ultimate return types and the arguments required
+        -- to get to this return type
+        (argsA, rtA) = (reduceDotable . toNormalForm) a
+        (argsB, rtB) = (reduceDotable . toNormalForm) b
+    -- The return type of the combined dotable must be the unified version
+    -- of the return types
+    rt <- unify rtA rtB
+
+    case (rtA, rtB) of
+        (TEventable, TEventable) -> panic "TC: double eventable"
+        (TEventable, _) -> do
+            -- Firstly, evaluate each type list to reduce it; this means
+            -- that it will not have any terms like TDotable TInt ..., TInt..
+            as <- evalTypeList argsA
+            bs <- evalTypeList argsB
+            -- As the left argument is eventable we compute what arguments
+            -- would be required to make it into a TEventable (by computing
+            -- the ultimate return types of each element).
+            let as' = map (snd . reduceDotable . toNormalForm) as
+            -- These must be equal to the argument types that are required to
+            -- reach rtB, hence we unify.
+            zipWithM unify as' bs
+            -- The most general type will have the arguments of bs, rather
+            -- than the arguments of as (bs provide more information).
+            return $ TDotable (foldl1 TDot bs) rt
+        (_, TEventable) -> do
+            as <- evalTypeList argsA
+            bs <- evalTypeList argsB
+            let bs' = map (snd . reduceDotable . toNormalForm) bs
+            zipWithM unify as bs'
+            return $ TDotable (foldl1 TDot as) rt
+        (_, _) -> do
+            -- If neither is a TEventable then the args must be the same.
+            -- Hence, unify the two argument lists.
+            args <- combineTypeLists argsA argsB
+            return $ TDotable (foldl1 TDot args) rt
+
+unifyNoStk (TDot t1 t2) (TDot t1' t2') = do
+    a0 <- typeToDotList (TDot t1 t2)
+    b0 <- typeToDotList (TDot t1' t2')
+    let a = map toNormalForm a0
+    let b = map toNormalForm b0
+    ts <- combineTypeLists a b
+    return $ foldl1 TDot ts
+
+-- TDot + TEvent/TEventable/TDatatype/TDotable
+
+unifyNoStk (TDot t1 t2) (TDatatype n) = do
+    b <- symmetricUnificationAllowed
+    if not b then raiseUnificationError False else return ()
+    unify (TDotable t2 (TDatatype n)) t1
+    return $ TDatatype n
+
+unifyNoStk (TDatatype n) (TDot t1 t2) = do
+    unify (TDotable t2 (TDatatype n)) t1
+    return $ TDatatype n
+
+unifyNoStk (TDot t1 t2) TEvent = do
+    b <- symmetricUnificationAllowed
+    if not b then raiseUnificationError False else return ()
+    unify (TDotable t2 TEvent) t1
+    return TEvent
+
+unifyNoStk TEvent (TDot t1 t2) = do
+    unify (TDotable t2 TEvent) t1
+    return TEvent
+
+unifyNoStk (TDot t1 t2) TEventable = do
+    b <- symmetricUnificationAllowed
+    if not b then raiseUnificationError False else return ()
+    tl <- unify (TDotable t2 TEventable) t1
+    return $ TDot tl t2
+
+unifyNoStk TEventable (TDot t1 t2) = do
+    tl <- unify (TDotable t2 TEventable) t1
+    return $ TDot tl t2
+
+unifyNoStk (TDot t1 t2) (TDotable argt rt) = do
+    b <- symmetricUnificationAllowed
+    if not b then raiseUnificationError False else return ()
+    unify t1 (TDotable t2 (TDotable argt rt))
+    return $ TDotable argt rt
+
+unifyNoStk (TDotable argt rt) (TDot t1 t2) = do
+    unify (TDotable t2 (TDotable argt rt)) t1
+    return $ TDotable argt rt
+
+unifyNoStk (TDotable argt rt) TEventable = do
+    unify TEventable rt
+    return $ TDotable argt rt
+unifyNoStk TEventable (TDotable argt rt) = do
+    unify TEventable rt
+    return $ TDotable argt rt
+
+unifyNoStk t1 t2 = raiseUnificationError False
+
+-- | Raises a unification error. If the passed flag is True then 
+-- any dots are not evaluated in the error. This is to avoid infinite loops that
+-- can occur, for example, whilst unifiying:
+-- [TDotable TInt (TDatatype (Name "A")),TBool]
+-- [TDotable TInt (TDatatype (Name "A")),TBool]
+raiseUnificationError :: Bool -> TypeCheckMonad a
+raiseUnificationError isDotError = do
+    b <- getInError
+    if b then throwException $ UserError else setInError True $ do
+    ts <- getUnificationStack
+    cts <- mapM (\ (t1, t2) -> do
+        t1 <- compress t1
+        t2 <- compress t2
+        -- Try and tidy any dot lists
+        (t1, t2) <- tryAndRecover (do
+            t1 <- evaluateDots t1
+            t2 <- evaluateDots t2
+            return (t1, t2)) (return (t1,t2))
+        return (t1, t2)) ts
+    raiseMessageAsError $ unificationErrorMessage cts
+        
+-- Returns the type that we substitute for
+-- NB: in a quantified type we do not apply the substitution to any 
+-- quantified variables
+applySubstitution :: TypeVarRef -> Type -> TypeCheckMonad Type
+applySubstitution (tvref @ (TypeVarRef tv _ _)) typ = do
+    t' <- compress typ
+    b <- occurs tv typ
+    (b, t) <- if b then do
+            t <- evaluateDots t'
+            b <- occurs tv t
+            return (b,t)
+        else return (b, typ)
+    errorIfFalse (not b)
+        (infiniteUnificationMessage (TVar tvref) t')
+    writeTypeRef tvref t
+    return typ
+
+-- | Applies a subtitution directly to the type. This is used in
+-- type instantiation where we create a fresh type for each universal 
+-- variable
+substituteType :: (TypeVar, Type) -> Type -> TypeCheckMonad Type
+substituteType (tv, t) (b @ (TVar (a @ (TypeVarRef tv' cs ioref)))) = do
+    res <- readTypeRef a
+    case res of
+        Left tva -> if tv == tv' then return t else return b
+        Right t' -> substituteType (tv, t) t'
+substituteType sub (TFunction targs tr) = do
+    targs' <- mapM (substituteType sub) targs
+    tr' <- substituteType sub tr
+    return $ TFunction targs' tr'
+substituteType sub (TSeq t) = substituteType sub t >>= return . TSeq
+substituteType sub (TDot t1 t2) = do 
+    t1' <- substituteType sub t1
+    t2' <- substituteType sub t2
+    return $ TDot t1' t2'
+substituteType sub (TSet t) = substituteType sub t >>= return . TSet
+substituteType sub (TDotable t1 t2) = do
+    t1' <- substituteType sub t1
+    t2' <- substituteType sub t2
+    return $ TDotable t1' t2'
+substituteType sub (TTuple ts) = 
+    mapM (substituteType sub) ts >>= return . TTuple
+substituteType sub (TDatatype n) = return $ TDatatype n
+substituteType sub TInt = return TInt
+substituteType sub TBool = return TBool
+substituteType sub TProc = return TProc
+substituteType sub TEvent = return TEvent
+substituteType sub TEventable = return TEventable
+
+-- | Takes a type and attempts to simplify all TDots inside
+-- by combining TDotable t1 t2 and arguments.
+evaluateDots :: Type -> TypeCheckMonad Type
+evaluateDots (TVar t) = do
+    res <- readTypeRef t
+    case res of
+        Left (tv, cs) -> return $ TVar t
+        Right t       -> evaluateDots t
+evaluateDots (TSet t) = evaluateDots t >>= return . TSet
+evaluateDots (TSeq t) = evaluateDots t >>= return . TSeq
+evaluateDots (TTuple ts) = mapM evaluateDots ts >>= return . TTuple
+evaluateDots t = do
+    ts <- typeToDotList t
+    ts <- mapM (\t -> compress t >>= return . toNormalForm) ts
+    ts <- evalTypeList ts
+    return $ foldr1 TDot ts
+
+-- Assumption, argument of TDotable is always simple
+-- and that result of TDotable is either another TDotable or
+-- simple.
+evalTypeList :: [Type] -> TypeCheckMonad [Type]
+evalTypeList (t:[]) = return [t]
+evalTypeList ((TDot t1 t2):ts) = evalTypeList (t1:t2:ts)
+evalTypeList (TDotable argt rt : arg : args)
+    | isVar arg && args == [] = do
+        let (args, urt) = reduceDotable (TDotable argt rt)
+        -- Implement longest match rule
+        unify arg (foldr1 TDot args)
+        return [urt]
+    | not (isDotable arg) = do
+        -- Implement shortest match rule (if isVar ag)
+        t <- unify argt arg
+        evalTypeList (rt:args)
+    | isDotable arg = do
+        let (argsA, rtA) = reduceDotable arg
+        t <- unify argt rtA
+        evalTypeList (foldr TDotable rt argsA : args)
+-- If the first argument isn't a dotable we ignore it.
+evalTypeList (t:ts) = do
+    ts <- evalTypeList ts
+    return $ t:ts
diff --git a/src/Util/Annotated.hs b/src/Util/Annotated.hs
new file mode 100644
--- /dev/null
+++ b/src/Util/Annotated.hs
@@ -0,0 +1,133 @@
+{-# LANGUAGE FlexibleContexts, FlexibleInstances #-}
+module Util.Annotated where
+
+import Prelude
+import Util.Exception
+import Util.Prelude
+import Util.PrettyPrint
+
+data SrcLoc = 
+    SrcLoc {
+        srcLocFile :: String,
+        srcLocLine :: !Int,
+        srcLocCol :: !Int
+    }
+    | NoLoc
+    deriving Eq
+    
+instance Ord SrcLoc where
+    (SrcLoc f1 l1 c1) `compare` (SrcLoc f2 l2 c2) =
+        (f1 `compare` f2) `thenCmp` 
+        (l1 `compare` l2) `thenCmp` 
+        (c1 `compare` c2)
+    NoLoc `compare` NoLoc = EQ
+    NoLoc `compare` _ = LT
+    _ `compare` NoLoc = GT
+    
+-- From GHC
+data SrcSpan = 
+    SrcSpanOneLine { 
+        srcSpanFile :: String,
+        srcSpanLine :: !Int,
+        srcSpanSCol :: !Int,
+        srcSpanECol :: !Int
+    }
+    | SrcSpanMultiLine { 
+        srcSpanFile :: String,
+        srcSpanSLine :: !Int,
+        srcSpanSCol :: !Int,
+        srcSpanELine :: !Int,
+        srcSpanECol :: !Int
+    }
+    | SrcSpanPoint { 
+        srcSpanFile :: String,
+        srcSpanLine :: !Int,
+        srcSpanCol :: !Int
+    }
+    | Unknown
+    deriving Eq
+    
+srcSpanStart :: SrcSpan -> SrcLoc
+srcSpanStart (SrcSpanOneLine f l sc ec) = SrcLoc f l sc
+srcSpanStart (SrcSpanMultiLine f sl sc el ec) = SrcLoc f sl sc
+srcSpanStart (SrcSpanPoint f l c) = SrcLoc f l c
+srcSpanStart Unknown = NoLoc
+
+srcSpanEnd :: SrcSpan -> SrcLoc
+srcSpanEnd (SrcSpanOneLine f l sc ec) = SrcLoc f l ec
+srcSpanEnd (SrcSpanMultiLine f sl sc el ec) = SrcLoc f el ec
+srcSpanEnd (SrcSpanPoint f l c) = SrcLoc f l c
+srcSpanEnd Unknown = NoLoc
+
+-- We want to order SrcSpans first by the start point, then by the end point.
+instance Ord SrcSpan where
+    a `compare` b = 
+        (srcSpanStart a `compare` srcSpanStart b) `thenCmp` 
+        (srcSpanEnd   a `compare` srcSpanEnd   b)
+
+instance Show SrcSpan where
+    show s = show (prettyPrint s)
+
+instance PrettyPrintable SrcSpan where
+    prettyPrint (SrcSpanOneLine f sline scol1 ecol1) = 
+        text f <> colon <> int sline <> colon <> int scol1 <> char '-' <> int ecol1
+    prettyPrint (SrcSpanMultiLine f sline scol eline ecol) = 
+        text f <> colon <> int sline <> colon <> int scol
+                        <> char '-' 
+                        <> int eline <> colon <> int ecol
+    prettyPrint (SrcSpanPoint f sline scol) = 
+        text f <> colon <> int sline <> colon <> int scol
+    prettyPrint Unknown = text "<unknown location>"
+    
+combineSpans :: SrcSpan -> SrcSpan -> SrcSpan
+combineSpans s1 s2 | srcSpanFile s1 /= srcSpanFile s2 = 
+    panic "Cannot combine spans as they span files"
+combineSpans (SrcSpanOneLine f1 line1 scol1 ecol1) 
+        (SrcSpanOneLine f2 line2 scol2 ecol2) = 
+    if line1 == line2 then SrcSpanOneLine f1 line1 scol1 ecol2
+    else SrcSpanMultiLine f1 line1 scol1 line2 ecol2
+combineSpans (SrcSpanOneLine f1 sline1 scol1 ecol1) 
+        (SrcSpanMultiLine f2 sline2 scol2 eline2 ecol2) = 
+    SrcSpanMultiLine f1 sline1 scol1 eline2 ecol2
+combineSpans (SrcSpanMultiLine f1 sline1 scol1 eline1 ecol1)
+        (SrcSpanOneLine f2 eline2 scol2 ecol2) =
+    SrcSpanMultiLine f1 sline1 scol1 eline2 ecol2
+combineSpans (SrcSpanMultiLine f1 sline1 scol1 eline1 ecol1) 
+        (SrcSpanMultiLine f2 sline2 scol2 eline2 ecol2) =
+    SrcSpanMultiLine f1 sline1 scol1 eline2 ecol2
+
+data Located a = 
+    L {
+        locatedLoc :: SrcSpan,
+        locatedInner :: a 
+    }
+    
+data Annotated a b = 
+    An {
+        loc :: SrcSpan,
+        annotation :: a,
+        inner :: b
+    }
+
+dummyAnnotation :: a
+dummyAnnotation = panic "Dummy annotation evaluated"
+
+unAnnotate :: Annotated a b -> b
+unAnnotate (An _ _ b) = b
+    
+instance Show b => Show (Annotated a b) where
+    show (An _ _ b) = show b
+instance Show a => Show (Located a) where
+    show (L _ a) = show a
+
+instance (PrettyPrintable [b]) => PrettyPrintable [Annotated a b] where
+    prettyPrint ans = prettyPrint (map unAnnotate ans)
+instance (PrettyPrintable b) => PrettyPrintable (Annotated a b) where
+    prettyPrint (An loc typ inner) = prettyPrint inner
+instance (PrettyPrintable a) => PrettyPrintable (Located a) where
+    prettyPrint (L loc inner) = prettyPrint inner
+
+instance Eq b => Eq (Annotated a b) where
+    (An _ _ b1) == (An _ _ b2) = b1 == b2
+instance Eq a => Eq (Located a) where
+    (L _ b1) == (L _ b2) = b1 == b2
diff --git a/src/Util/Annotated.hs-boot b/src/Util/Annotated.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/Util/Annotated.hs-boot
@@ -0,0 +1,14 @@
+module Util.Annotated where
+
+import Util.PrettyPrint
+
+data SrcLoc
+instance Ord SrcLoc
+data SrcSpan
+instance Eq SrcSpan
+instance Ord SrcSpan
+instance Show SrcSpan
+instance PrettyPrintable SrcSpan
+combineSpans :: SrcSpan -> SrcSpan -> SrcSpan
+
+data Located a 
diff --git a/src/Util/Exception.hs b/src/Util/Exception.hs
new file mode 100644
--- /dev/null
+++ b/src/Util/Exception.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DeriveDataTypeable, TypeSynonymInstances #-}
+module Util.Exception (
+    Exception,
+    SfdrException(..),
+    throwException,
+    tryM,
+    panic, throwSourceError,
+    mkErrorMessage, mkWarningMessage, 
+    ErrorMessage, ErrorMessages,
+)
+where
+
+import Control.Exception
+import Control.Monad.State
+import Data.Typeable
+import Data.List
+import Prelude hiding (catch)
+
+import {-# SOURCE #-} Util.Annotated
+import Util.PrettyPrint
+
+type ErrorMessages = [ErrorMessage]
+
+-- | An error message that resulted from something in the user's input.
+data ErrorMessage =
+    ErrorMessage {
+        -- | Used for sorting into order
+        location :: SrcSpan,
+        -- | The message
+        message :: Doc
+    }
+    | WarningMessage {
+        -- | Used for sorting into order
+        location :: SrcSpan,
+        -- | The message
+        message :: Doc
+    }
+
+mkErrorMessage :: SrcSpan -> Doc -> ErrorMessage
+mkErrorMessage l d = ErrorMessage l d
+
+mkWarningMessage :: SrcSpan -> Doc -> ErrorMessage
+mkWarningMessage l d = WarningMessage l (text "Warning" <> colon <+> d)
+
+instance Eq ErrorMessage where
+    m1 == m2 = location m1 == location m2
+instance Ord ErrorMessage where
+    compare m1 m2 = compare (location m1) (location m2)
+
+instance PrettyPrintable ErrorMessages where
+    prettyPrint ms = vcat . punctuate (text "\n") . map prettyPrint . sort $ ms
+instance PrettyPrintable ErrorMessage where
+    prettyPrint m = 
+        hang (prettyPrint (location m) <> colon) 4 (message m)
+
+instance Show ErrorMessage where
+    show m = show (prettyPrint m)
+
+-- | Exceptions that cause Sfdr to abort whatever it is doing. 
+data SfdrException =
+    -- | An unexpected internal error
+    Panic String
+    -- | An error in the user's input occured
+    | SourceError ErrorMessages
+    -- | An error occured. Normally this is caught by the application and 
+    -- then turned into a SourceError.
+    | UserError
+    deriving Typeable
+
+instance Show SfdrException where
+    show (Panic str) = "Internal inconsitancy error: "++show str
+    show (SourceError ms) = show (prettyPrint ms)
+    show (UserError) = "An unknown error occured."
+
+instance Exception SfdrException
+
+throwSourceError :: ErrorMessages -> a
+throwSourceError = throwException . SourceError
+
+panic :: String -> a
+panic = throwException . Panic
+
+throwException :: Exception e => e -> a
+throwException = throw
+ 
+-- | A class to allow catching of SourceErrors in arbitrary monads.
+class Monad m => MonadIOException m where
+    tryM :: (MonadIOException m) => m a -> m (Either SfdrException a)
+    
+instance MonadIOException IO where
+    tryM prog = do
+        r <- try prog
+        case r of
+            Left (e@(Panic s)) -> throwException e
+            _ -> return r
+
+instance MonadIOException m => MonadIOException (StateT s m) where
+    tryM prog = 
+        StateT $ \st -> do
+            x <- tryM (runStateT prog st)
+            case x of
+                Right (a, s) -> return $ (Right a, s)
+                Left e -> return $ (Left e, st)
diff --git a/src/Util/HierarchicalMap.hs b/src/Util/HierarchicalMap.hs
new file mode 100644
--- /dev/null
+++ b/src/Util/HierarchicalMap.hs
@@ -0,0 +1,73 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+module Util.HierarchicalMap where
+
+import qualified Data.Map as M
+import Data.Typeable
+import Prelude hiding (lookup)
+import Util.Exception
+
+data Ord a => HierarchicalMap a b = 
+    HierarchicalMap [M.Map a b]
+    deriving Show
+
+data (Ord a, Show a, Typeable a) => HierarchicalMapException a = 
+    ValueNotFoundException a
+    deriving (Show, Typeable)
+
+instance (Ord a, Show a, Typeable a) => Exception (HierarchicalMapException a)
+
+-- | Creates/updates a key in the top level map.
+update :: Ord a => HierarchicalMap a b -> a -> b -> HierarchicalMap a b
+update (HierarchicalMap (m:ms)) k v = 
+    HierarchicalMap ((M.insert k v m):ms)
+
+updateMulti :: Ord a => HierarchicalMap a b -> [(a, b)] -> HierarchicalMap a b
+updateMulti m bs = 
+    foldl (\ m (a,b) -> update m a b) m bs
+
+-- | Looks up a key in any map, starting from the top
+lookup :: (Show k, Typeable k, Ord k) => HierarchicalMap k a -> k -> a
+lookup hm k = case maybeLookup hm k of
+    Just v -> v
+    Nothing -> throwException (ValueNotFoundException k)
+
+maybeLookup :: (Show k, Typeable k, Ord k) => HierarchicalMap k a -> k -> Maybe a
+maybeLookup (HierarchicalMap []) k = Nothing
+maybeLookup (HierarchicalMap (m:ms)) k = 
+    case M.lookup k m of
+        Just v -> Just v
+        Nothing -> maybeLookup (HierarchicalMap ms) k
+
+maybeLookupInTopLayer :: (Show k, Typeable k, Ord k) => HierarchicalMap k a -> k -> Maybe a
+maybeLookupInTopLayer (HierarchicalMap []) k = Nothing
+maybeLookupInTopLayer (HierarchicalMap (m:ms)) k = M.lookup k m
+
+popLayer :: Ord a => HierarchicalMap a b -> HierarchicalMap a b
+popLayer (HierarchicalMap (m:ms)) = HierarchicalMap ms
+
+flatten :: Ord a => HierarchicalMap a b -> [(a, b)]
+flatten (HierarchicalMap ms) = h ms []
+    where
+        h [] _ = []
+        h (m:ms) ks = l++(h ms ks')
+            where
+                l = [(k, v) | (k, v) <- M.toList m, not (k `elem` ks)]
+                ks' = map fst l++ks
+
+newLayer :: Ord a => HierarchicalMap a b -> HierarchicalMap a b
+newLayer (HierarchicalMap ms) = HierarchicalMap (M.empty : ms)
+
+newLayerAndBind :: Ord a => HierarchicalMap a b -> [(a, b)] -> HierarchicalMap a b
+newLayerAndBind (HierarchicalMap ms) bs = 
+    HierarchicalMap (M.fromList bs : ms)
+
+newRecursiveLayerAndBind :: Ord a => 
+    HierarchicalMap a b -> [HierarchicalMap a b -> (a, b)] -> HierarchicalMap a b
+newRecursiveLayerAndBind map bs = newMap
+    where
+        bs' = [f newMap | f <- bs]
+        newMap = newLayerAndBind map bs'
+
+-- | Creates a new map
+new :: Ord a => HierarchicalMap a b
+new = HierarchicalMap [M.empty]
diff --git a/src/Util/List.hs b/src/Util/List.hs
new file mode 100644
--- /dev/null
+++ b/src/Util/List.hs
@@ -0,0 +1,7 @@
+module Util.List where
+import Data.List
+
+-- TODO: speed up
+-- | Returns true iff the list has no duplicates.
+noDups :: Eq a => [a] -> Bool
+noDups xs = nub xs == xs
diff --git a/src/Util/Monad.hs b/src/Util/Monad.hs
new file mode 100644
--- /dev/null
+++ b/src/Util/Monad.hs
@@ -0,0 +1,6 @@
+module Util.Monad where
+
+import Control.Monad
+
+concatMapM :: (Monad m) => (a -> m [b]) -> [a] -> m [b]
+concatMapM f xs = liftM concat (mapM f xs)
diff --git a/src/Util/PartialFunctions.hs b/src/Util/PartialFunctions.hs
new file mode 100644
--- /dev/null
+++ b/src/Util/PartialFunctions.hs
@@ -0,0 +1,60 @@
+module Util.PartialFunctions where
+
+import Data.List (nub)
+
+import Util.Exception
+
+-- *********************************************************************
+-- Partial functions
+-- *********************************************************************
+type PartialFunction a b = [(a,b)] -- From a to b
+
+functionDomain :: Eq a => PartialFunction a b -> [a]
+functionDomain f = map fst f
+
+functionImage :: Eq a => PartialFunction a b -> [b]
+functionImage f = map snd f
+
+identityFunction :: Eq a => [a] -> PartialFunction a a
+identityFunction xs = [(x,x) | x <- xs]
+
+invert :: (Eq a, Eq b) => PartialFunction a b -> PartialFunction b a
+invert f = [(a,b) | (b,a) <- f]
+
+apply :: Eq a => PartialFunction a b -> a -> b
+apply f x =
+    let
+        pos = [b | (a,b) <- f, a == x]
+    in
+        if length pos == 0 then 
+            panic ("Partial function applied to value outside of domain")
+        else head pos
+        
+applyRelation :: Eq a => PartialFunction a b -> a -> [b]
+applyRelation f x = [b | (a,b) <- f, a == x]
+
+safeApply :: Eq a => PartialFunction a b -> a -> Maybe b
+safeApply f x =
+    let
+        pos = [b | (a,b) <- f, a == x]
+    in
+        if length pos == 0 then Nothing
+        else Just (head pos)
+
+composeFunctions :: 
+    (Eq a, Eq b) => PartialFunction b c -> PartialFunction a b -> 
+                    PartialFunction a c
+composeFunctions f g = 
+    [(a, apply f b) | (a,b) <- g]
+
+mapPF :: Eq a => PartialFunction a b -> [a] -> [b]
+mapPF f xs = [apply f x | x <- xs]
+
+safeMapPF :: Eq a => PartialFunction a b -> [a] -> [b]
+safeMapPF f xs = [x | Just x <- [safeApply f x | x <- xs]]
+
+updatePF :: Eq a => PartialFunction a b -> a -> b -> PartialFunction a b
+updatePF f a b = (a,b):[(c,d) | (c,d) <- f, c /= a]
+
+removeEntry :: Eq a => PartialFunction a b -> a -> PartialFunction a b
+removeEntry f a = [(c,d) | (c,d) <- f, c /= a]
diff --git a/src/Util/Prelude.hs b/src/Util/Prelude.hs
new file mode 100644
--- /dev/null
+++ b/src/Util/Prelude.hs
@@ -0,0 +1,28 @@
+module Util.Prelude where
+
+import Data.Char
+import Prelude
+import System.Directory
+import System.FilePath
+
+-- | Given two orderings, returns the second if the first is 
+-- `EQ` and returns the first otherwise.
+thenCmp :: Ordering -> Ordering -> Ordering
+thenCmp EQ x = x
+thenCmp x _ = x
+
+-- | Given a file path, if the first character is a ~ then
+-- expands the ~ to the users' home directory.
+expandPathIO :: String -> IO String
+expandPathIO ('~':'/':d) = do
+    tilde <- getHomeDirectory -- will fail if HOME not defined
+    return $ joinPath [tilde, d]
+expandPathIO other = return other
+
+-- | Remove whitespace from the beginning and end of a string.
+trim :: String -> String
+trim = f . f where f = reverse . dropWhile isSpace
+
+-- | Compute the cartesian product of a list of lists.
+cartProduct :: [[a]] -> [[a]]
+cartProduct = sequence
diff --git a/src/Util/PrettyPrint.hs b/src/Util/PrettyPrint.hs
new file mode 100644
--- /dev/null
+++ b/src/Util/PrettyPrint.hs
@@ -0,0 +1,57 @@
+module Util.PrettyPrint (
+    module Text.PrettyPrint.HughesPJ,
+    PrettyPrintable (prettyPrint),
+    tabWidth,
+    tabIndent,
+    angles, bars, list, dotSep,
+    speakNth
+)
+where 
+
+import Text.PrettyPrint.HughesPJ
+
+class PrettyPrintable a where
+    prettyPrint :: a -> Doc
+
+-- | The width, in spaces, of a tab character.
+tabWidth :: Int    
+tabWidth = 4
+
+-- | Indent a document by `tabWidth` characters, on each line
+-- (uses `nest`).
+tabIndent :: Doc -> Doc
+tabIndent = nest tabWidth
+
+-- | Surrounds a `Doc` with '<' and '>'.
+angles :: Doc -> Doc
+angles d = char '<' <> d <> char '>'
+
+-- | Surrounds a `Doc` with '|'.
+bars :: Doc -> Doc
+bars d = char '|' <> d <> char '|'
+
+-- | Separates a list of `Doc`s by '.'.
+dotSep :: [Doc] -> Doc
+dotSep docs = fcat (punctuate (text ".") docs)
+
+-- | Separates a list of `Doc`s by ','.
+list :: [Doc] -> Doc
+list docs = fsep (punctuate (text ",") docs)
+
+-- | Converts a number into 'first', 'second' etc.
+speakNth :: Int -> Doc
+speakNth 1 = text "first"
+speakNth 2 = text "second"
+speakNth 3 = text "third"
+speakNth 4 = text "fourth"
+speakNth 5 = text "fifth"
+speakNth 6 = text "sixth"
+speakNth n = hcat [ int n, text suffix ]
+    where
+    suffix 
+        | n <= 20       = "th"  -- 11,12,13 are non-std
+        | last_dig == 1 = "st"
+        | last_dig == 2 = "nd"
+        | last_dig == 3 = "rd"
+        | otherwise     = "th"
+    last_dig = n `rem` 10
diff --git a/tests/Main.hs b/tests/Main.hs
new file mode 100644
--- /dev/null
+++ b/tests/Main.hs
@@ -0,0 +1,114 @@
+module Main where
+
+import System.Directory
+import System.Exit (exitFailure, exitSuccess)
+import System.FilePath
+
+import CSPM
+import Monad
+import Util.Exception
+import Util.PrettyPrint
+
+data RunResult = 
+    ErrorOccured
+    | WarningsEmitted
+    | PassedNoWarnings
+    deriving Eq
+        
+main :: IO ()
+main = do
+    tests <- runSections
+    results <- sequence tests
+    let
+        failureCount = length results - successCount
+        successCount = length (filter id results)
+    putStrLn $ show $ 
+        int failureCount <+> text "failures" 
+        <+> int successCount <+> text "passes"
+    if failureCount == 0 then exitSuccess else exitFailure
+
+getAndFilterDirectoryContents :: FilePath -> IO [FilePath]
+getAndFilterDirectoryContents fp = do
+    b <- doesDirectoryExist fp
+    if not b then return [] else do
+        names <- getDirectoryContents fp
+        return $ filter (`notElem` [".", "..", ".DS_Store"]) names
+
+runSections ::IO [IO Bool]
+runSections = do
+    let testDir = "tests"
+    sections <- getAndFilterDirectoryContents testDir
+    fs <- mapM (\section -> do
+            shouldPassFiles <- getAndFilterDirectoryContents $ 
+                                joinPath [testDir, section, "should_pass"]
+            shouldFailFiles <- getAndFilterDirectoryContents $ 
+                                joinPath [testDir, section, "should_fail"]
+            shouldWarnFiles <- getAndFilterDirectoryContents $
+                                joinPath [testDir, section, "should_warn"]
+            let 
+                Just test = lookup section testFunctions
+                pf = [runTest (joinPath [testDir, section, "should_pass", f]) 
+                        test PassedNoWarnings | f <- shouldPassFiles]
+                ff = [runTest (joinPath [testDir, section, "should_fail", f]) 
+                        test ErrorOccured | f <- shouldFailFiles]
+                wf = [runTest (joinPath [testDir, section, "should_warn", f]) 
+                        test WarningsEmitted | f <- shouldWarnFiles]
+            return $ pf++ff++wf
+        ) sections
+    return $ concat fs
+
+runTest :: FilePath -> (FilePath -> Test a) -> RunResult -> IO Bool
+runTest fp test expectedResult = do
+    putStr $ "Running test "++fp++"..."
+    s <- initTestState
+    res <- tryM $ runTestM s $ do
+        test fp
+        getState lastWarnings
+    let
+        failed :: Maybe Doc -> IO Bool
+        failed (Just e) = do
+            putStrLn "FAILED"
+            putStrLn $ show e
+            return False
+        failed Nothing = do
+            putStrLn "FAILED"
+            return False
+        passed = do
+            putStrLn "Passed"
+            return True
+        
+        shouldPass = expectedResult == PassedNoWarnings
+        shouldFail = expectedResult == ErrorOccured
+        shouldWarn = expectedResult == WarningsEmitted
+    case res of 
+        Left (SourceError e) -> if shouldFail then passed else failed (Just (prettyPrint e))
+        Right [] -> if shouldPass then passed else failed Nothing
+        Right ws -> if shouldWarn then passed else failed (Just (prettyPrint ws))
+        _ -> failed (Just (text "Internal Error"))
+
+testFunctions = [
+        ("parser", parserTest),
+        ("typechecker", typeCheckerTest),
+        ("prettyprinter", prettyPrinterTest)
+    ]
+
+typeCheckerTest :: FilePath -> Test ()
+typeCheckerTest fp = do
+    ms <- parseFile fp
+    typeCheckFile ms
+    return ()
+
+parserTest :: FilePath -> Test ()
+parserTest fp = do
+    ms <- parseFile fp
+    -- Force evaluation of the whole of ms. We can't just use seq
+    -- as this would leave thunks in the data structure. Instead we take
+    -- the length of the string representing ms and then compute the length
+    (length (show ms)) `seq` (return ())
+
+prettyPrinterTest :: FilePath -> Test ()
+prettyPrinterTest fp = do
+    ms <- parseFile fp
+    let str = show (prettyPrint ms)
+    ms' <- parseStringAsFile str
+    if ms /= ms' then throwException UserError else return ()
