packages feed

libcspm (empty) → 0.1

raw patch · 60 files changed

+9404/−0 lines, 60 filesdep +arraydep +basedep +containerssetup-changed

Dependencies added: array, base, containers, directory, filepath, graph-wrapper, libcspm, mtl, pretty

Files

+ LICENSE.txt view
@@ -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.+
+ README.md view
@@ -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).
+ Setup.hs view
@@ -0,0 +1,4 @@+#! /usr/bin/env runhaskell++import Distribution.Simple+main = defaultMain
+ dist/build/CSPM/Parser/Lexer.hs view
@@ -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
+ libcspm.cabal view
@@ -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
+ src/CSPM.hs view
@@ -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)
+ src/CSPM/Compiler/Events.hs view
@@ -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)))
+ src/CSPM/Compiler/Map.hs view
@@ -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
+ src/CSPM/Compiler/Processes.hs view
@@ -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)
+ src/CSPM/Compiler/Set.hs view
@@ -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 #-}
+ src/CSPM/DataStructures/Names.hs view
@@ -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)
+ src/CSPM/DataStructures/Syntax.hs view
@@ -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)
+ src/CSPM/DataStructures/Tokens.hs view
@@ -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"
+ src/CSPM/DataStructures/Types.hs view
@@ -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 = []
+ src/CSPM/Desugar.hs view
@@ -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
+ src/CSPM/Evaluator.hs view
@@ -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
+ src/CSPM/Evaluator/BuiltInFunctions.hs view
@@ -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
+ src/CSPM/Evaluator/DeclBind.hs view
@@ -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]
+ src/CSPM/Evaluator/Environment.hs view
@@ -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
+ src/CSPM/Evaluator/Exceptions.hs view
@@ -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)
+ src/CSPM/Evaluator/Expr.hs view
@@ -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
+ src/CSPM/Evaluator/Expr.hs-boot view
@@ -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+
+ src/CSPM/Evaluator/Module.hs view
@@ -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
+ src/CSPM/Evaluator/Monad.hs view
@@ -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]
+ src/CSPM/Evaluator/PatBind.hs view
@@ -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))
+ src/CSPM/Evaluator/ValueSet.hs view
@@ -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
+ src/CSPM/Evaluator/ValueSet.hs-boot view
@@ -0,0 +1,9 @@+module CSPM.Evaluator.ValueSet where++import Util.PrettyPrint++data ValueSet++instance Eq ValueSet+instance Ord ValueSet+instance PrettyPrintable ValueSet
+ src/CSPM/Evaluator/Values.hs view
@@ -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))
+ src/CSPM/Evaluator/Values.hs-boot view
@@ -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
+ src/CSPM/Parser.hs view
@@ -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)]
+ src/CSPM/Parser/Exceptions.hs view
@@ -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)
+ src/CSPM/Parser/Lexer.x view
@@ -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++}
+ src/CSPM/Parser/Monad.hs view
@@ -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 })
+ src/CSPM/Parser/Parser.hs view
@@ -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.
+ src/CSPM/PrettyPrinter.hs view
@@ -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]
+ src/CSPM/TypeChecker.hs view
@@ -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
+ src/CSPM/TypeChecker/BuiltInFunctions.hs view
@@ -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
+ src/CSPM/TypeChecker/Common.hs view
@@ -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+
+ src/CSPM/TypeChecker/Compressor.hs view
@@ -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
+ src/CSPM/TypeChecker/Decl.hs view
@@ -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
+ src/CSPM/TypeChecker/Decl.hs-boot view
@@ -0,0 +1,7 @@+module CSPM.TypeChecker.Decl where++import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Types+import CSPM.TypeChecker.Monad++typeCheckDecls :: [PDecl] -> TypeCheckMonad ()
+ src/CSPM/TypeChecker/Dependencies.hs view
@@ -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 []
+ src/CSPM/TypeChecker/Environment.hs view
@@ -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
+ src/CSPM/TypeChecker/Exceptions.hs view
@@ -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."
+ src/CSPM/TypeChecker/Expr.hs view
@@ -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
+ src/CSPM/TypeChecker/InteractiveStmt.hs view
@@ -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 ()
+ src/CSPM/TypeChecker/Module.hs view
@@ -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
+ src/CSPM/TypeChecker/Monad.hs view
@@ -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
+ src/CSPM/TypeChecker/Pat.hs view
@@ -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'
+ src/CSPM/TypeChecker/Unification.hs view
@@ -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
+ src/Util/Annotated.hs view
@@ -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
+ src/Util/Annotated.hs-boot view
@@ -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 
+ src/Util/Exception.hs view
@@ -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)
+ src/Util/HierarchicalMap.hs view
@@ -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]
+ src/Util/List.hs view
@@ -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
+ src/Util/Monad.hs view
@@ -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)
+ src/Util/PartialFunctions.hs view
@@ -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]
+ src/Util/Prelude.hs view
@@ -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
+ src/Util/PrettyPrint.hs view
@@ -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
+ tests/Main.hs view
@@ -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 ()